pybacktest 教程

本教程让你快速了解 pybacktest's 的功能。为此,我们回测精典交易策略移动平均线MA交叉。

  • MA快线上穿慢线时,买进做多
  • MA快线下穿慢线时,卖出做空
  • 进场规则,也是退场规则,交易策略相反相成

软件包在此下载 https://github.com/ematvey/pybacktest

  1. import pybacktest
  2. import pandas as pd

pybacktest 要求的 k 线数据格式为 pandas.DataFrame ,以时间戳为索引,各列字段名称为 OHLC。实际上,目前只检查字段O的值是否为空。

从yahoo下载数据。

  1. ohlc = pybacktest.load_from_yahoo('SPY')
  1. 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。

够简单的吧?

  1. short_ma = 50
  2. long_ma = 200
  3. ms = pandas.rolling_mean(ohlc.C, short_ma)
  4. ml = pandas.rolling_mean(ohlc.C, long_ma)
  5. buy = cover = (ms > ml) & (ms.shift() < ml.shift())  # ma cross up
  6. sell = short = (ms < ml) & (ms.shift() > ml.shift())  # ma cross down
  7. print '>  Short MA\n%s\n' % ms.tail()
  8. print '>  Long MA\n%s\n' % ml.tail()
  9. print '>  Buy/Cover signals\n%s\n' % buy.tail()
  10. print '>  Short/Sell signals\n%s\n' % sell.tail()
  1.  
  1. > Short MA
  2. Date
  3. 2013-04-22 154.5438
  4. 2013-04-23 154.6634
  5. 2013-04-24 154.7856
  6. 2013-04-25 154.9156
  7. 2013-04-26 155.0374
  8.  
  9. > Long MA
  10. Date
  11. 2013-04-22 145.50725
  12. 2013-04-23 145.60910
  13. 2013-04-24 145.71455
  14. 2013-04-25 145.82970
  15. 2013-04-26 145.94430
  16.  
  17. > Buy/Cover signals
  18. Date
  19. 2013-04-22 False
  20. 2013-04-23 False
  21. 2013-04-24 False
  22. 2013-04-25 False
  23. 2013-04-26 False
  24.  
  25. > Short/Sell signals
  26. Date
  27. 2013-04-22 False
  28. 2013-04-23 False
  29. 2013-04-24 False
  30. 2013-04-25 False
  31. 2013-04-26 False

开始回测吧。访问类对象 Backtest 的第一个参数,是从字典式的对象中剥离出的交易信号、价格等。可以是字典、pandas.DataFrame 或者其他任何东西。

为了简化编程,把局部命名空间用函数 locals()传递过去。命名空间的内容,是至今你所创建的全部变量

  1. bt = pybacktest.Backtest(locals(), 'ma_cross')

Backtest 工作懒惰,只有在你访问它的属性时,它才会进行运算。它所运算的属性包括:

 
  1. print filter(lambda x: not x.startswith('_'), dir(bt))
  2. print '\n>  bt.signals\n%s' % bt.signals.tail()
  3. print '\n>  bt.trades\n%s' % bt.trades.tail()
  4. print '\n>  bt.positions\n%s' % bt.positions.tail()
  5. print '\n>  bt.equity\n%s' % bt.equity.tail()
  6. 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']

  1. > bt.signals
  2. Buy Cover Sell Short
  3. Date
  4. 2013-04-22 False False False False
  5. 2013-04-23 False False False False
  6. 2013-04-24 False False False False
  7. 2013-04-25 False False False False
  8. 2013-04-26 False False False False
  9.  
  10. > bt.trades
  11. pos price vol
  12. Date
  13. 2009-06-23 1 90.16 2
  14. 2010-07-06 -1 103.13 -2
  15. 2010-10-22 1 119.14 2
  16. 2011-08-12 -1 119.19 -2
  17. 2012-01-31 1 132.29 2
  18.  
  19. > bt.positions
  20. Date
  21. 2009-06-23 1
  22. 2010-07-06 -1
  23. 2010-10-22 1
  24. 2011-08-12 -1
  25. 2012-01-31 1
  26.  
  27. > bt.equity
  28. Date
  29. 2009-06-23 58.66
  30. 2010-07-06 12.97
  31. 2010-10-22 -16.01
  32. 2011-08-12 0.05
  33. 2012-01-31 -13.10
  34.  
  35. > bt.trade_price
  36. Date
  37. 2013-04-22 156.95
  38. 2013-04-23 157.83
  39. 2013-04-24 158.34
  40. 2013-04-25 158.33
  41. 2013-04-26 NaN
  42. Name: O

调用 Backtest 的函数summary ,可以得知常用的运算和运行数据

 
  1. bt.summary()

