• R语言金融市场量化交易:布林带、价差策略、RSI交易策略,回测COMP 226


    全文链接: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)
    
    复制代码

    切换式股票曲线

    移动标准差和布林带

    类似于移动平均线,我们现在引入移动(滚动)标准差

    我们使用移动平均线和移动标准差来定义布林带,然后将在我们的下一个交易策略示例中使用

    图表系列

    > 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()
    复制代码

    - 从样本内结果中挑选参数并不总是容易的 

     - 数据集的漂移可能导致良好的参数组合在样本内和样本外期间有所不同  

    最受欢迎的见解

    1.R语言对S&P500股票指数进行ARIMA + GARCH交易策略

    2.R语言改进的股票配对交易策略分析SPY—TLT组合和中国股市投资组合

    3.R语言时间序列:ARIMA GARCH模型的交易策略在外汇市场预测应用

    4.TMA三均线期指高频交易策略的R语言实现

    5.r语言多均线量化策略回测比较

    6.用R语言实现神经网络预测股票实例

    7.r语言预测波动率的实现:ARCH模型与HAR-RV模型

    8.R语言如何做马尔科夫转换模型markov switching model

    9.matlab使用Copula仿真优化市场风险

  • 相关阅读:
    三角形的最大周长
    Java 虚拟机运行时数据区详解
    四数相加 II
    Java 注解详解
    四因数
    【论文笔记+复现踩坑】End-to-end Recovery of Human Shape and Pose(CVPR 2018)
    假如 Web 当初不支持动态化
    保姆级干货分享
    C# ±180的值转成0-360
    C# 校验算法小结
  • 原文地址:https://www.cnblogs.com/tecdat/p/16825852.html
Copyright © 2020-2023  润新知