• pyalgotrade量化回测框架简单试用


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

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

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

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

    我打算分享4个量化回测引擎:pyalgotradebacktrader ,我自研的以及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是大写字母开头,而且必须有复权价。

    把收盘价打印出来:

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

    plt.plot()

    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同样存在这样的缺陷,传统这些量化框架,都更加适合技术分析的量化,加载的数据量比较少,因子比较少。

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

    飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。

  • 相关阅读:
    微信小程序实现lot开发01 学习微信小程序 helloworld
    linux 虚拟机下安装docker
    MySQL高级篇知识点——数据库其它调优策略
    git学习
    一分钟带你了解音视频开发进阶(先收藏了)
    log4js使用笔记
    Flask高级视图_蓝图模板,静态文件,url_for的实战
    Git 实战(三) | Github 必会高频基础命令与 IDE 的 Git 集成
    队列的实现(c语言)
    pytorch --- 二分类与多分类label及损失的使用
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/126779181