如果优雅地输出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

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
backtrader是一个用Python编写的开源交易框架,可以用来开发和测试交易策略。要使用backtrader开发策略,需要按照以下步骤进行: 1. 安装backtrader:可以使用pip安装backtrader:`pip install backtrader` 2. 创建策略类:通过继承backtrader的Strategy类,实现自己的交易策略。 3. 编写数据加载器:backtrader可以从多种数据源加载数据,如CSV文件、pandas DataFrame等。需要编写自己的数据加载器,将数据载入backtrader中。 4. 配置回测参数:可以设置回测的起始日期、结束日期、初始资金等参数。 5. 运行回测:使用backtrader的Cerebro类来运行回测,并输出回测结果。 下面是一个简单的示例代码,演示如何使用backtrader实现一个简单的移动平均线策略: ```python import backtrader as bt class MyStrategy(bt.Strategy): params = dict( period=20 ) def __init__(self): self.sma = bt.indicators.SimpleMovingAverage( self.data.close, period=self.params.period ) def next(self): if self.data.close[0] > self.sma[0]: self.buy() elif self.data.close[0] < self.sma[0]: self.sell() cerebro = bt.Cerebro() data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2019, 1, 1), todate=datetime(2020, 1, 1)) cerebro.adddata(data) cerebro.addstrategy(MyStrategy) cerebro.run() cerebro.plot() ``` 在这个示例中,我们使用了YahooFinanceData数据加载器,加载了AAPL股票的历史数据。然后创建了一个MyStrategy类,并在其中实现了一个简单的移动平均线策略。在每个时间步骤中,如果收盘价超过了20天的简单移动平均线,则发出买入信号;如果收盘价低于20天的简单移动平均线,则发出卖出信号。 最后,我们使用Cerebro类来运行回测,并用plot()方法将回测结果可视化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地僧量化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值