引言
动量效应是金融市场中一种重要的现象,指过去表现较好的资产在未来短期内往往继续表现
较好,而过去表现较差的资产则继续表现较差。基于动量效应的交易策略已经被广泛研究和
应用。
在股票市场中,大盘股和小盘股通常具有不同的风险收益特征和市场表现。本研究旨在探索
一种基于动量的轮动策略,通过比较大盘股和小盘股的相对强度,动态调整投资组合的配置,
以获取超额收益。
我们将使用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
## Successfully downloaded MSFT
## Successfully downloaded AMZN
## Successfully downloaded TSLA
## Successfully downloaded ARQT
## Successfully downloaded AVXL
## Successfully downloaded BPMC
## 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 MSFT
## 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 BPMC
## Successfully downloaded OOS data for CELZ
让我们计算并可视化大盘股和小盘股的平均价格走势,以便对数据有一个直观的了解。