生命不息,学习不止~

尊重原创,原帖地址(豆瓣-数据铺子):

感谢 数据铺子 的“构建基于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包(中)(来源:豆瓣-数据铺子)...相关推荐

  1. python股票量化交易入门到实践_量化资料学习《Python与量化投资从基础到实战》+《量化交易之路用Python做股票量化分析》+《组织与管理研究的实证方法第2版》...

    我们需要利用Python进行数据分析的指南,有大量的关于数据处理分析的应用,重点学习如何高效地利用Python解决投资策略问题,推荐学习<Python与量化投资从基础到实战>等电子资料. ...

  2. 用Python做股票量化分析[附量化交易学习资料]

    量化交易的核心是筛选策略,策略也是依靠数学或物理模型来创造,把数学语言变成计算机语言.量化交易的流程是从数据的获取到数据的分析.处理. import pandas as pd import talib ...

  3. garch预测 python_【2019年度合辑】手把手教你用Python做股票量化分析

    引言 不知不觉,2019年已接近尾声,Python金融量化公众号也有一年零两个月.公众号自设立以来,专注于分享Python在金融量化领域的应用,发布了四十余篇原创文章,超过两万人关注.这一路走来,有过 ...

  4. 用python做股票量化分析豆瓣_小白学 Python 爬虫(24):2019 豆瓣电影排行

    人生苦短,我用 Python 前文传送门: 引言 从本篇的标题各位同学应该已经猜到了,本篇又到了实战环节~~~ 2019 已经快过完了,按照本文推送的时间预估,到 2020 应该还有十来天的时间,又到 ...

  5. 用 Python 做股票指标分析和 OBV, 真香

    近几年,Python的热度一直在涨,它的应用领域也非常广泛:自动化测试,Devops运维,爬虫工程师,Web开发,数据分析,机器学习等,不过 Python 还有一个神秘而有趣的应用领域,那就是量化交易 ...

  6. 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?

    如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...

  7. 循序渐进:用python做金融量化分析(五)MACD策略系统

    在这一节,我们引入库import talib,因为这个库里有很多的技术指标,可以直接引用,不用自己再编指标函数,非常的方便,只要一个语句macd, macdsignal, macdhist = tal ...

  8. 循序渐进:用python做金融量化分析(四)双均线系统策略

    上一节中讲了单均线系统最优参数的寻找,这一节我们开讲双均线系统,在编程设计上,双均线系统相对于单均线系统来说多了一个均线循环,在短期均线循环里面再嵌套一个长期均线循环,其它方面和单均线系统变化不大,由 ...

  9. 循序渐进:用python做金融量化分析(三)如何寻找均线系统的最优参数

    在上一节中我们讲述了简单的单移动平均线策略系统,看起来还是挺简单的,但是简单的代价就是不够智能,功能太少,如果要测试多条均线参数都要手工输入,现在我们就把它加以改进,增加一个自动寻找最佳均线的功能,有 ...

最新文章

  1. empty、isset和is_null的比较
  2. mysql5.7.17主从_MySQL 5.7主从不停机添加新从库
  3. android项目引用java项目图解和注意事项
  4. Jupyter 编写python代码实现代码自动补齐功能设置实例演示
  5. SpringBoot 之环境搭建
  6. VS2010 教程:创建一个 WPF 应用程序 (第一节)
  7. 排队接水(信息学奥赛一本通-T1319)
  8. CentOS7 服务器连接超时自动断开问题解决
  9. 第三季-第25课-UDP通讯程序设计
  10. 屏幕方向调节---LANDSCAPE与PORTRAIT
  11. php 中文手册下载
  12. Linux 服务器CPU占用率100%,使用率高解决方案
  13. 微信小程序中相机api_微信小程序调用内置照相机实现拍照及图片上传
  14. 追逐自己的梦想----------辅助制作第二十四课:寻路call的分析
  15. 仿微信朋友圈图片和视频播放
  16. EditText 里的属性
  17. EventBus的介绍和使用
  18. 如何用手机扫二维码盘点海量固定资产?
  19. omv 网站服务器,折腾篇 篇一:小白也爱折腾 篇一:N1全小白装NAS(omv)
  20. 有哪些好用的日程计划管理软件?

热门文章

  1. vue 实现前端excel导出表格携带token的两种方法
  2. win10系统中ENSP AR启动代码40报错一些解决办法
  3. 数值分析-龙格库塔法
  4. 优酷路由宝增加php,优酷路由宝旗舰版YK-L2刷改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件方法...
  5. body软件 human_Human body
  6. 计算机网络拓扑应用于,基于复杂网络理论的计算机网络拓扑研究
  7. 文华财经-wh8-MTM动力指标
  8. log(A/B) = logA -logB
  9. 广播(Broadcast)的简单用法
  10. html5 鼠标动画效果,7 个让人惊叹的 HTML5 鼠标动画