用python做股票量化分析豆瓣_[转]构建基于R的交易系统(5)quantstrat包(中)(来源:豆瓣-数据铺子)...
生命不息,学习不止~
尊重原创,原帖地址(豆瓣-数据铺子):
感谢 数据铺子 的“构建基于R的交易系统”系列帖子。
--- faruto按
(2)基于quantstrat包的回测:单资产情况
现在可以结合quantstrat包和blotter包给出一个更好的量化策略回测。 首先做初始化,这里包括blotter包里边对金融工具和账户和组合的初始化,也包括quantstrat包对策略和指令的初始化。
下面以上一篇用过的faber策略为例。
library(quantstrat)
#
金融产品初始化
currency("RMB")
## [1]
"RMB"
stock("ZSYH", currency = "RMB", multiplier = 1)
## [1]
"ZSYH"
#
设定时区
Sys.setenv(TZ = "UTC")
#
读取金融交易数据并转化为月数据
ZSYH
getSymbols("600036.ss", from = "2008-01-01", to = Sys.Date(), src =
"yahoo",
auto.assign = FALSE)
## As of
0.4-0, 'getSymbols' uses env=parent.frame() and auto.assign=TRUE
by
##
default.
##
## This
behavior will be phased out in 0.5-0 when the call will default
to
## use
auto.assign=FALSE. getOption("getSymbols.env") and
##
getOptions("getSymbols.auto.assign") are now checked for
alternate
##
defaults
##
## This
message is shown once per session and may be disabled by
setting
##
options("getSymbols.warning4.0"=FALSE). See ?getSymbol for more
details
ZSYH
to.monthly(ZSYH, indexAt = "endof")
ZSYH$SMA10m
head(ZSYH$SMA10m)
##
SMA10m
##
2008-01-31 NA
##
2008-02-29 NA
##
2008-03-31 NA
##
2008-04-30 NA
##
2008-05-30 NA
##
2008-06-30 NA
#
初始化组合和账户
q.strategy
initPortf(q.strategy, "ZSYH", initDate =
"2007-12-31")
## [1]
"qFaber"
initAcct(q.strategy, portfolios = q.strategy, initDate =
"2007-12-31", initEq = 1e+06)
## [1]
"qFaber"
#
初始化指定和策略
initOrders(portfolio = q.strategy, initDate =
"2007-12-31")
strategy(q.strategy, store = TRUE)
ls(all =
T) #quantstrat创建了.strategy环境
## [1]
".blotter" ".strategy" "q.strategy" "ZSYH"
#
策略是什么呢?看一下
strategy
summary(strategy)
## Length
Class Mode
## name 1
-none- character
## assets
0 -none- NULL
##
indicators 0 -none- list
## signals
0 -none- list
## rules 1
-none- list
##
constraints 0 -none- NULL
## init 0
-none- list
## wrapup
0 -none- list
## call 3
-none- call
下面是quantstrat包的关键:加入指标、信号和规则。
#
加入一个指标,10月均线
add.indicator(strategy = q.strategy, name = "SMA",
arguments = list(x = quote(Cl(mktdata)),
n =
10), label = "SMA10")
## [1]
"qFaber"
#
加入信号,向上交叉10月线,向下交叉10月线
add.signal(q.strategy, name = "sigCrossover", arguments =
list(columns = c("Close",
"SMA10"), relationship = "gt"), label = "Cl.gt.SMA")
## [1]
"qFaber"
add.signal(q.strategy, name = "sigCrossover", arguments =
list(columns = c("Close",
"SMA10"), relationship = "lt"), label = "Cl.lt.SMA")
## [1]
"qFaber"
#
加入规则,买入规则和卖出规则
add.rule(q.strategy, name = "ruleSignal", arguments =
list(sigcol = "Cl.gt.SMA",
sigval = TRUE, orderqty = 900, ordertype = "market", orderside =
"long",
pricemethod = "market"), type = "enter", path.dep = TRUE) #
买入数量为900股
## [1]
"qFaber"
add.rule(q.strategy, name = "ruleSignal", arguments =
list(sigcol = "Cl.lt.SMA",
sigval = TRUE, orderqty = "all", ordertype = "market", orderside =
"long",
pricemethod = "market"), type = "exit", path.dep = TRUE)
## [1]
"qFaber"
#
此时的策略对象
summary(getStrategy(q.strategy))
## Length
Class Mode
## name 1
-none- character
## assets
0 -none- NULL
##
indicators 1 -none- list
## signals
2 -none- list
## rules 3
-none- list
##
constraints 0 -none- NULL
## init 0
-none- list
## wrapup
0 -none- list
## call 3
-none- call
现在的策略strategy中有1个指标,2种信号和相应的两个规则(买入、卖出)。
下面可以使用这个策略了。
out
applyStrategy(strategy = q.strategy, portfolios =
q.strategy)
## [1]
"2009-05-29 00:00:00 ZSYH 900 @ 12.97"
## [1]
"2010-01-29 00:00:00 ZSYH -900 @ 15.17"
## [1]
"2010-10-29 00:00:00 ZSYH 900 @ 14.57"
## [1]
"2010-11-30 00:00:00 ZSYH -900 @ 13.05"
## [1]
"2011-03-31 00:00:00 ZSYH 900 @ 14.09"
## [1]
"2011-06-30 00:00:00 ZSYH -900 @ 13.02"
## [1]
"2012-01-31 00:00:00 ZSYH 900 @ 12.65"
## [1]
"2012-03-30 00:00:00 ZSYH -900 @ 11.9"
## [1]
"2012-04-30 00:00:00 ZSYH 900 @ 12.2"
## [1]
"2012-05-31 00:00:00 ZSYH -900 @ 11.66"
## [1]
"2012-12-31 00:00:00 ZSYH 900 @ 13.75"
## [1]
"2013-06-28 00:00:00 ZSYH -900 @ 11.6"
summary(out)
## Length
Class Mode
## qFaber
1 -none- list
mktdata["2013"]
##
ZSYH.Open ZSYH.High ZSYH.Low ZSYH.Close ZSYH.Volume
##
2013-01-31 13.75 14.80 13.16 14.30 2.467e+09
##
2013-02-28 14.20 15.01 12.58 13.30 1.906e+09
##
2013-03-29 13.30 13.60 11.70 12.63 1.979e+09
##
2013-04-30 12.49 12.98 12.01 12.15 9.797e+08
##
2013-05-31 12.15 14.10 11.95 13.58 1.909e+09
##
2013-06-28 13.58 13.89 10.00 11.60 1.253e+09
##
2013-07-31 11.50 12.43 10.40 10.60 1.322e+09
##
2013-08-30 10.69 12.14 10.35 10.66 1.257e+09
##
2013-09-30 10.66 12.19 10.61 10.92 1.659e+09
##
2013-10-31 10.92 11.10 10.55 10.74 1.061e+09
##
2013-11-01 10.87 10.95 10.79 10.91 6.854e+07
##
ZSYH.Adjusted ZSYH.Close.SMA.10.SMA10 Cl.gt.SMA
Cl.lt.SMA
##
2013-01-31 13.68 11.31 NA NA
##
2013-02-28 12.73 11.42 NA NA
##
2013-03-29 12.09 11.52 NA NA
##
2013-04-30 11.63 11.64 NA NA
##
2013-05-31 13.00 12.00 NA NA
##
2013-06-28 11.60 12.16 NA 1
##
2013-07-31 10.60 12.20 NA NA
##
2013-08-30 10.66 12.26 NA NA
##
2013-09-30 10.92 12.35 NA NA
##
2013-10-31 10.74 12.05 NA NA
##
2013-11-01 10.91 11.71 NA NA
mktdata是在执行策略过程中创建的一个特殊的变量,包含了原交易数据的时间序列以及指标和信号。在我们上面的ZSYH里,在2013年6月出现一次卖出的信号。
接下来对相关对象(组合、账户和权益价值)进行更新。
updatePortf(q.strategy)
##
Warning: instrument USD not found, please create it first.
Warning:
##
CurrencyUSD not found, using currency multiplier of 1
## [1]
"qFaber"
updateAcct(q.strategy)
## [1]
"qFaber"
updateEndEq(q.strategy)
## [1]
"qFaber"
最后按照现在的组合和账户情况给出策略表现
myTheme
myTheme$col$dn.col
myTheme$col$up.col
myTheme$col$dn.border
myTheme$col$up.border
#
策略表现可视化
chart.Posn(q.strategy, Symbol = "ZSYH", Dates = "2008::",
theme = myTheme)
# 交易统计
(tstats
"ZSYH"))
##
Portfolio Symbol Num.Txns Num.Trades Net.Trading.PL
Avg.Trade.PL
## ZSYH
qFaber ZSYH 12 6 -3447 -574.5
##
Med.Trade.PL Largest.Winner Largest.Loser Gross.Profits
Gross.Losses
## ZSYH
-819 1980 -1935 1980 -5427
##
Std.Dev.Trade.PL Percent.Positive Percent.Negative
Profit.Factor
## ZSYH
1355 16.67 83.33 0.3648
##
Avg.Win.Trade Med.Win.Trade Avg.Losing.Trade
Med.Losing.Trade
## ZSYH
1980 1980 -1085 -963
##
Avg.Daily.PL Med.Daily.PL Std.Dev.Daily.PL Max.Drawdown
## ZSYH
-574.5 -819 1355 -9450
##
Profit.To.Max.Draw Avg.WinLoss.Ratio Med.WinLoss.Ratio
Max.Equity
## ZSYH
-0.3648 1.824 2.056 6003
##
Min.Equity End.Equity
## ZSYH
-3447 -3447
#
指令簿(order
book)
ob
getOrderBook(q.strategy)
head(ob$qFaber$ZSYH)
##
Order.Qty Order.Price Order.Type Order.Side
Order.Threshold
##
2009-05-29 "900" "12.97" "market" "long" NA
##
2010-01-29 "all" "15.17" "market" "long" NA
##
2010-10-29 "900" "14.57" "market" "long" NA
##
2010-11-30 "all" "13.05" "market" "long" NA
##
2011-03-31 "900" "14.09" "market" "long" NA
##
2011-06-30 "all" "13.02" "market" "long" NA
##
Order.Status Order.StatusTime Prefer Order.Set Txn.Fees
##
2009-05-29 "closed" "2009-06-30 00:00:00" "" NA "0"
##
2010-01-29 "closed" "2010-02-26 00:00:00" "" NA "0"
##
2010-10-29 "closed" "2010-11-30 00:00:00" "" NA "0"
##
2010-11-30 "closed" "2010-12-31 00:00:00" "" NA "0"
##
2011-03-31 "closed" "2011-04-29 00:00:00" "" NA "0"
##
2011-06-30 "closed" "2011-07-29 00:00:00" "" NA "0"
##
Rule
##
2009-05-29 "ruleSignal.rule"
##
2010-01-29 "ruleSignal.rule"
##
2010-10-29 "ruleSignal.rule"
##
2010-11-30 "ruleSignal.rule"
##
2011-03-31 "ruleSignal.rule"
##
2011-06-30 "ruleSignal.rule"
quantstrat包给出了MAE(maximum adverse
excursion)和MFE(maximum favorable
excursion)的图形
chart.ME(Portfolio = q.strategy, Symbol = "ZSYH", type =
"MAE", scale = "percent")
chart.ME(Portfolio = q.strategy, Symbol = "ZSYH", type =
"MFE", scale = "percent")
和上一篇blooter里同一个策略的回测过程作比较,quantstrat包的特点是在很大程度上标准化了交易的策略实现,把策略分解为指标、信号和规则这三个部分。对于基于技术交易指标构造的量化策略来说,这种标准化当然是很方便的。特别是需要自己构造复杂的交易策略的时候。只要把注意力集中于策略本身就可以了。
当然,blotter包和quantstrat依然有很多使用上的不方便(我这里把运行时的各种警告都忽略了,呵呵)的地方。所以我想了解或者学习这些工具更重要的意义在于:他山之石,可以攻玉。借鉴别人的工作,丰富自己的工作。
下一篇继续写quantstrat,多资产的回测。
用python做股票量化分析豆瓣_[转]构建基于R的交易系统(5)quantstrat包(中)(来源:豆瓣-数据铺子)...相关推荐
- python股票量化交易入门到实践_量化资料学习《Python与量化投资从基础到实战》+《量化交易之路用Python做股票量化分析》+《组织与管理研究的实证方法第2版》...
我们需要利用Python进行数据分析的指南,有大量的关于数据处理分析的应用,重点学习如何高效地利用Python解决投资策略问题,推荐学习<Python与量化投资从基础到实战>等电子资料. ...
- 用Python做股票量化分析[附量化交易学习资料]
量化交易的核心是筛选策略,策略也是依靠数学或物理模型来创造,把数学语言变成计算机语言.量化交易的流程是从数据的获取到数据的分析.处理. import pandas as pd import talib ...
- garch预测 python_【2019年度合辑】手把手教你用Python做股票量化分析
引言 不知不觉,2019年已接近尾声,Python金融量化公众号也有一年零两个月.公众号自设立以来,专注于分享Python在金融量化领域的应用,发布了四十余篇原创文章,超过两万人关注.这一路走来,有过 ...
- 用python做股票量化分析豆瓣_小白学 Python 爬虫(24):2019 豆瓣电影排行
人生苦短,我用 Python 前文传送门: 引言 从本篇的标题各位同学应该已经猜到了,本篇又到了实战环节~~~ 2019 已经快过完了,按照本文推送的时间预估,到 2020 应该还有十来天的时间,又到 ...
- 用 Python 做股票指标分析和 OBV, 真香
近几年,Python的热度一直在涨,它的应用领域也非常广泛:自动化测试,Devops运维,爬虫工程师,Web开发,数据分析,机器学习等,不过 Python 还有一个神秘而有趣的应用领域,那就是量化交易 ...
- 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?
如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...
- 循序渐进:用python做金融量化分析(五)MACD策略系统
在这一节,我们引入库import talib,因为这个库里有很多的技术指标,可以直接引用,不用自己再编指标函数,非常的方便,只要一个语句macd, macdsignal, macdhist = tal ...
- 循序渐进:用python做金融量化分析(四)双均线系统策略
上一节中讲了单均线系统最优参数的寻找,这一节我们开讲双均线系统,在编程设计上,双均线系统相对于单均线系统来说多了一个均线循环,在短期均线循环里面再嵌套一个长期均线循环,其它方面和单均线系统变化不大,由 ...
- 循序渐进:用python做金融量化分析(三)如何寻找均线系统的最优参数
在上一节中我们讲述了简单的单移动平均线策略系统,看起来还是挺简单的,但是简单的代价就是不够智能,功能太少,如果要测试多条均线参数都要手工输入,现在我们就把它加以改进,增加一个自动寻找最佳均线的功能,有 ...
最新文章
- empty、isset和is_null的比较
- mysql5.7.17主从_MySQL 5.7主从不停机添加新从库
- android项目引用java项目图解和注意事项
- Jupyter 编写python代码实现代码自动补齐功能设置实例演示
- SpringBoot 之环境搭建
- VS2010 教程:创建一个 WPF 应用程序 (第一节)
- 排队接水(信息学奥赛一本通-T1319)
- CentOS7 服务器连接超时自动断开问题解决
- 第三季-第25课-UDP通讯程序设计
- 屏幕方向调节---LANDSCAPE与PORTRAIT
- php 中文手册下载
- Linux 服务器CPU占用率100%,使用率高解决方案
- 微信小程序中相机api_微信小程序调用内置照相机实现拍照及图片上传
- 追逐自己的梦想----------辅助制作第二十四课:寻路call的分析
- 仿微信朋友圈图片和视频播放
- EditText 里的属性
- EventBus的介绍和使用
- 如何用手机扫二维码盘点海量固定资产?
- omv 网站服务器,折腾篇 篇一:小白也爱折腾 篇一:N1全小白装NAS(omv)
- 有哪些好用的日程计划管理软件?
热门文章
- vue 实现前端excel导出表格携带token的两种方法
- win10系统中ENSP AR启动代码40报错一些解决办法
- 数值分析-龙格库塔法
- 优酷路由宝增加php,优酷路由宝旗舰版YK-L2刷改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件方法...
- body软件 human_Human body
- 计算机网络拓扑应用于,基于复杂网络理论的计算机网络拓扑研究
- 文华财经-wh8-MTM动力指标
- log(A/B) = logA -logB
- 广播(Broadcast)的简单用法
- html5 鼠标动画效果,7 个让人惊叹的 HTML5 鼠标动画