Quantitative Trading with R:两个简单的策略

Posted AmosDing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quantitative Trading with R:两个简单的策略相关的知识,希望对你有一定的参考价值。

下面是两个使用R中的Quantstrat包进行策略构建的例子,都是对600550.ss、600192.ss、600152.ss、600644.ss、600885.ss、600151.ss六只股票进行投资。第一个是简单的动量策略;第二个是简单的趋势策略。

虽然策略的表现都不太好,但是都有一个较为完整的框架,后面希望整理一下自己关于Quantstrat的学习笔记,刚接触相关方面的R语言小白,希望大家多多批评,欢迎交流!(在这之前要先加载quantstrat包)

一、动量策略:将每个股票过去14天收益率和股票过去30天收益率之间的比较作为投资信号

#设置策略时间
initDate="2018-01-01"
from="2018-04-18"
to="2020-01-23"

#导入市场数据
c=c("600550.ss","600192.ss","600152.ss","600644.ss","600885.ss","600151.ss")
Z=c("A","B","C","D","E","F")
for(i in 1:length(c)){
  name=c[i]
  setSymbolLookup(STOCK=list(name=name,src=‘yahoo‘))
  getSymbols("STOCK",from="2018-04-18",to="2020-01-23")
  assign(paste0("A",Z[i]),na.approx(STOCK))
}

#初始化货币单位、时区和市场
Sys.setenv(TZ="UTC")
currency("RMB")
symbols=c("AA","AB","AC","AD","AE","AF")
stock(symbols,currency="RMB",multiplier=1)

#初始化投资策略环境空间
tradeSize=100000000
initEq=tradeSize*length(symbols)
strategy.st=portfolio.st=account.st="maCross"
rm.strat(strategy.st)
.blotter=.strategy=new.env()
ls(envir=.strategy)

#初始化策略
initPortf(portfolio.st,symbols=symbols,initDate=initDate,currency="USD")
initAcct(account.st,portfolios=portfolio.st,initDate=initDate,currency="USD",initEq=initEq)
initOrders(portfolio.st,initDate=initDate)
strategy(strategy.st,store=T)

#查看策略的基本情况
ls(.blotter)
summary(.blotter$account.maCross)
.blotter$account.maCross
.blotter$portfolio.maCross
ls(.strategy)
str(.strategy$maCross)
str(.strategy$order_book.maCross)

#策略指标设置
add.indicator(strategy.st,name="ROC",
              arguments=list(x=quote(Cl(mktdata)),n=14,type=‘continuous‘),label="PS1")
add.indicator(strategy.st,name="ROC",
              arguments=list(x=quote(Cl(mktdata)),n=30,type=‘continuous‘),label="PS2")

#策略信号设置
add.signal(strategy.st,name="sigComparison",
           arguments=list(columns=c("PS1","PS2"),relationship="gt"),
           label="PS1.gt.PS2")
add.signal(strategy.st,name="sigComparison",
           arguments = list(columns=c("PS1","PS2"),relationship="lt"),
           label="PS1.lt.PS2")

#策略规则设置
add.rule(strategy.st,name=‘ruleSignal‘,
         arguments=list(sigcol="PS1.gt.PS2",sigval=TRUE,prefer=‘Close‘,
                        orderqty=90000,ordertype=‘market‘,orderside=‘long‘),
         type=‘enter‘)
add.rule(strategy.st,name=‘ruleSignal‘,
         arguments=list(sigcol="PS1.lt.PS2",sigval=TRUE,prefer=‘Close‘,
                        orderqty=‘all‘,ordertype=‘market‘,orderside=‘long‘),
         type=‘enter‘)
applyStrategy(strategy=strategy.st,portfolios=portfolio.st)

#策略绩效分析
updatePortf(portfolio.st)
updateAcct(portfolio.st)
updateEndEq(account.st)
chart.Posn(Portfolio=‘maCross‘,Symbol=symbols)
a=getAccount(strategy.st)
equity=a$summary$End.Eq
plot(equity,main="Faber Strategy Equity Curve")
ret=Return.calculate(equity,method="log")
charts.PerformanceSummary(ret,colorset=redfocus,main="Performance")

