并非有效的市场

安德瑞·史莱佛撰写 《并非有效的金融市场》 的核心目的在于对传统金融领域的 有效市场假说 (EMH)提出系统性批判。史 莱佛通过大量实证研究与逻辑推演,打破了金融市场是完全理性、信息充分且价格能即时反映所有有效信息的经典认知,本书的议题围绕市场无效性的根源表现形式对投资实践的启示展开,为我们理解金融市场的复杂性、非理性提供了全新视角,尤其对主动投资策略的合理性提供了理论支撑。

本书并非全盘否定金融市场的合理性,而是指出有效市场只是理论抽象的理想状态,现实市场中存在诸多扭曲价格的因素,这些因素共同构成了市场无效的基础,也为投资者创造了获取超额收益的可能。

对“有效市场假说”的批判

有效市场假说的核心逻辑是:市场参与者是完全理性的,信息能无成本、即时地被所有参与者获取,因此资产价格始终等于其内在价值,投资者无法通过主动分析获得超额收益。

史莱佛从三个维度对这一假说提出反驳:

1.市场参与者并非完全理性——非理性行为的普遍性

史莱佛结合行为金融学的研究成果,指出现实中的投资者普遍存在“有限理性”特征,而非经典理论中的“完全理性人”。投 资者的决策往往受到情绪、认知偏差、从众心理等因素影响,而非纯粹基于对信息的客观分析。

书中列举的典型非理性行为包括:锚定效应(以某一初始价格为基准判断资产价值,忽视真实基本面)、羊群效应(盲目跟随大众投资决策,导致市场过度反应)、过度自信(高估自身分析能力,导致频繁交易与决策失误)。

这些非理性行为并非个别现象,而是形成了群体合力,最终导致资产价格偏离内在价值,形成市场泡沫或过度下跌。

2.信息存在不对称与传递成本——信息并非完全充分

有效市场假说假设“信息免费且即时共享”,但现实中信息存在显著的不对称性:内部人(如企业管理层、核心机构投资者)往往掌握比普通投资者更全面、准确的信息,且信息传递过程中存在时间差、解读成本等问题。普通投资者不仅难以第一时间获取信息,还可能因专业能力不足对信息产生误读。

通过实证数据证明,信息不对称会导致资产价格对信息的反应滞后或过度:部分机构利用信息优势提前布局,待信息公开后获利离场,而普通投资者则可能在价格波动的末端跟风,成为损失的承担者。这 种信息壁垒直接打破了“价格即时反映所有信息”的有效市场前提。

3.市场存在交易成本与制度缺陷——价格无法即时调整至合理水平

有效市场假说忽略了交易成本(如手续费、税费、流动性成本)与制度设计对市场的影响。现 实中,即使投资者发现了价格与价值的偏离,也可能因交易成本过高、市场流动性不足或制度限制(如做空机制不完善)而无法及时通过交易修正价格,导致价格扭曲长期存在。

此外,制度缺陷还可能引发“非理性的市场定价”,例如退市机制不健全导致劣质资产长期占据市场资源,政策干预的不确定性引发市场恐慌或盲目乐观,这些因素都让市场难以自发达到“有效均衡”。

市场无效性的典型表现与案例佐证

史莱佛通过多个经典金融市场案例,直观呈现了市场无效性的具体表现,其中最具代表性的包括:

1.股市泡沫与崩盘:非理性情绪驱动的价格偏离

书中详细分析了互联网泡沫(20世纪90年代末)、美国次贷危机前的房地产泡沫等案例。以互联网泡沫为例,当时大量缺乏盈利支撑、甚至没有明确商业模式的互联网企业,股价被疯狂炒作,市盈率远超合理水平,这并非基于企业内在价值的理性定价,而是源于“对新技术的盲目乐观”“从众投机”等非理性情绪的叠加。最终泡沫破裂,股价暴跌,证明市场价格并未反映资产的真实价值。

2.小盘股效应与价值股效应:被忽视的定价偏差

史莱佛通过长期数据追踪发现,小盘股(市值较小的公司股票)和价值股(市盈率低、市净率低的股票)在长期内的收益率显著高于大盘股和成长股,这一现象无法用有效市场假说解释——若市场有效,这种收益率差异应通过套利行为迅速消失。

史莱佛认为,小盘股被忽视是因为机构投资者因资金规模限制不愿关注,价值股被低估则是因为投资者过度追捧成长股的“美好预期”,忽视了价值股的真实盈利能力。这种定价偏差的长期存在,直接证明了市场的无效性。

3.金融衍生品市场的定价扭曲:复杂工具加剧市场无效

