下面是两个使用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(一):两个简单的策略的更多相关文章

  1. R语言:用简单的文本处理方法优化我们的读书体验

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...

  2. GIT将本地项目上传到Github(两种简单、方便的方法)

    GIT将本地项目上传到Github(两种简单.方便的方法) 一.第一种方法: 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安 ...

  3. 两个简单的Loading

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<JavaScript并非"按值传递"> 作者主页:myvin 博主QQ:85139 ...

  4. 两个简单方法加速DataGridView

    两个简单方法加速DataGridView (2009-03-24 16:57:13) 转载▼ 标签: 杂谈 分类: .NET DataGridView虽然好用,但是如果数据量比较大的话就会出现性能的问 ...

  5. 两种简单实现菜单高亮显示的JS类(转载)

    两种简单实现菜单高亮显示的JS类   近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web ...

  6. R语言两种方式求指定日期所在月的天数

                 R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...

  7. 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 ...

  8. Visual Studio写的项目在 IIS 服务器上运行的两种简单方法

    首先需要PC上开启了IIS服务,相关方法网上很多,也很简单 第一种:直接在项目中操作 1.创建一个项目,然后右击选中项目,右击,单击属性,打开项目属性标签页面 如图,选择Web标签,在服务器栏目中选中 ...

  9. Android传递Bitmap的两种简单方式及其缺陷

    Android传递Bitmap的几种简单方式 一,通过Intent的Bundle. 比如有两个activity,A,B,从A进入B.先在A中将Bitmap写进去: Resources res=getR ...

随机推荐

  1. 第二阶段:4.商业需求文档MRD:4.PRD-用例和规则

    类似之前的泳道图 可以在下面添加一些描述 有时候用图还是会有一些限制 不能够很好的表达

  2. ELK学习实验003:Elasticsearch 集群安装

    前面已经介绍了Elasticsearch这个工具,并对单机安装做了简单介绍,现在使用三台机器做一个elasticsearch集群 一 环境准备 1.1 机器准备 1.2 同步时间 [root@node ...

  3. Analysis of Two-Channel Generalized Sidelobe Canceller (GSC) With Post-Filtering

    作者:凌逆战 地址:https://www.cnblogs.com/LXP-Never/p/12071748.html 题目:带后置滤波的双通道广义旁瓣相消器(GSC)的分析 作者:Israel Co ...

  4. win32汇编简单实现窗口程序

    .386 .model flat,stdcall option casemap:none ;========================== ;include部分 include windows. ...

  5. Django简介、安装和入门

    python三大主流Web框架 Django 优点:大而全,自身携带的组件和功能特别特别多,类似于航空母舰 缺点:过于笨重,所需功能不多时,Django依然提供这些功能,占据内存 Flask 优点:小 ...

  6. 「Poj1845」Sumdiv 解题报告

    题面戳这里 啥都别看,只是求 \(a^b\)所有的因数的和 思路: 真没想到! 其实我们可以先将\(a^b\)分解成质因数的 因为\(a^b\)的因数肯定是\(a^b\)的质因数在一定的条件下相乘而成 ...

  7. 傅立叶变换—DFT

    背景:最近看到实验室其他同学在用傅立叶变换解决问题,我也想通过并行来解决这个问题,所以看了一下傅立叶变换的东西,感觉涵盖的东西还能多,我只是初步做了一下了解(一定很片面,但是我主要是为了应用它,主要了 ...

  8. WIN10高清壁纸

    下面给大家分享我自己收集的WIN10的壁纸(大家可以存在在自己网盘里) 百度网盘下载 提取码:dsf5

  9. 密码 | 对称加密 - AES

    一.AES 算法简介 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替换 ...

  10. 如何制作地图故事使用esri story maps

    博客作者原创 制作方法如下:http://url.cn/5dnsVQd