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(一):两个简单的策略的更多相关文章
- R语言:用简单的文本处理方法优化我们的读书体验
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...
- GIT将本地项目上传到Github(两种简单、方便的方法)
GIT将本地项目上传到Github(两种简单.方便的方法) 一.第一种方法: 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安 ...
- 两个简单的Loading
置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<JavaScript并非"按值传递"> 作者主页:myvin 博主QQ:85139 ...
- 两个简单方法加速DataGridView
两个简单方法加速DataGridView (2009-03-24 16:57:13) 转载▼ 标签: 杂谈 分类: .NET DataGridView虽然好用,但是如果数据量比较大的话就会出现性能的问 ...
- 两种简单实现菜单高亮显示的JS类(转载)
两种简单实现菜单高亮显示的JS类 近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web ...
- R语言两种方式求指定日期所在月的天数
R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...
- 2017-5-14 湘潭市赛 Partial Sum 给n个数,每次操作选择一个L,一个R,表示区间左右端点,该操作产生的贡献为[L+1,R]的和的绝对值-C。 0<=L<R<=n; 如果选过L,R这两个位置,那么以后选择的L,R都不可以再选择这两个位置。最多操作m次,求可以获得的 最大贡献和。
Partial Sum Accepted : Submit : Time Limit : MS Memory Limit : KB Partial Sum Bobo has a integer seq ...
- Visual Studio写的项目在 IIS 服务器上运行的两种简单方法
首先需要PC上开启了IIS服务,相关方法网上很多,也很简单 第一种:直接在项目中操作 1.创建一个项目,然后右击选中项目,右击,单击属性,打开项目属性标签页面 如图,选择Web标签,在服务器栏目中选中 ...
- Android传递Bitmap的两种简单方式及其缺陷
Android传递Bitmap的几种简单方式 一,通过Intent的Bundle. 比如有两个activity,A,B,从A进入B.先在A中将Bitmap写进去: Resources res=getR ...
随机推荐
- jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站(二)
引言:首先我们可以实现一键部署网站,但在实际生产环境网站部署完成之后,我们的开发隔三差五要修改下网站的内容,难道都要我们运维手动执行命令吗?没有一种方法使得开发人员修改完代码自己测试,部署上线呢,那这 ...
- Maven工程
maven:父子工程 1,父工程并没有实质性的内容,所有的jar包都在里面,也就是说只需要管理jar包即可,不参与任务方法逻辑 2,在父工程中拥有很多的子模块,每一个子模块都代表了不用的包如(pack ...
- Scala的正则表达式
想使用scala的正则表达式,需要首先导入 import scala.util.matching.Regex 然后就可以使用了,实例如下: val pattern = new Regex(" ...
- python字符串(str)
# value = "raitOrEi" # v = value.capitalize()#首字母大写 # print(v) # v1 = v.casefold()#全部变小写,不 ...
- PRML第一章读书小结
PRML第一章读书小结 第一章用例子出发,较为简单的引入了概率论.模型.决策.损失.信息论的问题,作为机器学习从业者,读PRML除了巩固已有基础,还受到了很多新的启发,下面将我收到的启发总结如 ...
- CodeTypeDeclaration,CodeMemberProperty动态生成代码
由于是CodeDom些列,所以先介绍几个CodeDom表达式: :CodeConditionStatement:判断语句即是if(condition){} else{},看最全的那个构造函数: pub ...
- Mysql 最全查询语句
基本查询语句及语法: select distinct from where group by having limit 一.单表查询 前期表与数据准备: # 创建一张部门表 create table ...
- 【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
[题解]幼儿园篮球题(NTT+范德蒙德卷积+斯特林数) 题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊) \[ \sum_{i=1}^{S}\dfrac 1 {N \choose n_i ...
- 「学习笔记」动态规划 I『初识DP』
写在前面 注意:此文章仅供参考,如发现有误请及时告知. 更新日期:2018/3/16,2018/12/03 动态规划介绍 动态规划,简称DP(Dynamic Programming) 简介1 简介2 ...
- 小小知识点(五十一)——6G扬帆起航:拍赫兹通信与健康泛在网络助推6G新应用
转自IEEE科技纵览 https://weibo.com/ttarticle/p/show?id=2309404454066502631625 6G扬帆起航:拍赫兹通信与健康泛在网络助推6G新应用 ...