在金融衍生品(如期权、CDO等)市场,史莱佛指出,由于产品结构复杂,投资者难以准确评估其内在价值,往往依赖简化的定价模型(如布莱克-斯科尔斯模型),而这些模型的前提假设(如无风险利率恒定、波动率稳定)与现实市场存在差异,导致衍生品定价出现严重偏差。次贷危机中,CDO等衍生品的错误定价就是引发危机的重要原因之一,凸显了复杂市场中无效性的放大效应。

书籍带来的投资启示与实践建议

基于对市场无效性的论证,史莱佛并非倡导“盲目投机”,而是为投资者提供了基于“市场无效”的投资逻辑,核心启示包括:

1.主动投资策略具有合理性,精选价值是核心

既然市场存在定价偏差,投资者就可以通过深入分析企业基本面(如盈利能力、资产负债表、行业竞争力),发现被低估的资产,通过长期持有获取超额收益。这与有效市场假说倡导的“被动指数投资”形成鲜明对比,为主动管理型基金的存在提供了理论依据。

2.警惕非理性情绪,坚持逆向投资

市场无效的核心驱动力之一是群体非理性,因此投资者应避免跟风从众,在市场过度乐观(泡沫期)保持冷静,在市场过度悲观(恐慌期)积极寻找被错杀的优质资产。逆向投资的本质,就是利用市场的非理性偏差获利。

3.重视信息优势与研究能力,降低信息不对称风险

对普通投资者而言,应通过提升专业能力、深入研究行业与企业,减少对“二手信息”的依赖,尽可能降低信息不对称带来的劣势;同时,要警惕“内幕信息”陷阱,坚守合规投资的底线。

4.合理评估交易成本与流动性,避免盲目套利

即使发现了价格偏差,也需评估交易成本、流动性等因素——若套利成本过高或无法及时变现,定价偏差可能长期存在,甚至导致套利失败。因此,投资决策需综合考虑“价值偏差”与“实现收益的可行性”。

5.投资者形态模型简单分析与适配建议

书籍虽未直接提出“投资者形态模型”,但结合其对市场参与者非理性行为的分析,可提炼出三类核心投资者形态及适配策略:一是“理性套利型”,这类投资者具备专业研究能力,能精准识别价格与价值的偏离,可通过前文提及的主动价值投资策略获利,但需规避交易成本过高、流动性不足的套利陷阱;二是“噪声交易型”,这类投资者易受情绪、短期信息影响,是市场无效性的主要推动者,需警惕自身的认知偏差,通过建立长期投资框架、减少频繁交易规避损失;三是“被动跟随型”,这类投资者缺乏专业分析能力,若盲目跟随市场情绪易成为损失承担者,可在理解市场无效性的基础上,选择兼顾主动筛选与风险分散的投资产品,而非单纯被动跟踪指数。简 言之,投资者需先明确自身形态特征,再结合市场无效性规律制定适配策略,才能降低非理性决策带来的风险。

投资者心态模型分析

结合《并非有效的金融市场》对市场参与者有限理性的核心论述,可提炼出三类与市场无效性紧密相关的投资者心态模型,这些心态是导致资产价格偏离内在价值的关键心理动因,也为理解投资决策偏差提供了核心视角:

1.贪婪与恐惧驱动的情绪主导心态

这是书中重点强调的非理性心态核心,也是市场泡沫与恐慌形成的主要推手。在贪婪心态主导下,投资者会过度关注短期收益,忽视资产基本面的真实价值,如互联网泡沫时期对新技术企业的盲目追捧、比特币等虚拟资产的投机热潮,均是贪婪心态引发的“追涨”行为;而在恐惧心态主导下,投资者会因市场短期波动、负面信息过度反应,出现“割肉出逃”的非理性抛售,导致资产价格被过度低估,例如次贷危机中优质企业股票随市场整体暴跌的现象。这种心态的本质是“短期情绪凌驾于长期价值判断”,打破了有效市场假说中“理性定价”的前提。

2.过度自信的认知偏差心态

书中明确指出,过度自信是多数投资者的共性心态,也是导致频繁交易、决策失误的重要原因。这类心态模型的核心特征是投资者高估自身的信息解读能力、择时能力和风险控制能力,认为自己能超越市场平均水平。例如,部分投资者仅凭碎片化信息就做出投资决策,忽视市场的复杂性和信息的不完整性;还有些投资者频繁调整持仓,认为能精准把握市场波动,最终却因交易成本增加、决策失误导致收益受损。过度自信心态会放大个体非理性行为,进而形成群体层面的定价偏差,加剧市场无效性。

3.锚定与从众的惯性依赖心态

