持续行动1期 40/100,“AI技术应用于量化投资研资”之可转债投资。

今天要讲一个量化的传统“科目”——回测。

很多人一提及量化,第一个想到的就是回测系统,写一个strategy,搞两个技术指标跑起来看看。

前面的时间我们一直在聊数据,因为数据和因子才是量化的灵魂,回测系统仅是工具,而且成熟的开源项目大把,还是很多带数据源的类似quantopian的平台。

我打算分享4个量化回测引擎:pyalgotrade, backtrader ,我自研的以及qlib内置的。

特别说明一下,qlib内置的回测系统,适合机器模型驱动的,当然你非得改造成传统事件驱动的,自己实现也可以。我会考虑把我自己的回测系统,往qlib的框架里靠一靠,如果有必要的话。

今天先看一个简单的:pyalgotrade。

安装很简单:pip install PyAlgoTrade

它的版本停留在0.2,后面应该不维护了,但基本也够用了。

https://github.com/gbeced/pyalgotrade

文档地址:

http://gbeced.github.io/pyalgotrade/

https://pyalgotrade-docs-zh-cn.readthedocs.io/zh_CN/latest/tutorial.html

有人改进了国内市场的版本,开源地址如下:

https://github.com/Yam-cn/pyalgotrade-cn

01 hello pyalgotrade

from pyalgotrade import strategy
from pyalgotrade.barfeed import yahoofeed


class MyStrategy(strategy.BacktestingStrategy):
    def __init__(self, feed, instrument):
        super(MyStrategy, self).__init__(feed)
        self.__instrument = instrument

    def onBars(self, bars):
        bar = bars[self.__instrument]
        self.info(bar.getClose())


# Load the yahoo feed from the CSV file
feed = yahoofeed.Feed()
feed.addBarsFromCSV("orcl", "orcl-2000.csv")

# Evaluate the strategy with the feed's bars.
myStrategy = MyStrategy(feed, "orcl")
myStrategy.run()

  1. 声明一个新的策略。
  2. 只有 onBars 方法是必须要定义的,此方法会在每次推送 bar 数据时执行。
  3. 从 CSV 文件加载数据。
  4. 基于 feed 提供的 bar 数据运行策略。

这个csv通过yahoofinance已经不好使了,我们使用自己的格式下载来回即可。

我们使用茅台的股票数据。

pyalgotrade的数据column是大写字母开头,而且必须有复权价。

python写量化策略并回测 python量化回测框架_python写量化策略并回测

把收盘价打印出来:

python写量化策略并回测 python量化回测框架_numpy_02

plt = plotter.StrategyPlotter(myStrategy)


myStrategy.run()
# Evaluate the strategy with the feed.
print("Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity())

plt.plot()

python写量化策略并回测 python量化回测框架_python_03

02 参数优化

如下是本地参数集回测的代码。

import itertools
from pyalgotrade.optimizer import local
from pyalgotrade.barfeed import yahoofeed
import rsi2


def parameters_generator():
    instrument = ["dia"]
    entrySMA = range(150, 251)
    exitSMA = range(5, 16)
    rsiPeriod = range(2, 11)
    overBoughtThreshold = range(75, 96)
    overSoldThreshold = range(5, 26)
    return itertools.product(instrument, entrySMA, exitSMA, rsiPeriod, overBoughtThreshold, overSoldThreshold)


# The if __name__ == '__main__' part is necessary if running on Windows.
if __name__ == '__main__':
    # Load the feed from the CSV files.
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("dia", "dia-2009.csv")
    feed.addBarsFromCSV("dia", "dia-2010.csv")
    feed.addBarsFromCSV("dia", "dia-2011.csv")

    local.run(rsi2.RSI2, feed, parameters_generator())

pyalgotrade怎么说呢,麻雀虽小,无脏俱全。

尤其是写传统技术面相关的策略,比如均线,MACD,动量这种策略,特别合适。交易的股票支数不多,因子不太,买卖规则清晰

03 多支股票轮动

这个场景是我们最需要的。

另外我们的数据格式是dataframe计算好了指标。但pyalgotrade只能从csv添加,这个就比较麻烦了。

它的买卖状态的可视化部分的代码我们可以参考下。

backtrader同样存在这样的缺陷,传统这些量化框架,都更加适合技术分析的量化,加载的数据量比较少,因子比较少。

后续我们来讲讲自主研发的量化框架。