R语言金融市场量化交易:布林带、价差策略、RSI交易策略,回测COMP 226|附代码数据

发布时间 2023-03-30 23:50:40作者: 拓端tecdat

全文下载链接:http://tecdat.cn/?p=29653

最近我们被客户要求撰写关于量化交易的研究报告,包括一些图形和统计输出。

我们将利用每日数据制定简单的交易策略,将涵盖以下内容。

  • 一个简单的介绍性交易。
  • 它每天只根据前一天的价格行为做出交易决定 - 我们用这个例子来介绍前瞻性的偏见
  • 布林线是一个使用移动平均线(和移动标准差)的标准技术分析指标的例子
  • 一个使用布林线的简单的均线回复型交易策略 指标作为策略的构件(但与之不同)。路径依赖性。止损、盈利目标和持有期是引入路径依赖的交易策略构建的例子。
  • 滑点--我们回顾一下什么是滑点,我们探讨在交易策略中考虑滑点的问题 - 使用价差的策略,它是两个价格时间序列的线性组合

简单的策略:模仿

策略

  • 如果收盘价高于开盘价,则在第二天买入
  • 否则,在第二天卖出

我们希望这个策略在什么时候能发挥作用?

  • 如果有连续多日价格向同一方向移动的情况
  • 每一天的方向与之前的变化不同,对该策略来说都是亏损的一天,所以这样的日子不应该有大的价格波动。

测试该策略

从现在开始,我们将重复使用实用工具脚本 "utilities.R "中的函数。在这种情况下,我们将使用。

  • getLogReturns(prices),从调整后的价格中计算出对数回报。
  • getEquityLog(log_ret,pos),从对数收益和仓位向量中计算出股权曲线。

实用功能

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)

两个明显的数字参数是。

  • n是回溯期,和
  • sd是标准偏差的乘数

 例子

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
  • 点差 = x - positionRatio * y
  • 当我们卖出y的仓位比例单位时,买入一个单位的x

点差例子

plot.zoo(cbind(spread,0,0.5,-0.5),screen=c(2,2,2,2),main="Spread")

图片

一个价差策略

创建价差的目的是创建一个平稳的时间序列,也就是一个具有恒定平均值和标准差的时间序列。

如果我们成功了,我们就可以在价差远远低于其平均值时买入价差(做多廉价产品,做空昂贵产品),在价差高于其平均值时卖出价差。

连续积分理论正是处理平稳的时间序列的线性组合,但我们不会去研究数学。

接下来我们将看到一个简单的基于布林线的价差交易策略想法。

例子:RSI策略

  • RSI是一个标准的指标,在TTR软件包中实现。
  • 它的数值在0到100之间,较高(较低)的数值表示市场最近在上升(下降)。
# 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》。

点击标题查阅往期内容

【视频】量化交易陷阱和R语言改进股票配对交易策略分析中国股市投资组合
使用R语言对S&P500股票指数进行ARIMA + GARCH交易策略
R语言量化交易RSI策略:使用支持向量机SVM
R语言资产配置: 季度战术资产配置策略研究
R语言动量交易策略分析调整后的数据
TMA三均线股票期货高频交易策略的R语言实现
R语言时间序列:ARIMA / GARCH模型的交易策略在外汇市场预测应用
R语言基于Garch波动率预测的区制转移交易策略
r语言多均线股票价格量化策略回测
使用R语言对S&P500股票指数进行ARIMA + GARCH交易策略
Python基于粒子群优化的投资组合优化研究
R语言Fama-French三因子模型实际应用:优化投资组合
R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现
Python计算股票投资组合的风险价值(VaR)
R语言Markowitz马克维茨投资组合理论分析和可视化
R语言中的广义线性模型(GLM)和广义相加模型(GAM):多元(平滑)回归分PYTHON用RNN神经网络LSTM优化EMD经验模态分解交易策略分析股票价格MACD
R语言深度学习:用keras神经网络回归模型预测时间序列数据
【视频】CNN(卷积神经网络)模型以及R语言实现回归数据分析
Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类
RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测
结合新冠疫情COVID-19股票价格预测:ARIMA,KNN和神经网络时间序列分析
深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据
用PyTorch机器学习神经网络分类预测银行客户流失模型
PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据
Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化
Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析
R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告
R语言深度学习:用keras神经网络回归模型预测时间序列数据
Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
MATLAB中用BP神经网络预测人体脂肪百分比数据
Python中用PyTorch机器学习神经网络分类预测银行客户流失模型
R语言实现CNN(卷积神经网络)模型进行回归数据分析
SAS使用鸢尾花(iris)数据集训练人工神经网络(ANN)模型
【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析
Python使用神经网络进行简单文本分类
R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析
R语言基于递归神经网络RNN的温度时间序列预测
R语言神经网络模型预测车辆数量时间序列
R语言中的BP神经网络模型分析学生成绩
matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类
R语言实现拟合神经网络预测和结果可视化
用R语言实现神经网络预测股票实例
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测
python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译
用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类