锚定心态与从众心态常相互交织,共同影响投资者决策。锚定心态表现为投资者将某一初始信息(如历史最高价、近期平均价、权威机构的预测值)作为“锚点”,固化对资产价值的判断,忽视后续基本面的变化,例如投资者因某只股票历史最高价较高,就认为当前价格仍“有上涨空间”,无视企业盈利下滑的现实;从众心态则是投资者盲目跟随大众决策,认为“多数人的选择一定正确”,这种心态会形成“羊群效应”,导致市场价格向同一方向过度偏离,如某类主题基金的扎堆申购、某只股票的集中炒作,均是从众心态的体现。这 两种心态的核心是“放弃独立思考,依赖外部信号或群体共识”,进一步强化了市场的无效性。

从实践意义来看,识别这些心态模型是规避投资失误的关键。书中隐含的应对逻辑是:投资者需建立“心态自检机制”,在决策前区分“情绪驱动”与“价值驱动”,通过长期投资框架、基本面分析工具对冲心态偏差,同时警惕锚定信息的局限性和群体决策的盲目性,避免成为加剧市场无效性的“噪声交易者”。

4.投资者心态模型的转换路径与实践要点

基于书中对投资者非理性行为的批判,心态模型并非固定不变,从非理性心态向理性心态的转换,是降低投资决策偏差、利用市场无效性获利的核心前提。具体转换路径可分为三个核心阶段:

第一阶段:心态觉醒与偏差识别。这是转换的基础,核心是投资者主动意识到自身的心态局限。可通过“决策复盘”实现:每次投资决策后,记录决策时的核心依据、情绪状态(如是否受市场热点、他人建议影响),对照前文三类非理性心态模型,标注是否存在情绪主导、过度自信或锚定从众的倾向。例如,若某笔投资是因“看到身边人都在买”而跟风,即可明确识别为“从众心态”,为后续修正提供靶向。

第二阶段:工具对冲与行为约束。针对识别出的心态偏差,借助具体工具建立行为边界,避免非理性情绪主导决策。对应不同心态的对冲工具的:针对“情绪主导心态”,可建立“止损/止盈规则”和“冷静期机制”,如遇到市场剧烈波动时,强制暂停交易24小时再决策;针对“过度自信心态”,可采用“组合投资策略”,通过分散投资降低对自身“择时/选股能力”的过度依赖,同时限制单只资产的持仓比例;针对“锚定从众心态”,可建立“基本面分析清单”,将资产的盈利能力、估值水平等核心指标作为决策核心,而非依赖历史价格、群体共识等锚点信息。

第三阶段:长期强化与习惯养成。心态转换的关键是形成稳定的理性决策习惯,而非单次修正。可 通过“长期投资目标锚定”实现:明确自身的投资周期(如3年、5年)和核心目标(如资产保值、子女教育储备),将短期市场波动与长期目标脱钩,减少因短期情绪波动导致的非理性操作。同时,定期更新对市场无效性的认知,结合书中的案例与实证研究,强化“理性定价优于情绪定价”的认知,逐步弱化非理性心态的影响。

需要注意的是,心态模型转换并非“完全摒弃情绪”,而是实现“情绪可控、理性主导”的平衡。书 中强调,现实中的投资者难以达到绝对理性,但通过持续的觉醒、对冲与强化,可无限接近理性心态,进而在市场无效性中找到精准的投资机会。

个人感悟与思考

读完《并非有效的市场》,更坚定我对“市场并非完全有效”的认知,理解了金融市场的本质是“理性与非理性的交织体”。有 效市场假说作为简化的理论模型,为我们理解市场提供了基准,但现实市场的复杂性远超出理论范畴,这也正是金融市场的魅力所在。

对个人投资者而言,这本书的启示在于:不要盲目相信“市场永远正确”,也不要过度自信于自己的“择时能力”。真 正有效的投资,应该是“基于基本面的价值判断”与“对市场情绪的理性规避”相结合——既通过深入研究发现价值,又通过逆向思维避开泡沫。同时,这本书也提醒我们,金融市场的稳定需要完善的制度设计(如信息披露制度、退市机制、做空机制)来降低无效性,保护普通投资者的利益。

此外,书中的观点也并非绝对,市场无效与相对有效之间可能存在动态平衡:在某些成熟市场、某些时段,市场可能接近有效;而在新兴市场、市场剧烈波动期,无效性则更为显著。因此,投资者需要根据具体市场环境灵活调整投资策略,而非机械套用某一理论。

总结

《并非有效的市场》通过对有效市场假说的系统性批判,揭示了金融市场的无效性本质,其核心观点在于:市场参与者的有限理性、信息不对称、交易成本与制度缺陷,共同导致资产价格偏离内在价值,市场无法自发达到有效均衡。

