美文网首页大数据部落
TMA三均线期指高频交易策略的R实现

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

作者: 拓端tecdat | 来源:发表于2016-08-24 21:36 被阅读281次

    趋势交易策略是至今应用最广泛以及最重要的投资策略之一,它的研究手段种类繁多,所运用的分析工具也纷繁复杂,其特长在于捕捉市场运动的大方向。股指期货市场瞬息万变,结合趋势分析方法,量化投资策略能够得到更有效的应用。

    均线系统作为最古老的技术分析手段之一,至今仍在沿用,同时它也是运用最广泛的技术指标体系。最常用的移动平均线是简单移动平均线,而后在此基础上延伸出了很多类型的移动平均线,如指数移动平均(EMA),加

    权移动平均(WMA),还有按成交量加权移动平均(VWMA)等。

    由于均线的参数不同,均线所刻画的价格趋势也不相同,所以,单纯使用一条均线不能全面的刻画市场的趋势。对于日内高频交易来说,市场的趋势时短时长,因此需要采用多条不同周期的均线,从不同的角度来反映市场不同周期内的趋势。Triple Moving Average 策略(以下简称 TMA),顾名思义采用的是三条简单移动平均线

    (SMA),选择不同周期的参数来刻画期指日内的短期,中期以及长期趋势。通常,三个参数的设定范围为短期(5 分钟~15 分钟),中期(20 分钟~40 分钟),长期(50 分钟~90 分钟)。

    在 TMA 的基础上,我们设计了如下的指标:

    Up Bound=Max (SMA(Fast),SMA(Middle),SMA(Slow) )

    Dn Bound=Min ( SMA(Fast),SMA(Middle),SMA(Slow) )

    指标采用 1 分钟收盘价作为价格时间序列,当收盘价第一次上穿 Up Bound时确认为买入时机,当收盘价第一次下穿 Dn Bound 时确认为卖出时机。

    由于backtester_v4.2投资组合软件包中已经给出了SMA的方法,因此我们可以对其进行简单的修改,从而实现TMA策略。

    通过getTMA可以得到不同窗口宽度下的收盘价:

    通过getPosSignFromTMA我们可以通过三条均线得到的不同收盘价来采取不同的交易策略:

    通过getPosSize我们可以得到某支股票的交易量

    最终可以通过getInSampleOptResult得到三条均线不同组合下的最佳市盈率

    有问题欢迎交流讨论 qq 570881451

    部分源码

    getOrders <- function(store, newRowList, currentPos, params) {

    allzero<- rep(0,length(newRowList)) # used for initializing vectors

    if (is.null(store))

    store <- initStore(newRowList)

    else

    store <- updateStore(store, newRowList)

    ################################################

    pos <- allzero

    if (store$iter > params$lookbacks$long) {

    for(i in 1:2){

    size=getPosSize(store$cl[[i]][store$iter])

    pos[[i]]=getPosSignFromTMA(getTMA(as.xts(store$cl[[i]]),params$lookbacks))*size

    }

    }

    marketOrders <- -currentPos + pos

    return(list(store=store,marketOrders=marketOrders,

    limitOrders1=allzero,limitPrices1=allzero,

    limitOrders2=allzero,limitPrices2=allzero))

    }

    ########################################################################

    # The following function should be edited to complete steps 1 to 3

    # of comp22 assignment 2

    getTMA <- function(close_prices, lookbacks) {

    if (!("long"%in% names(lookbacks) && "short"%in% names(lookbacks) && "medium"%in% names(lookbacks) ))

    stop("E01: At least one of \"short\", \"medium\", \"long\" is missing from names(lookbacks)")

    # Replace TRUE to

    # check that the elements of lookbacks are all integers

    if( !(class(lookbacks[[1]])=="integer" && class(lookbacks[[2]])=="integer" && class(lookbacks[[3]])=="integer"))

    stop("E02: At least one of the lookbacks is not an integer according to is.integer()")

    # Replace TRUE to

    # check that lookbacks$short < lookbacks$medium < lookbacks$long

    if (!(lookbacks[[1]]

    stop("E03: The lookbacks do not satisfy lookbacks$short < lookbacks$medium < lookbacks$long")

    # Replace TRUE to

    # check that close_prices is an xts

    if (!(class(close_prices)[1]=="xts"))

    stop("E04: close_prices is not an xts according to is.xts()")

    # Replace TRUE to

    # check that close_prices has enough rows

    if (nrow(close_prices)

    stop("E05: close_prices does not enough rows")

    # Replace TRUE to

    # check that close_prices contains a column called "Close"

    if (!(colnames(close_prices)=="Close"))

    stop("E06: close_prices does not contain a column \"Close\"")

    sma=numeric(0)

    for(i in 1:3){

    sma[i] <-as.numeric(last(SMA(close_prices,n=lookbacks[[i]]))) # TTR version # convert to vector from xts

    }

    smalist <- list(short=sma[1],medium=sma[2],long=sma[3])

    return(smalist)

    }

    getPosSignFromTMA <- function(tma_list) {

    # This function should return a single number that is:

    #1 if the short SMA < medium SMA < long SMA

    #-1 if the short SMA > medium SMA > long SMA

    #0 otherwise

    ret=0

    if(tma_list[[1]]

    else if(tma_list[[1]]>tma_list$medium && tma_list$medium>tma_list[[3]])ret=-1

    else ret=0

    return(ret)

    }

    getPosSize <- function(current_close,constant=1000) {

    return(floor(constant/current_close))

    }

    getInSampleResult <- function() {

    period=getInSamplePeriod('x4jr')

    start=period[1]

    end=period[2]

    datalist=getData(directory="A2")

    datalist <-lapply(datalist, function(x)x[start:end])

    sMult=0.2

    series=1:length(datalist)

    params <-list(lookbacks=list(short=as.integer(10),medium=as.integer(20),long=as.integer(30)),sdParam=1,series=series)

    results <- backtest(datalist, getOrders, params, sMult)

    pfolioPnL <- plotResults(datalist,results)

    return(pfolioPnL[[3]])

    #> pfolioPnL[[3]]

    #[1] -1625.5

    }

    getInSampleOptResult <- function() {

    period=getInSamplePeriod('x4jr')

    start=period[1]

    end=period[2]

    dataList <- getData(directory="A2")

    dataList <- lapply(dataList, function(x) x[start:end])

    medium <- seq(from=105,to=120,by=5)

    short <- seq(from=100,to=110,by=5)

    long <- seq(from=110,to=130,by=5)

    time <- matrix(0,28,3)

    numberComb <- 28

    sMult <- 0.2 # slippage multiplier

    rr=1

    for(l in long)

    for(m in medium)

    for(s in short)

    if(s< l){time[rr,]=c(as.integer(s),as.integer(m),as.integer(l));rr=rr+1}

    pfolioPnLList <- vector(mode="list",length=numberComb)

    count <- 1

    bestPD <- 0

    resultsMatrix=matrix(0,28,4)

    for (i in 1:28) {

    short=as.integer(time[i,1]);medium=as.integer(time[i,2]);long=as.integer(time[i,3]);

    lookbacks <-list(short=short,medium=medium,long=long)

    params <- list(lookbacks=lookbacks)

    results <- backtest(dataList, getOrders, params, sMult)

    pfolioPnL <- plotResults(dataList,results)

    resultsMatrix[count,] <- c(lookbacks[[1]],lookbacks[[2]],lookbacks[[3]],pfolioPnL$fitAgg)

    pfolioPnLList[[count]]<- pfolioPnL

    cat("Just completed",count,"out of",numberComb,"\n")

    print(resultsMatrix[count,])

    count <- count + 1

    }

    print(resultsMatrix[order(resultsMatrix[,4]),])

    bsetPD=max(resultsMatrix[,4])

    return(bsetPD)

    #> bsetPD

    #[1] 3.28

    }

    原文请浏览官网

    【拓端数据tecdat.cn】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。

    中国专业的统计分析和数据挖掘咨询服务商:拓端数据(商务合作请联系官网客服)

    帅的小伙伴都关注了拓端数据团队^..^~

    QQ交流群:186388004

    微信公众号:拓端数据

    微信客服号:lico_9e

    相关文章

      网友评论

        本文标题:TMA三均线期指高频交易策略的R实现

        本文链接:https://www.haomeiwen.com/subject/cqxgsttx.html