回测框架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 ...
随机推荐
- 35. Search Insert Position(二分查找)
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final 2017) Solution
A:Chat Group 题意:给出一个n, k 计算C(n, k) -> C(n,n) 的和 思路:k只有1e5 反过来想,用总的(2^ n) 减去 C(n, 0) -> C(n, k ...
- Python:数字的格式化输出
>>> 'The value is {:0,.2f}'.format(x) 'The value is 1,234.57' 需要将数字格式化后输出,并控制数字的位数.对齐.千位分隔符 ...
- gstreamer调试命令
gplay播放命令 gplay 文件全路径 (eg:gplay 123.mp3) gstreamer播放命令 gst-launch playbin2 uri=file:///文件全路径 (eg gs ...
- Python笔记 #14# Pandas: Selection
10 Minutes to pandas import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = ...
- java第七天
p38~p41: 1.可以通过import 一个自定义类库(或者网上下的)在java中使用c风格的输入输出方式. 2.忘记优先顺序时应该用括号明确规定计算顺序. 3.java的操作符不同于c++,几乎 ...
- 常用php操作redis命令整理(五)ZSET类型
ZADD 向有序集合插入一个元素,元素关联一个数值,插入成功返回1,同时集合元素不可以重复, 如果元素已经存在返回 0 <?php var_dump($redis->zadd(,'A')) ...
- poj2262 Goldbach's Conjecture
poj2262 Goldbach's Conjecture 用欧拉筛把素数筛出来,再枚举一下. #include<iostream> #include<cstdio> #inc ...
- BZOJ2938:[POI2000]病毒(AC自动机)
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- 微信小程序:WXML 模板
微信小程序:WXML 模板 一.WXML 模板 网页编程采用的是 HTML + CSS + JS 这样的组合,其中 HTML 是用来描述当前这个页面的结构,CSS 用来描述页面的样子,JS 通常是用来 ...