协整理论与配对交易策略分析

摘要

本文通过实证分析展示了协整理论在配对交易策略中的应用。利用Quantmod包获取金融时间 序列数据,结合tseries和urca等统计分析工具,我们识别了具有协整关系的股票对,并构建 了基于误差修正模型的配对交易策略。回测结果表明,该策略在样本内和样本外均表现出稳 定的超额收益,验证了协整理论在配对交易中的有效性。研究还分析了策略参数对表现的影 响,为实际应用提供了参考。

引言

协整理论概述

协整理论是现代计量经济学的重要发展,由Engle和Granger(1987)提出,为非平稳时间序列 分析提供了新的方法。如果两个或多个非平稳时间序列的线性组合是平稳的,则称这些序列 存在协整关系。协整关系反映了变量之间的长期均衡关系,即使短期内可能偏离这种均衡, 但长期来看会趋向于回归均衡状态。

在金融市场中,许多资产价格序列表现出非平稳性(通常为I(1)过程),但某些资产对之间 可能存在协整关系。这种协整关系为配对交易策略提供了理论基础。

配对交易策略

配对交易是一种市场中性策略,通过同时买入一只被低估的股票和卖出一只被高估的股票, 从两者价格回归均衡的过程中获利。传统的配对交易策略通常基于统计套利思想,寻找价格 走势相似的股票对。而基于协整理论的配对交易则更进一步,不仅要求价格走势相似,还要 求存在长期稳定的均衡关系。

配对交易策略的优势在于: - 市场中性:不受整体市场涨跌影响 - 风险分散:同时持有多头和空头头寸 - 统计基础:基于严格的统计理论 - 可量化:策略参数和交易信号明确

本文将通过实证分析,展示如何应用协整理论构建和评估配对交易策略。

理论基础

单位根检验

在进行协整分析之前,需要先检验时间序列是否存在单位根,即是否为非平稳序列。常用的 单位根检验方法包括:

ADF检验(增广迪基-富勒检验)

ADF检验的原假设为序列存在单位根(非平稳),备择假设为序列不存在单位根(平稳)。检 验统计量为:

$$ \Delta y_{t} = \alpha + \beta t + \gamma y_{t-1} + \sum_{i=1}^{p} \delta_{i} \Delta y_{t-i} + \varepsilon_{t} $$

其中,γ = 0 表示存在单位根。

KPSS检验(Kwiatkowski-Phillips-Schmidt-Shin检验)

KPSS检验与ADF检验相反,其原假设为序列是平稳的,备择假设为序列存在单位根。

协整检验

在确认两个序列均为非平稳序列后,需要检验它们是否存在协整关系。常用的协整检验方法 包括:

Engle-Granger两步法

Engle-Granger两步法的步骤如下: 1. 对两个非平稳序列进行线性回归:yt = α + β**xt + εt 2. 检验回归残差序列ε̂t 是否平稳 3. 如果残差序列平稳,则两个序列存在协整关系

马克维茨投资组合理论的有效性分析

摘要

本文通过实证分析验证了马克维兹现代投资组合理论(MPT)的有效性。利用Quantmod包获取市场数据,结合PortfolioAnalytics和PerformanceAnalytics等工具,构建了多个资产的有效前沿,并分析了不同风险偏好下的最优投资组合配置。研究结果表明,通过分散投资和优化资产权重,马克维兹投资组合能够在相同风险水平下获得更高收益,或在相同收益水平下承担更低风险,充分体现了多元化投资的价值。

引言

现代投资组合理论(Modern Portfolio Theory, MPT)由Harry Markowitz于1952年提出,是金融学领域的重要突破。该理论通过数学模型证明了投资者可以通过资产组合的选择,在风险和收益之间找到最佳平衡点,实现投资组合的最优化。本文将通过R语言实现马克维兹投资组合理论的核心思想,并通过实证分析验证其有效性。

理论背景

马克维兹投资组合理论的核心假设是投资者是风险厌恶的,他们在追求最大收益的同时也希望最小化风险。该理论通过以下几个关键概念来实现投资组合的优化:

  1. 风险与收益的权衡:投资组合的预期收益是各资产预期收益的加权平均,而风险则由资产间的协方差决定。
  2. 有效前沿:在给定风险水平下能够提供最高预期收益的投资组合集合,或者在给定预期收益下风险最小的投资组合集合。
  3. 最优投资组合:结合投资者的风险偏好,在有效前沿上选择最适合的投资组合。

数据获取与预处理

加载必要的R包

首先加载本文分析所需的R包:

