回测框架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 ...
随机推荐
- Linux下安装系统清理软件 BleachBit 1.4
sudo add-apt-repository ppa:n-muench/programs-ppasudo apt-get updatesudo apt-get install bleachbit
- 牛客国庆集训派对Day2 Solution
A 矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 in ...
- hdu5102 枚举每条边的长度
题意 给了 一颗 有 100000 个节点的树, 他们构成的边有 n*(n-1)/2 种. 每条边有一个长度,长度排序后 取前K条的 和, 枚举每条长度为1 的边 放进队列,然后通过成都为1 的表去 ...
- 20155207 2016-2017-2 《Java程序设计》第八周学习总结
20155207 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第15章 通用API 15.1 日志 15.1.1 日志API简介 java.util.lo ...
- centos设置代理上网
centos设置代理上网 假设我们要设置代理为 IP:PORT 1.网页上网 网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->> ...
- Flume环境安装
源码包下载: http://archive.apache.org/dist/flume/1.8.0/ 集群环境: master 192.168.1.99 slave1 192.168.1.100 sl ...
- Python笔记 #18# Pandas: Grouping
10 Minutes to pandas 引 By “group by” we are referring to a process involving one or more of the foll ...
- Github 下载项目的某一分支版本
参考:如何在 GitHub 下载某个程序的特定版本(代码)? 在安装ntf做int实验的时候,发现int demo的这个repo是该项目的一个branch,与master分支不一致(5 commits ...
- HDU 3488 Tour(最小费用流:有向环最小权值覆盖)
http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意: 给出n个点和m条边,每条边有距离,把这n个点分成1个或多个环,且每个点只能在一个环中,保证有解. ...
- 雷林鹏分享:Ruby 发送邮件 - SMATP
Ruby 发送邮件 - SMATP SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. ...