为了分散交易中的风险,我们可以在量化交易中选择市场中性策略。
我们选择具有基本面相关性的股票对,价格趋势具有趋同和趋离,买多强势的股票,卖空弱势的股票,同时交易,控制股市风险。
案例是石油公司埃克森美孚(NYSE:XOM)和石油公司雪佛龙(NYSE:CVX)
公司简介:埃克森美孚公司于1882年在美国新泽西州成立,公司的分部及附属公司在美国和世界上大多数其他国家经营或买卖产品。公司主要业务为能源,涉及勘探、生产、原油和天然气;生产石油产品;运输和销售原油、天然气和石油产品。公司是石油化工商品的制造商和销售商,包括烯烃、芳烃、聚乙烯和聚丙烯塑料和各种特色产品。此外,公司还拥有发电设施的利益。公司也是全球主要的石化产品生产商和营销商,并参与发电。
公司简介: 雪佛龙股份有限公司于1926年在美国特拉华州注册成立。公司经营范围包括石油和化学工业的各个方面。上游业务主要包括勘探、开发及生产原油及天然气;加工、液化、运输和液化天然气再气化;主要的国际石油出口管道输送原油;运输、储存和销售天然气;一个天然气合成油项目。下游业务主要包括将原油提炼为石油产品;营销原油及其成品;通过管道、海洋船舶、电机设备和轨道车运送原油和成品油;制造和销售在工业用途、燃料和润滑油添加剂上应用的石化产品、塑料。
回测
# 载入量化和绩效分析库
library(quantmod)
library(PerformanceAnalytics)
# 下载股价和提取收盘价函数
get_symbol_cl <- function(symbol) {
getSymbols(symbol,
src = "yahoo",
from = "2010-01-01",
to = "2016-01-01")
temp <- Ad(get(symbol))
return(temp)
}
# 计算收益率函数
ret_normalize <- function(ret) {
ret[1] <- 0
norm_ret <- cumprod(1 ret)
return(norm_ret)
}
# 下载埃克森美孚(NYSE:XOM)和雪佛龙(NYSE:CVX)股票的收盘价
# 选择的股票对应该有明显的趋同和驱离,同向不行,例如道琼斯指数和标普500指数
xom <- get_symbol_cl("XOM")
cvx <- get_symbol_cl("CVX")
# 计算收益率
ret_xom <- Delt(xom)
colnames(ret_xom) <- "ret_xom"
ret_cvx <- Delt(cvx)
colnames(ret_cvx) <- "ret_cvx"
# 转化为标准化收益率
norm_xom <- ret_normalize(ret_xom)
norm_cvx <- ret_normalize(ret_cvx)
# 标准化价格差,均值和标准差
diff <- norm_xom - norm_cvx
me <- mean(diff)
std <- sd(diff)
# 标准差的上下边界,这是最重要的数据
n <- 1
ub <- me n * std
lb <- me - n * std
# 回测信号,用向量化的ifelse,性能更好
# 1买XOM卖CVX,-1卖XOM买CVX,0空仓
signal <- NULL
signal <- ifelse(diff > ub, -1,
ifelse(diff < lb, 1, 0))
# 标准化价格差、价差和交易信号
par(mfrow = c(3, 1))
plot(
cbind(norm_xom, norm_cvx),
main = "埃克森美孚 & 雪佛龙 标准价格",
col = c("black", "red"),
ylim = c(0.5, 2),
ylab = "标准价格"
)
plot(diff,main="价格差")
plot(signal,main="交易信号")
# 回测交易
# 不考虑所有费用和滑点
spread_return <- ret_xom - ret_cvx
cost <- 0
trade_return <- spread_return*lag(signal)-cost
names(trade_return) <- "TradStrat_PT#1"
# 交易效果和绩效指标
summary(as.vector(trade_return))
cumm_ret <- Return.cumulative(trade_return)
annual_ret <- Return.annualized(trade_return)
par(mfrow=c(1,1))
charts.PerformanceSummary(trade_return,main="交易报告")
maxDrawdown(trade_return)
StdDev(trade_return)
StdDev.annualized(trade_return)
VaR(trade_return)
SharpeRatio(trade_return,Rf=0,FUN="StdDev")
SharpeRatio.annualized(trade_return,Rf=0)
交易效果和绩效指标
> # 交易效果和绩效指标
> summary(as.vector(trade_return))
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-0.0373405 0.0000000 0.0000000 0.0002067 0.0000000 0.0329959 1
> tail(cumm_ret)
TradStrat_PT#1
Cumulative Return 0.3460039
> maxDrawdown(trade_return)
[1] 0.1077101
> StdDev(trade_return)
[,1]
StdDev 0.004425325
> StdDev.annualized(trade_return)
TradStrat_PT#1
Annualized Standard Deviation 0.07024986
> VaR(trade_return)
TradStrat_PT#1
VaR -0.005450908
> SharpeRatio(trade_return,Rf=0,FUN="StdDev")
TradStrat_PT#1
StdDev Sharpe (Rf=0%, p=95%): 0.04671048
> SharpeRatio.annualized(trade_return,Rf=0)
TradStrat_PT#1
Annualized Sharpe Ratio (Rf=0%) 0.7241807
>
下一步优化方向
这个策略的优化关键是:优选股票对,寻找上下边界n的值
感谢阅读,欢迎关注和留言