# 加载必要的R包
library(quantmod)      # 获取金融数据
library(PortfolioAnalytics)  # 投资组合分析
library(PerformanceAnalytics)  # 绩效分析
library(ggplot2)       # 数据可视化
library(dplyr)         # 数据处理
library(scales)        # 数据转换

数据获取

我们将选择几只具有代表性的美国股票作为分析对象,包括科技股、金融股和消费品股,时间范围设定为过去5年:

# 定义股票代码
tickers <- c("AAPL", "MSFT", "JPM", "PG", "XOM")

# 设置时间范围
start_date <- "2018-01-01"
end_date <- "2023-01-01"

# 创建一个空列表存储股票数据
stock_data <- list()

# 获取每只股票的价格数据
for(ticker in tickers) {
  stock_data[[ticker]] <- getSymbols(ticker, 
                                     from = start_date, 
                                     to = end_date, 
                                     auto.assign = FALSE)
}

# 查看数据结构
str(stock_data[[1]])
## An xts object on 2018-01-02 / 2022-12-30 containing: 
##   Data:    double [1259, 6]
##   Columns: AAPL.Open, AAPL.High, AAPL.Low, AAPL.Close, AAPL.Volume ... with 1 more column
##   Index:   Date [1259] (TZ: "UTC")
##   xts Attributes:
##     $ src    : chr "yahoo"
##     $ updated: POSIXct[1:1], format: "2025-07-02 17:40:27"

数据预处理

将获取的原始价格数据转换为日收益率,并合并为一个数据框:

KDJ指标择时交易策略分析

引言

技术分析是金融市场中常用的分析方法,其中KDJ指标是一种重要的随机指标,能够反映价格波动的强弱、超买超卖现象以及市场趋势变化。本研究旨在通过R语言实现基于KDJ指标的股票择时交易策略,并通过历史数据回测寻找最佳参数组合。

研究方法

数据获取与处理

我们将使用quantmod包获取股票数据,并使用quantstrat包进行策略回测。首先加载所需的包:

# 加载必要的包
library(quantmod)
library(quantstrat)
library(eTTR)
library(PerformanceAnalytics)
library(ggplot2)
library(dplyr)
library(tibble)
library(scales)
library(gridExtra)
# 加载环境重置函数
source("/Users/matrixspk/My-Sites/r-finance/assets/code/reset_strategy_env.R")
# 加载计算胜率的函数
source("/Users/matrixspk/My-Sites/r-finance/assets/code/calculate_portfolio_win_rates.R")
source("/Users/matrixspk/My-Sites/r-finance/assets/code/generateSimpleSignalChain.R")

接下来,我们获取苹果公司股票的历史数据作为研究对象:

# 设置获取数据的起始和结束日期
initDate <- as.Date("2017-12-31")
startdate.st <- as.Date("2018-01-01")
enddate.st <- as.Date("2023-06-01")
# 获取苹果公司股票数据
getSymbols("AAPL", src = "yahoo", from = startdate.st, to = enddate.st)
## [1] "AAPL"
colnames(AAPL) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")
# 查看数据结构
head(AAPL)
##               Open    High     Low   Close    Volume Adjusted
## 2018-01-02 42.5400 43.0750 42.3150 43.0650 102223600 40.34188
## 2018-01-03 43.1325 43.6375 42.9900 43.0575 118071600 40.33487
## 2018-01-04 43.1350 43.3675 43.0200 43.2575  89738400 40.52222
## 2018-01-05 43.3600 43.8425 43.2625 43.7500  94640000 40.98358
## 2018-01-08 43.5875 43.9025 43.4825 43.5875  82271200 40.83135
## 2018-01-09 43.6375 43.7650 43.3525 43.5825  86336000 40.82666
summary(AAPL)
##      Index                 Open             High             Low        
##  Min.   :2018-01-02   Min.   : 35.99   Min.   : 36.43   Min.   : 35.50  
##  1st Qu.:2019-05-10   1st Qu.: 51.97   1st Qu.: 52.32   1st Qu.: 51.67  
##  Median :2020-09-15   Median :114.67   Median :116.07   Median :112.84  
##  Mean   :2020-09-14   Mean   :102.38   Mean   :103.62   Mean   :101.24  
##  3rd Qu.:2022-01-20   3rd Qu.:146.36   3rd Qu.:148.00   3rd Qu.:145.15  
##  Max.   :2023-05-31   Max.   :182.63   Max.   :182.94   Max.   :179.12  
##      Close            Volume             Adjusted     
##  Min.   : 35.55   Min.   : 35195900   Min.   : 33.80  
##  1st Qu.: 52.03   1st Qu.: 76144000   1st Qu.: 49.62  
##  Median :114.97   Median : 98135650   Median :111.72  
##  Mean   :102.48   Mean   :112825927   Mean   : 99.81  
##  3rd Qu.:146.61   3rd Qu.:133535000   3rd Qu.:143.67  
##  Max.   :182.01   Max.   :426510000   Max.   :178.27

