分享

pyalgotrade教程3

 imelee 2017-09-15

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

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()  








    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多