二、趋势策略:将每个股票的MA50向上突破或向下突破MA200作为投资信号

 

#设置策略时间
initDate="2018-01-01"
from="2018-04-18"
to="2020-01-23"

#导入市场数据
c=c("600550.ss","600192.ss","600152.ss","600644.ss","600885.ss","600151.ss")
Z=c("A","B","C","D","E","F")
for(i in 1:length(c)){
  name=c[i]
  setSymbolLookup(STOCK=list(name=name,src=‘yahoo‘))
  getSymbols("STOCK",from="2018-04-18",to="2020-01-23")
  assign(paste0("A",Z[i]),na.approx(STOCK))
}

#初始化货币单位、时区和市场
Sys.setenv(TZ="UTC")
currency("USD")
symbols=c("AA","AB","AC","AD","AE","AF")
stock(symbols,currency="USD",multiplier=1)

#初始化投资策略环境空间
tradeSize=100000000
initEq=tradeSize*length(symbols)
strategy.st=portfolio.st=account.st="maCross"
rm.strat(strategy.st)
.blotter=.strategy=new.env()
ls(envir=.strategy)

#初始化策略
initPortf(portfolio.st,symbols=symbols,initDate=initDate,currency="USD")
initAcct(account.st,portfolios=portfolio.st,initDate=initDate,currency="USD",initEq=initEq)
initOrders(portfolio.st,initDate=initDate)
strategy(strategy.st,store=T)

#查看策略的基本情况
ls(.blotter)
summary(.blotter$account.maCross)
.blotter$account.maCross
.blotter$portfolio.maCross
ls(.strategy)
str(.strategy$maCross)
str(.strategy$order_book.maCross)

#策略指标设置
pctATR=0.2
period=10
atrOrder=TRUE
nRSI=2
buyThresh=20
sellThresh=80
nSMA=200
add.indicator(strategy.st,name="SMA",arguments=list(x=quote(Cl(mktdata)),n=50),label="ma50")
add.indicator(strategy.st,name="SMA",arguments=list(x=quote(Cl(mktdata)),n=200),label="ma200")
add.indicator(strategy.st,name="ATR",arguments=list(HLC=quote(HLC(mktdata)),n=period),label="atrX")

#策略信号设置
add.signal(strategy.st,name="sigCrossover",
           arguments=list(columns=c("ma50","ma200"),relationship="gte"),
           label="ma50.gt.ma200")
add.signal(strategy.st,name="sigCrossover",
           arguments=list(columns=c("ma50","ma200"),relationship="lt"),
           label="ma50.lt.ma200")

#策略规则设置
add.rule(strategy.st,name=‘ruleSignal‘,
         arguments=list(sigcol="ma50.gt.ma200",sigval=TRUE,prefer=‘Close‘,
                        orderqty=90000,ordertype=‘market‘,orderside=‘long‘),
         type=‘enter‘)
add.rule(strategy.st,name=‘ruleSignal‘,
         arguments=list(sigcol="ma50.lt.ma200",sigval=TRUE,prefer=‘Close‘,
                        orderqty=‘all‘,ordertype=‘market‘,orderside=‘long‘),
         type=‘enter‘)
applyStrategy(strategy=strategy.st,portfolios=portfolio.st)

#策略绩效分析
updatePortf(portfolio.st)
updateAcct(portfolio.st)
updateEndEq(account.st)
chart.Posn(Portfolio=‘maCross‘,Symbol=symbols)
a=getAccount(strategy.st)
equity=a$summary$End.Eq
plot(equity,main="Faber Strategy Equity Curve")
ret=Return.calculate(equity,method="log")
charts.PerformanceSummary(ret,colorset=redfocus,main="Performance")

 

以上是关于Quantitative Trading with R:两个简单的策略的主要内容,如果未能解决你的问题,请参考以下文章

量化交易(Quantitative Trading)

[Machine Learning for Trading] {ud501} Lesson 3: 01-02 Working with multiple stocks

paper:A Deep Learning based Stock Trading Model with 2-D CNN Trend Detection 2D CNN模型

ECON 1095 QUANTITATIVE METHODS

MGT 201 - Quantitative Analysis

Quantitative Strategies for Achieving Alpha