最近我们被客户要求撰写关于量化交易的研究报告,包括一些图形和统计输出。
我们将利用每日数据制定简单的交易策略,将涵盖以下内容。
策略
我们希望这个策略在什么时候能发挥作用?
测试该策略
从现在开始,我们将重复使用实用工具脚本 "utilities.R "中的函数。在这种情况下,我们将使用。
getLogReturns <- function(prices) {
# 返回调整后价格的对数收益
# 假设输入中存在调整后的价格列
log_ret <- ROC(Ad(prices),type='continuous')
log_ret[1] <- 0
return(log_ret)
}
getEquityCurve <- function(returns,pos,type='log') {
# 股票曲线的简单回报
if (type=='log')
return(exp(cumsum(returns*pos)) - 1)
else
cat ('Type not supported','\n')
}
我们使用滞后函数将时间序列移动一个位置,因此我们使用前一天的价格来做决定
pos <- ifelse(Cl(prices)-Op(prices)>0,1,-1)
pos <- Lag(pos)
pos[1] <- 0
交换位置
注意到这个策略在所有四个股票上都表现不佳,但在其中三个股票上表现特别差。这表明对策略进行了明显的改变:做完全相反的事情,即交换多头和空头交易,如下所示
pos <- ifelse(Cl(prices)-Op(prices)>0,1,-1)
切换式股票曲线
【视频】量化交易陷阱和R语言改进股票配对交易策略分析中国股市投资组合
01
02
03
04
类似于移动平均线,我们现在引入移动(滚动)标准差
我们使用移动平均线和移动标准差来定义布林带,然后将在我们的下一个交易策略示例中使用
图表系列
> library(quantmod)
> getSymbols('AAPL')
这使用包中的BBands函数TTR quantmod在chartSeries中结合了xts和TTR功能
我们将使用与相同的循环、收益和权益曲线计算
pos <- long + short
pos <- lag(pos)
这个策略的参数是什么?
bbands <- BBands(prices,n=50,sd=2)
两个明显的数字参数是。
plot(equity,main='Equity curve')
该策略需要一个参数,即持有期。当且仅当持有期过后,我们退出交易
通过在计数小于持有期时留在交易中来实现。
run <- function(prices,n,sd,hold) {
bbands <- lag(BBands(prices,n=n,sd=sd))
pos <- rep(0,length=nrow(prices)) # all zeroes
getTradeReturn <- function(prices,entry,exit,short=FALSE) {
prices <- as.numeric(prices)
> prices
Adjusted
1970-01-02 100
1970-01-03 110
1970-01-04 100
1970-01-05 150
1970-01-06 200
1970-01-07 100
> getTradeReturn(prices,entry=1,exit=2)
[1] 0.1
> getTradeReturn(prices,entry=1,exit=2,short=T)
[1] -0.09090909
> getTradeReturn(prices,entry=1,exit=4)
[1] 0.5
titStr <- paste("stoploss=", stoploss,":",sum(stopOuts),"stop outs")
plotEquity(prices,pos,stopOuts,titStr); return(pos)
}
策略可以尝试利用价差中的均值反转;对于一对股票,这被称为成对交易
我们将看一下标准普尔500指数和道琼斯工业指数
pdf('different_screens.pdf')
plot.zoo(prices,col=cols,xlab=xlab,ylab=paste(tickers,ylab),main="")
dev.off()
现在,惊人的相似性是显而易见的
lookback <- 50
spread <- close1 - positionRatio*close2
点差例子
plot.zoo(cbind(spread,0,0.5,-0.5),screen=c(2,2,2,2),main="Spread")
创建价差的目的是创建一个平稳的时间序列,也就是一个具有恒定平均值和标准差的时间序列。
如果我们成功了,我们就可以在价差远远低于其平均值时买入价差(做多廉价产品,做空昂贵产品),在价差高于其平均值时卖出价差。
连续积分理论正是处理平稳的时间序列的线性组合,但我们不会去研究数学。
接下来我们将看到一个简单的基于布林线的价差交易策略想法。
# RSI 策略
pos <- long + short
pos <- Lag(pos); pos[is.na(pos)] <- 0
return(pos)
}
样本内和样本外回测
resultsIn <- backtest(prices[startIn:endIn,],params) # in-sample
resultsOut <- backtest(prices[startOut:endOut,],params) # out-of-sample
绘制图
#dev.new(width=10, height=5) # prevent elongation of plots
grid.arrange(plot1,plot2,ncol=2)
dev.off()
本文选自《R语言金融市场量化交易:布林带、价差策略、RSI交易策略,回测COMP 226》。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。