回测框架pybacktest简介(一)
pybacktest 教程
本教程让你快速了解 pybacktest's 的功能。为此,我们回测精典交易策略移动平均线MA交叉。
- MA快线上穿慢线时,买进做多
- MA快线下穿慢线时,卖出做空
- 进场规则,也是退场规则,交易策略相反相成
软件包在此下载 https://github.com/ematvey/pybacktest
- import pybacktest
- import pandas as pd
pybacktest 要求的 k 线数据格式为 pandas.DataFrame
,以时间戳为索引,各列字段名称为 O
, H
, L
, C。实际上,目前只检查字段O的值是否为空。
从yahoo下载数据。
- ohlc = pybacktest.load_from_yahoo('SPY')
- ohlc.tail()
O | H | L | C | V | AC | |
---|---|---|---|---|---|---|
Date | ||||||
2013-04-22 | 155.78 | 156.54 | 154.75 | 156.17 | 106501600 | 156.17 |
2013-04-23 | 156.95 | 157.93 | 156.17 | 157.78 | 165950600 | 157.78 |
2013-04-24 | 157.83 | 158.30 | 157.54 | 157.88 | 96724000 | 157.88 |
2013-04-25 | 158.34 | 159.27 | 158.10 | 158.52 | 130916000 | 158.52 |
2013-04-26 | 158.33 | 158.60 | 157.73 | 158.24 | 95904500 | 158.24 |
定义交易策略。要创建以 True和False 表示交易信号的 Series
,和以浮点数表示交易价格的 Series。
够简单的吧?
- short_ma = 50
- long_ma = 200
- ms = pandas.rolling_mean(ohlc.C, short_ma)
- ml = pandas.rolling_mean(ohlc.C, long_ma)
- buy = cover = (ms > ml) & (ms.shift() < ml.shift()) # ma cross up
- sell = short = (ms < ml) & (ms.shift() > ml.shift()) # ma cross down
- print '> Short MA\n%s\n' % ms.tail()
- print '> Long MA\n%s\n' % ml.tail()
- print '> Buy/Cover signals\n%s\n' % buy.tail()
- print '> Short/Sell signals\n%s\n' % sell.tail()
> Short MA
Date
2013-04-22 154.5438
2013-04-23 154.6634
2013-04-24 154.7856
2013-04-25 154.9156
2013-04-26 155.0374 > Long MA
Date
2013-04-22 145.50725
2013-04-23 145.60910
2013-04-24 145.71455
2013-04-25 145.82970
2013-04-26 145.94430 > Buy/Cover signals
Date
2013-04-22 False
2013-04-23 False
2013-04-24 False
2013-04-25 False
2013-04-26 False > Short/Sell signals
Date
2013-04-22 False
2013-04-23 False
2013-04-24 False
2013-04-25 False
2013-04-26 False
开始回测吧。访问类对象 Backtest
的第一个参数,是从字典式的对象中剥离出的交易信号、价格等。可以是字典、pandas.DataFrame 或者其他任何东西。
为了简化编程,把局部命名空间用函数 locals()传递过去。命名空间的内容,是至今你所创建的全部变量
。
- bt = pybacktest.Backtest(locals(), 'ma_cross')
Backtest
工作懒惰,只有在你访问它的属性时,它才会进行运算。它所运算的属性包括:
- print filter(lambda x: not x.startswith('_'), dir(bt))
- print '\n> bt.signals\n%s' % bt.signals.tail()
- print '\n> bt.trades\n%s' % bt.trades.tail()
- print '\n> bt.positions\n%s' % bt.positions.tail()
- print '\n> bt.equity\n%s' % bt.equity.tail()
- print '\n> bt.trade_price\n%s' % bt.trade_price.tail()
['dataobj', 'default_price', 'eqplot', 'equity', 'name', 'ohlc', 'plot_equity', 'plot_trades', 'positions', 'prices', 'report', 'run_time', 'signals', 'sigplot', 'summary', 'trade_price', 'trades', 'trdplot']
> bt.signals
Buy Cover Sell Short
Date
2013-04-22 False False False False
2013-04-23 False False False False
2013-04-24 False False False False
2013-04-25 False False False False
2013-04-26 False False False False > bt.trades
pos price vol
Date
2009-06-23 1 90.16 2
2010-07-06 -1 103.13 -2
2010-10-22 1 119.14 2
2011-08-12 -1 119.19 -2
2012-01-31 1 132.29 2 > bt.positions
Date
2009-06-23 1
2010-07-06 -1
2010-10-22 1
2011-08-12 -1
2012-01-31 1 > bt.equity
Date
2009-06-23 58.66
2010-07-06 12.97
2010-10-22 -16.01
2011-08-12 0.05
2012-01-31 -13.10 > bt.trade_price
Date
2013-04-22 156.95
2013-04-23 157.83
2013-04-24 158.34
2013-04-25 158.33
2013-04-26 NaN
Name: O
调用 Backtest 的函数summary ,可以得知常用的运算和运行数据
- bt.summary()
Backtest('ma_cross', 2013-28-04 23:14:15 MSK) performance summary
=================================================================
backtest:
days: 6348
from: '1994-09-14 00:00:00'
to: '2012-01-31 00:00:00'
trades: 17
exposure:
holding periods:
max: 1476 days, 0:00:00
median: 354 days, 0:00:00
min: 7 days, 0:00:00
trades/month: 1.0625
performance:
PF: 4.017
RF: 6.1555
averages:
gain: 23.817
loss: -8.47
trade: 10.5224
payoff: 2.8119
profit: 178.88
winrate: 0.5882
risk/return profile:
UPI: 1.0656
WCDD (monte-carlo 0.99 quantile): 52.09
maxdd: 74.67
sharpe: 0.4485
sortino: 1.6792 -----------------------------------------------------------------
看看净资产曲线吧。
- figsize(10, 5)
- bt.plot_equity()
回测运行过程中的精确图形,Backtest 可以为你画出。图中的说明 Legend 省略了,以节省空间。
- bt.plot_trades()
- pandas.rolling_mean(ohlc.C, short_ma).plot(c='green')
- pandas.rolling_mean(ohlc.C, long_ma).plot(c='blue')
- legend(loc='upper left')
<matplotlib.legend.Legend at 0x49eea10>
你能完全看清吗?我不行。因此,有个特别属性 trdplot
,让你用pandas的索引机制,指定你要画出的期间。而用属性 eqplot,可以画出净资产曲线。
- bt.trdplot['2004':'2007']
- pandas.rolling_mean(ohlc.C['2004':'2007'], short_ma).plot(c='green')
- pandas.rolling_mean(ohlc.C['2004':'2007'], long_ma).plot(c='blue')
<matplotlib.axes.AxesSubplot at 0x7f7f38c09e50>
回测框架pybacktest简介(一)的更多相关文章
- 回测框架pybacktest简介(二)
pybacktest 的疑点 第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成. 为了阅读方便,合并在一起. 本文转载于:http://blog.csdn. ...
- 量化投资策略:常见的几种Python回测框架(库)
量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...
- OnePy--构建属于自己的量化回测框架
本文主要记录我构建量化回测系统的学习历程. 被遗弃的项目:Chandlercjy/OnePy_Old 新更新中的项目:Chandlercjy/OnePy 目录 1. 那究竟应该学习哪种编程语言比较好呢 ...
- 量化投资学习笔记01——初识Pyalgotrade量化交易回测框架
年初学习量化投资,一开始想自己从头写,还是受了C/C++的影响.结果困在了计算回测数据那里,结果老也不对,就暂时放下了.最近试了一下python的各个量化投资框架,发现一个能用的——pyalgotra ...
- 手把手教你用Python搭建自己的量化回测框架【均值回归策略】
手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...
- 量化框架zipline--分钟回测改写
转自:http://www.cnblogs.com/dxf813/p/7845398.html 基于zipline的分钟回测改写,其中数据源为自定义,使用bcolz的ctable,该数据格式与pand ...
- WeQuant教程—1.3 利用回测工具降低交易风险
量化系统投入实际使用之前,人们会希望提前测试交易的效果.这个期间往往涉及代码的改动和参数的调整.最常见的做法是将历史数据输入量化系统,让量化系统根据既定的交易逻辑进行操作,观察和分析交易结果,找到问题 ...
- 如何使用TradingView(TV)回测数字货币交易策略
更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...
- 用Python编写的第一个回测程序
用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...
随机推荐
- django基于cors做跨域处理
背景知识:跨域相关与cors策略 1.安装django-cors-headers pip install django-cors-headers 2.settings.py配置 INSTALLED_A ...
- VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)
上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button.Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件 ...
- 《C++ Concurrency in Action》
http://wiki.jikexueyuan.com/project/cplusplus-concurrency-action/content/resources/resource.html
- 前端学习笔记之CSS文档流
先引用一段W3C的文档: 9.3 Positioning schemes In CSS 2.1, a box may be laid out according to three positionin ...
- Ubuntu下的MongoDB GUI 可视化管理工具
目录 1 Robo 3T 2 NoSQLBooster for MongoDB(收费) 3 JetBrains Plugin Repository :: Mongo Plugin Ubuntu下的Mo ...
- 20145307陈俊达《网络对抗》shellcode注入&return to libc
20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...
- CentOS日常维护及常用脚本
[root@-.x.x xiewenming]# curl myip.ipip.net 当前 IP:42.62.x.x 来自于:中国 北京 北京 联通/电信 www.17ce.com cdn解析网站 ...
- Matlab绘图基础——用print函数批量保存图片到文件(Print figure or save to file)
一.用法解析 1.1. 分辨率-rnumber 1.2. 输出图片的“格式”formats 二.用法示例 2.1. 设置输出图片的“图像纵横比” 2.2. Batch Processing(图片保存 ...
- Environment.NewLine
https://docs.microsoft.com/en-us/dotnet/api/system.environment.newline?view=netframework-4.7.2 https ...
- enum SQLiteDateFormats
DateTimeFormatInfo.CurrentInfo https://msdn.microsoft.com/en-us/library/system.globalization.datetim ...