如果优雅地输出backtrader策略优化结果

我们写的backtrader技术教程

backtrader回测结果存放在各种analyzer中,结果是词典的形式,如果你想把他以表格的形式输出,并存到csv文件,可以参考下面的例子。

这个例子来自Optimizing Strategy Backtesting in Python with Backtrader,利用backtrader做策略参数优化。策略就是一个简单的双均线策略,要优化的是两根均线的时间窗口大小。如下代码从yahoo在线api取得股票行情数据,可直接运行。

analyzeroutputcsv.py

import backtrader as bt
import backtrader.analyzers as btanalyzers
import pandas as pd
import matplotlib
from datetime import datetime

# 定义双均线策略
class MaCrossStrategy(bt.Strategy):
 
    params = (
        ('fast_length', 10),
        ('slow_length', 50)
    )
     
    def __init__(self):
        ma_fast = bt.ind.SMA(period = self.params.fast_length)
        ma_slow = bt.ind.SMA(period = self.params.slow_length)
         
        self.crossover = bt.ind.CrossOver(ma_fast, ma_slow)
 
    def next(self):
        if not self.position:
            if self.crossover > 0: 
                self.buy()
        elif self.crossover < 0: 
            self.close()

if __name__ == "__main__":
    
    cerebro = bt.Cerebro()

  
    # 从yahoo在线api取得股票AAPL的日线数据
    data = bt.feeds.YahooFinanceData(dataname = 'AAPL', fromdate = datetime(2018, 1, 1), todate = datetime(2020, 1, 1))
    cerebro.adddata(data)

    #策略优化
    cerebro.optstrategy(
            MaCrossStrategy,
            fast_length = range(1, 11, 5), 
            slow_length = range(25, 35, 5))
    


    cerebro.broker.setcash(1000000.0)
    
    cerebro.addsizer(bt.sizers.PercentSizer, percents = 10)
    cerebro.addanalyzer(btanalyzers.SharpeRatio, _name = "sharpe")
    cerebro.addanalyzer(btanalyzers.DrawDown, _name = "drawdown")
    cerebro.addanalyzer(btanalyzers.Returns, _name = "returns")
    
    # 运行优化,由于每个参数组合运行一次策略,所以back是返回的策略实例列表(每个实例对应一组参数值)
    back = cerebro.run()


    # 每个策略实例的结果以列表的形式保存在列表中。
    # 优化运行模式下,返回值是列表的列表,内列表只含一个元素,即策略实例
    par_list = [[x[0].params.fast_length, 
                x[0].params.slow_length,
                x[0].analyzers.returns.get_analysis()['rnorm100'], 
                x[0].analyzers.drawdown.get_analysis()['max']['drawdown'],
                x[0].analyzers.sharpe.get_analysis()['sharperatio']
                ] for x in back]

    # 结果转成dataframe
    par_df = pd.DataFrame(par_list, columns = ['length_fast', 'length_slow', 'return', 'dd', 'sharpe'])

    print(par_df.head())

    par_df.to_csv('result.csv')

编辑于 11-25

猜你喜欢

转载自blog.csdn.net/qtbgo/article/details/110234217