Backtest('ma_cross', 2013-28-04 23:14:15 MSK) performance summary

  1. =================================================================
  2. backtest:
  3. days: 6348
  4. from: '1994-09-14 00:00:00'
  5. to: '2012-01-31 00:00:00'
  6. trades: 17
  7. exposure:
  8. holding periods:
  9. max: 1476 days, 0:00:00
  10. median: 354 days, 0:00:00
  11. min: 7 days, 0:00:00
  12. trades/month: 1.0625
  13. performance:
  14. PF: 4.017
  15. RF: 6.1555
  16. averages:
  17. gain: 23.817
  18. loss: -8.47
  19. trade: 10.5224
  20. payoff: 2.8119
  21. profit: 178.88
  22. winrate: 0.5882
  23. risk/return profile:
  24. UPI: 1.0656
  25. WCDD (monte-carlo 0.99 quantile): 52.09
  26. maxdd: 74.67
  27. sharpe: 0.4485
  28. sortino: 1.6792
  29.  
  30. -----------------------------------------------------------------

看看净资产曲线吧。

 
  1. figsize(10, 5)
  2. bt.plot_equity()

回测运行过程中的精确图形,Backtest 可以为你画出。图中的说明 Legend 省略了,以节省空间。

 
  1. bt.plot_trades()
  2. pandas.rolling_mean(ohlc.C, short_ma).plot(c='green')
  3. pandas.rolling_mean(ohlc.C, long_ma).plot(c='blue')
  4. legend(loc='upper left')

<matplotlib.legend.Legend at 0x49eea10>

 

你能完全看清吗?我不行。因此,有个特别属性 trdplot ,让你用pandas的索引机制,指定你要画出的期间。而用属性 eqplot,可以画出净资产曲线。

 
  1. bt.trdplot['2004':'2007']
  2. pandas.rolling_mean(ohlc.C['2004':'2007'], short_ma).plot(c='green')
  3. pandas.rolling_mean(ohlc.C['2004':'2007'], long_ma).plot(c='blue')

<matplotlib.axes.AxesSubplot at 0x7f7f38c09e50>

 
 
以上是pybacktest的大部分内容。下一个教程,会涉及更多高级功能。

回测框架pybacktest简介(一)的更多相关文章

  1. 回测框架pybacktest简介(二)

    pybacktest 的疑点 第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成. 为了阅读方便,合并在一起. 本文转载于:http://blog.csdn. ...

  2. 量化投资策略:常见的几种Python回测框架(库)

    量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...

  3. OnePy--构建属于自己的量化回测框架

    本文主要记录我构建量化回测系统的学习历程. 被遗弃的项目:Chandlercjy/OnePy_Old 新更新中的项目:Chandlercjy/OnePy 目录 1. 那究竟应该学习哪种编程语言比较好呢 ...

  4. 量化投资学习笔记01——初识Pyalgotrade量化交易回测框架

    年初学习量化投资,一开始想自己从头写,还是受了C/C++的影响.结果困在了计算回测数据那里,结果老也不对,就暂时放下了.最近试了一下python的各个量化投资框架,发现一个能用的——pyalgotra ...

  5. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...

  6. 量化框架zipline--分钟回测改写

    转自:http://www.cnblogs.com/dxf813/p/7845398.html 基于zipline的分钟回测改写,其中数据源为自定义,使用bcolz的ctable,该数据格式与pand ...

  7. WeQuant教程—1.3 利用回测工具降低交易风险

    量化系统投入实际使用之前,人们会希望提前测试交易的效果.这个期间往往涉及代码的改动和参数的调整.最常见的做法是将历史数据输入量化系统,让量化系统根据既定的交易逻辑进行操作,观察和分析交易结果,找到问题 ...

  8. 如何使用TradingView(TV)回测数字货币交易策略

    更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...

  9. 用Python编写的第一个回测程序

    用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...

随机推荐

  1. Linux下安装系统清理软件 BleachBit 1.4

    sudo add-apt-repository ppa:n-muench/programs-ppasudo apt-get updatesudo apt-get install bleachbit

  2. 牛客国庆集训派对Day2 Solution

    A    矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 in ...

  3. hdu5102 枚举每条边的长度

    题意 给了 一颗 有 100000 个节点的树, 他们构成的边有 n*(n-1)/2 种. 每条边有一个长度,长度排序后 取前K条的 和, 枚举每条长度为1 的边 放进队列,然后通过成都为1 的表去 ...

  4. 20155207 2016-2017-2 《Java程序设计》第八周学习总结

    20155207 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第15章 通用API 15.1 日志 15.1.1 日志API简介 java.util.lo ...

  5. centos设置代理上网

    centos设置代理上网   假设我们要设置代理为 IP:PORT 1.网页上网 网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->> ...

  6. Flume环境安装

    源码包下载: http://archive.apache.org/dist/flume/1.8.0/ 集群环境: master 192.168.1.99 slave1 192.168.1.100 sl ...

  7. Python笔记 #18# Pandas: Grouping

    10 Minutes to pandas 引 By “group by” we are referring to a process involving one or more of the foll ...

  8. Github 下载项目的某一分支版本

    参考:如何在 GitHub 下载某个程序的特定版本(代码)? 在安装ntf做int实验的时候,发现int demo的这个repo是该项目的一个branch,与master分支不一致(5 commits ...

  9. HDU 3488 Tour(最小费用流:有向环最小权值覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意: 给出n个点和m条边,每条边有距离,把这n个点分成1个或多个环,且每个点只能在一个环中,保证有解. ...

  10. 雷林鹏分享:Ruby 发送邮件 - SMATP

    Ruby 发送邮件 - SMATP SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. ...