KDJ指标计算原理

KDJ指标由三条曲线组成:K线、D线和J线。其计算基于以下步骤:

MACD指标择时交易策略分析

引言

技术分析是金融市场中常用的分析方法,其中MACD指标是一种重要的趋势跟踪指标,能够反映价格波动的趋势和动量。本研究旨在通过R语言实现基于MACD指标的股票择时交易策略,并通过历史数据回测寻找最佳参数组合。

研究方法

数据获取与处理

我们将使用quantmod包获取股票数据,并使用quantstrat包进行策略回测。首先加载所需的包:

# 加载必要的包
library(quantmod)
library(quantstrat)
library(eTTR)
library(PerformanceAnalytics)
library(ggplot2)
library(dplyr)
library(tibble)
library(scales)
library(gridExtra)
library(showtext)
font_add("SimHei", regular = "SimHei.ttf")
showtext_auto()

接下来,我们获取TSLA的历史数据作为研究对象:

# 设置获取数据的起始和结束日期
startdate.st <- as.Date("2018-01-01")
enddate.st <- as.Date("2023-06-01")

# 获取上证指数数据
getSymbols("TSLA", 
           src = "yahoo", 
           from = startdate.st, 
           to = enddate.st)
## [1] "TSLA"
colnames(TSLA) <- c("Open", "High", "Low", 
                    "Close", "Volume", "Adjusted")

# 查看数据结构
head(TSLA)
##                Open     High      Low    Close    Volume Adjusted
## 2018-01-02 20.80000 21.47400 20.73333 21.36867  65283000 21.36867
## 2018-01-03 21.40000 21.68333 21.03667 21.15000  67822500 21.15000
## 2018-01-04 20.85800 21.23667 20.37867 20.97467 149194500 20.97467
## 2018-01-05 21.10800 21.14933 20.80000 21.10533  68868000 21.10533
## 2018-01-08 21.06667 22.46800 21.03333 22.42733 147891000 22.42733
## 2018-01-09 22.34400 22.58667 21.82667 22.24600 107199000 22.24600
summary(TSLA)
##      Index                 Open             High             Low        
##  Min.   :2018-01-02   Min.   : 12.07   Min.   : 12.45   Min.   : 11.80  
##  1st Qu.:2019-05-10   1st Qu.: 21.42   1st Qu.: 21.82   1st Qu.: 21.04  
##  Median :2020-09-15   Median :126.48   Median :130.84   Median :122.50  
##  Mean   :2020-09-14   Mean   :135.13   Mean   :138.26   Mean   :131.71  
##  3rd Qu.:2022-01-20   3rd Qu.:230.08   3rd Qu.:235.64   3rd Qu.:224.40  
##  Max.   :2023-05-31   Max.   :411.47   Max.   :414.50   Max.   :405.67  
##      Close            Volume             Adjusted     
##  Min.   : 11.93   Min.   : 29401800   Min.   : 11.93  
##  1st Qu.: 21.50   1st Qu.: 77479900   1st Qu.: 21.50  
##  Median :125.58   Median :105881850   Median :125.58  
##  Mean   :135.07   Mean   :134181265   Mean   :135.07  
##  3rd Qu.:231.07   3rd Qu.:159549600   3rd Qu.:231.07  
##  Max.   :409.97   Max.   :914082000   Max.   :409.97

MACD指标计算原理

MACD指标由三条曲线组成:DIF线、DEA线和MACD柱状图。其计算基于以下步骤:

R软件与多股票波动性及相关性的可视化

前言

在量化投资建模过程之前,有时候,我们需要对多只股票的价格走势、收益率序列、波动率等进行分析。下面给出使用 R 语言比较多只股票价格走势的完整解决方案。方案涵盖数据获取、清洗、可视化及基础分析全流程:

数据获取

安装与加载工具包

# 安装必要包(首次运行需取消注释)
# install.packages(c("quantmod", 
#                    "tidyverse", 
#                    "ggplot2", 
#                    "zoo", 
#                    "corrplot"))

library(quantmod)   # 获取金融数据
library(tidyverse)  # 数据处理
library(ggplot2)    # 可视化
library(zoo)        # 时间序列处理

定义股票代码与时间范围

# 股票代码列表(支持多市场,如A股需加 .SS/.SZ)
# 苹果、谷歌、微软、英伟达
stocks <- c("AAPL", "GOOGL", "MSFT", "NVDA")  
# 时间范围
start_date <- "2023-01-01"
end_date <- Sys.Date()  # 获取当前日期

