Si el resultado de la optimización de la estrategia de backtrader se emite correctamente

Tutorial técnico de backtrader que escribimos

Los resultados del backtest backtrader se almacenan en varios analizadores. El resultado está en forma de diccionario. Si desea generarlo en forma de tabla y guardarlo en un archivo csv, puede consultar el siguiente ejemplo.

Este ejemplo proviene de Optimizing Strategy Backtesting en Python con Backtrader , usando backtrader para optimizar los parámetros de la estrategia. La estrategia es una estrategia simple de doble promedio móvil Lo que debe optimizarse es el tamaño de la ventana de tiempo de los dos promedios móviles. El siguiente código obtiene datos del mercado de valores de la API en línea de yahoo y se puede ejecutar directamente.

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

 

Editado el 25/11

Supongo que te gusta

Origin blog.csdn.net/qtbgo/article/details/110234217
Recomendado
Clasificación