打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
pyalgotrade教程3

        我们写好策略,最好回测后,其实是很有必要看一下我们策略的效果,一般采用可视化的折线图与一些指标相结合的方式来评价一个策略。

1.策略可视化

        在pyalgotrade中,已经为我们提供了很好用的可视化模块了,plotter。

        所以,一开始我们先导入模块。

[python] view plain copy
  1. from pyalgotrade import plotter  

        把策略的净值图、买卖开仓情况绘制出来其实很简单,把我们的策略实例化之后,传给plotter就可以了。

[python] view plain copy
  1. myStrategy = MyStrategy(feed, "fd")# 策略实例化  
  2. plt = plotter.StrategyPlotter(myStrategy) # 传入策略  
  3. myStrategy.run()# 运行策略  
  4. myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())  
  5. plt.plot()# 绘制  
效果如如下:

可以看出,只有交易的时点标志和portfolio的净值曲线。


2.评价指标

        对于一个策略而言,评价指标当然有很多。

        这一类,在pyalgotrade里面都封装在了pyalgotrade.stratanalyzer里面,里面大概有如下几类评价指标:

a)  class pyalgotrade.stratanalyzer.returns.Returns(maxLen=None)

Returns:包含两种,一个是累计收益率,通过getCumulativeReturns()获得;一种是每个bar的收益率,通过getReturns()获得,返回值都是一个DataSeries

b) class pyalgotrade.stratanalyzer.sharpe.SharpeRatio(useDailyReturns=True)

参数为真,表示使用每日的收益率计算sharpratio,否则的话,按照bar算。通过getSharpeRatio(riskFreeRate, annualized=True)来获得夏普率,其中,第一个参数是无风险利率,后面一个是是否年化的设置。

c) class pyalgotrade.stratanalyzer.drawdown.DrawDown()

回测的指标,有两个:

getLongestDrawDownDuration(),返回的是datetime.timedelta类型,表示最长的回撤时间长度。

getMaxDrawDown(),返回的是最大回撤。

d) class pyalgotrade.stratanalyzer.trades.Trades

这个指标的内容很多。

getCount():返回总的交易次数
getProfitableCount():返回盈利的交易次数
getUnprofitableCount():返回亏损的交易次数
getEvenCount():返回不赚不亏的交易次数
getAll():返回一个numpy.array的数据,内容是每次交易的盈亏
getProfits():返回一个numpy.array的数据,内容是,每次盈利交易的盈利
getLosses():返回一个numpy.array的数据,内容是每次亏损交易的亏损额
getAllReturns():返回一个numpy.array的数据,内容是每次交易的盈利,是百分比的形式
getPositiveReturns():返回一个numpy.array的数据,内容是,每次盈利交易的收益

getNegativeReturns():返回一个numpy.array的数据,内容是每次亏损交易的损失
下面是四种情况下的手续费
getCommissionsForAllTrades()
getCommissionsForProfitableTrades()
getCommissionsForUnprofitableTrades()
getCommissionsForEvenTrades()
使用这些指标的步骤如下:

(1)import相关指标

[python] view plain copy
  1. from pyalgotrade.stratanalyzer import returns, sharpe, drawdown, trades  
(2)构实例化一个指标的类

[python] view plain copy
  1. sharpe_ratio = sharpe.SharpeRatio()  
(3)向策略中添加这个指标类

[python] view plain copy
  1. myStrategy.attachAnalyzer(sharpe_ratio)  
(4)运行策略

[python] view plain copy
  1. myStrategy.run()  
(5)获取结果

[python] view plain copy
  1. print "sharpe_ratio", sharpe_ratio.getSharpeRatio(0)  
这里,0是无风险利率。

3.代码

[python] view plain copy
  1. # coding=utf-8  
  2. from pyalgotrade import plotter  
  3. from pyalgotrade.stratanalyzer import returns, sharpe, drawdown, trades  
  4. from pyalgotrade import strategy  
  5. from pyalgotrade.bar import Frequency  
  6. from pyalgotrade.barfeed.csvfeed import GenericBarFeed  
  7. from pyalgotrade.technical import ma  
  8. # 1.构建一个策略  
  9. class MyStrategy(strategy.BacktestingStrategy):  
  10.     def __init__(self, feed, instrument):  
  11.         super(MyStrategy, self).__init__(feed)  
  12.         self.__position = None  
  13.         self.__sma = ma.SMA(feed[instrument].getCloseDataSeries(), 150)  
  14.         self.__instrument = instrument  
  15.         self.getBroker()  
  16.     def onEnterOk(self, position):  
  17.         execInfo = position.getEntryOrder().getExecutionInfo()  
  18.         self.info("BUY at %.2f" % (execInfo.getPrice()))  
  19.   
  20.     def onEnterCanceled(self, position):  
  21.         self.__position = None  
  22.   
  23.     def onExitOk(self, position):  
  24.         execInfo = position.getExitOrder().getExecutionInfo()  
  25.         self.info("SELL at $%.2f" % (execInfo.getPrice()))  
  26.         self.__position = None  
  27.   
  28.     def onExitCanceled(self, position):  
  29.         # If the exit was canceled, re-submit it.  
  30.         self.__position.exitMarket()  
  31.   
  32.     def getSMA(self):  
  33.         return self.__sma  
  34.   
  35.     def onBars(self, bars):# 每一个数据都会抵达这里,就像becktest中的next  
  36.   
  37.         # Wait for enough bars to be available to calculate a SMA.  
  38.         if self.__sma[-1] is None:  
  39.             return  
  40.         #bar.getTyoicalPrice = (bar.getHigh() + bar.getLow() + bar.getClose())/ 3.0  
  41.   
  42.         bar = bars[self.__instrument]  
  43.         # If a position was not opened, check if we should enter a long position.  
  44.         if self.__position is None:  
  45.             if bar.getPrice() > self.__sma[-1]:  
  46.                 # 开多头.  
  47.                 self.__position = self.enterLong(self.__instrument, 100, True)  
  48.         # 平掉多头头寸.  
  49.         elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive():  
  50.             self.__position.exitMarket()  
  51.   
  52. # 2.获得回测数据,官网来源于yahoo,由于墙的关系,我们用本地数据  
  53. feed = GenericBarFeed(Frequency.DAY, None, None)  
  54. feed.addBarsFromCSV("fd", "fd.csv")  
  55.   
  56. # 3.实例化策略  
  57. myStrategy = MyStrategy(feed, "fd")  
  58. # 4.设置指标和绘图  
  59. sharpe_ratio = sharpe.SharpeRatio()  
  60. myStrategy.attachAnalyzer(sharpe_ratio)  
  61. plt = plotter.StrategyPlotter(myStrategy)  
  62.   
  63. # 5.运行策略  
  64. myStrategy.run()  
  65. myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())  
  66.   
  67. # 6.输出夏普率、绘图  
  68. print "sharpe_ratio", sharpe_ratio.getSharpeRatio(0)  
  69. plt.plot()  








本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
pyalgotrade量化回测框架简单试用
backtrader量化回测框架入门与参数调优
Backtrader量化平台教程(七)Optimizer
backtrader指标体系:多支股票的指标计算
金融科技领域最受欢迎的八个Python库
分享自己手敲的python tushare pyalgotrade获取数据加回测体系
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服