批量获取股票数据

# 获取数据
getSymbols(stocks, 
           src = "yahoo", 
           from = start_date, 
           to = end_date)
## [1] "AAPL"  "GOOGL" "MSFT"  "NVDA"
# 处理数据
stock_data <- lapply(stocks, function(x) {
  data <- as_tibble(get(x)) %>%
    mutate(Date = index(get(x))) %>%
    rename_with(~ gsub(paste0("^", x, "\\."), "", .x)) %>%
    select(Date, Close) %>%
    mutate(symbol = x) %>%  # 添加股票代码列
    rename(price = Close)   # 重命名收盘价列
}) %>%
  bind_rows()

# 查看结果
head(stock_data)
## # A tibble: 6 × 3
##   Date       price symbol
##   <date>     <dbl> <chr> 
## 1 2023-01-03  125. AAPL  
## 2 2023-01-04  126. AAPL  
## 3 2023-01-05  125. AAPL  
## 4 2023-01-06  130. AAPL  
## 5 2023-01-09  130. AAPL  
## 6 2023-01-10  131. AAPL

数据清洗

处理缺失值

library(dplyr)
# 检查缺失值
missing_values <- stock_data %>%
  group_by(symbol) %>%
  summarise(missing = sum(is.na(price)))

# 填充缺失值(使用前向填充)
stock_data <- stock_data %>%
  group_by(symbol) %>%
  mutate(price = na.locf(price))

对齐时间序列

library(dplyr)
# 生成完整日期序列
full_dates <- tibble(Date = seq(as.Date(start_date), 
                                as.Date(end_date), 
                                by = "day"))

# 左连接填充所有日期
stock_data <- full_dates %>%
  left_join(stock_data, by = "Date") %>%
  group_by(symbol) %>%
  fill(price, .direction = "downup") %>%
  na.omit()

价格走势可视化

基础折线图

library(dplyr)
ggplot(stock_data, aes(x = Date, y = price, color = symbol)) +
  geom_line(linewidth = 0.8) +
  labs(title = "多只股票价格走势对比",
       x = "日期",
       y = "收盘价",
       color = "股票代码") +
  theme_minimal() +
  theme(legend.position = "top") +  
  scale_color_manual(values = c("AAPL" = "red", 
                                "GOOGL" = "blue", 
                                "MSFT" = "green", 
                                "NVDA" = "purple")
                     )

对数收益率对比

library(dplyr)
# 计算对数收益率
return_data <- stock_data %>%
  group_by(symbol) %>%
  mutate(log_return = log(price) - log(lag(price))) %>%
  na.omit()

# 绘制收益率曲线
ggplot(return_data, 
       aes(x = Date, y = log_return, color = symbol)) +
  geom_line(alpha = 0.7) +
  labs(title = "对数收益率对比",
       x = "日期",
       y = "对数收益率",
       color = "股票代码") +
  theme_minimal() + 
  theme(legend.position = "top") # 图例放底部

绘制对数收益率密度图:

均值回归策略有效性分析

\newpage

引言

均值回归是金融市场中的一种重要现象,指资产价格或收益率在长期内趋向于回归其历史平 均值。基于这一理论的交易策略通常假设价格偏离其均值后会回归,因此可以通过买入低价 资产、卖出高价资产来获利。

本文将通过R语言实现均值回归策略,并验证其有效性。我们将选取多只股票作为样本,优化 策略参数,并在样本外数据上验证策略的表现。

数据准备与分析

首先加载必要的R包并获取股票数据。我们将选取几只具有代表性的美国科技股作为研究对象。

# 加载必要的R包
library(quantmod)
library(PerformanceAnalytics)
library(foreach)
library(doParallel)
library(ggplot2)
library(dplyr)
library(tidyr)
library(eTTR)
library(zoo)

接下来,我们获取多只股票的历史数据。这里选择了苹果(AAPL)、微软(MSFT)、谷歌(GOOG)、 亚马逊(AMZN)和特斯拉(TSLA)作为样本。

# 设置起止日期
start_date <- "2018-01-01"
end_date <- "2023-01-01"
out_of_sample_date <- "2023-01-02"
end_oos_date <- "2023-12-31"

# 股票代码列表
stock_symbols <- c("AAPL", "MSFT", "GOOG", "AMZN", "TSLA")

# 获取股票数据
stock_data <- list()
for (symbol in stock_symbols) {
   data_raw <- getSymbols(symbol, from = start_date, to = end_date, auto.assign = FALSE)
   colnames(data_raw) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")
   stock_data[[symbol]] <- data_raw
}

# 获取样本外数据
oos_data <- list()
for (symbol in stock_symbols) {
   data_raw <- getSymbols(symbol, from = out_of_sample_date, to = end_oos_date, auto.assign = FALSE)
   colnames(data_raw) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")
   oos_data[[symbol]] <- data_raw
}

让我们可视化这些股票的价格走势,以便对数据有一个直观的了解。

基于动量轮动策略的有效性分析

引言

动量效应是金融市场中一种重要的现象,指过去表现较好的资产在未来短期内往往继续表现 较好,而过去表现较差的资产则继续表现较差。基于动量效应的交易策略已经被广泛研究和 应用。

在股票市场中,大盘股和小盘股通常具有不同的风险收益特征和市场表现。本研究旨在探索 一种基于动量的轮动策略,通过比较大盘股和小盘股的相对强度,动态调整投资组合的配置, 以获取超额收益。

我们将使用R语言实现这一策略,并通过历史数据验证其有效性。同时,我们会优化策略参数, 测试参数敏感性,并在样本外数据上验证策略的稳健性。

数据准备与分析

首先加载必要的R包并获取股票数据。我们将选取多只大盘股和小盘股作为研究对象。

# 加载必要的R包
library(quantmod)
library(PerformanceAnalytics)
library(foreach)
library(doParallel)
library(ggplot2)
library(dplyr)
library(tidyr)
library(caret)
library(magrittr)

接下来,我们获取股票数据。我们将选择10只大盘股和10只小盘股作为样本。大盘股选取标 普500指数成分股中市值最大的10只,小盘股选取罗素2000指数成分股中市值最小的10只。

# 设置起止日期
start_date <- "2018-01-01"
end_date <- "2023-01-01"
out_of_sample_date <- "2023-01-02"
end_oos_date <- "2023-12-31"

# 大盘股列表
large_cap_symbols <- c("AAPL", "MSFT", "AMZN", "TSLA")

# 小盘股列表
small_cap_symbols <- c("ARQT", "AVXL", "BPMC", "CELZ")

# 所有股票代码
all_symbols <- c(large_cap_symbols, small_cap_symbols)

# 获取股票数据
stock_data <- list()
for (symbol in all_symbols) {
  tryCatch(
    {
      stock_data_raw <- getSymbols(symbol, 
                                   from = start_date, 
                                   to = end_date, 
                                   auto.assign = FALSE)
      colnames(stock_data_raw) <- c("Open", 
                                    "High", 
                                    "Low", 
                                    "Close", 
                                    "Volume", 
                                    "Adjusted")
      stock_data[[symbol]] <- stock_data_raw
      cat("Successfully downloaded", symbol, "\n")
    },
    error = function(e) {
      cat("Error downloading", symbol, ":", conditionMessage(e), "\n")
    }
  )
}
## Successfully downloaded AAPL 
## Error downloading MSFT : Unable to import "MSFT".
## Transferred a partial file [query2.finance.yahoo.com] 
## Successfully downloaded AMZN 
## Successfully downloaded TSLA 
## Successfully downloaded ARQT 
## Successfully downloaded AVXL
## Error downloading BPMC : Unable to import "BPMC".
## cannot open the connection 
## Successfully downloaded CELZ
# 过滤掉下载失败的股票
valid_symbols <- names(stock_data)
large_cap_symbols <- large_cap_symbols[large_cap_symbols %in% valid_symbols]
small_cap_symbols <- small_cap_symbols[small_cap_symbols %in% valid_symbols]

# 获取样本外数据
oos_data <- list()
for (symbol in valid_symbols) {
  tryCatch(
    {
      oss_data_raw <- getSymbols(symbol, 
                                 from = out_of_sample_date, 
                                 to = end_oos_date, 
                                 auto.assign = FALSE)
      colnames(oss_data_raw) <- c("Open", 
                                  "High", 
                                  "Low", 
                                  "Close", 
                                  "Volume", 
                                  "Adjusted")
      oos_data[[symbol]] <- oss_data_raw
      cat("Successfully downloaded OOS data for", symbol, "\n")
    },
    error = function(e) {
      cat("Error downloading OOS data for", symbol, ":", conditionMessage(e), "\n")
    }
  )
}
## Successfully downloaded OOS data for AAPL 
## Successfully downloaded OOS data for AMZN 
## Successfully downloaded OOS data for TSLA 
## Successfully downloaded OOS data for ARQT 
## Successfully downloaded OOS data for AVXL 
## Successfully downloaded OOS data for CELZ

让我们计算并可视化大盘股和小盘股的平均价格走势,以便对数据有一个直观的了解。