如何把一个9.5%的策略优化至年化19%?| quantlab6.1代码发布:backtrader择时策略模板

原创内容第696篇,专注量化投资、个人成长与财富自由。

今天星球如约更新quantlab6.1:

核心更新如下: 

1、backtrader常用的代码封装成Engine。

2、参数自动调优。

3、CTA择时策略模板

4、含一个人工智能LOF策略:由9.5%年化调优到19%的过程。

图片

Engine:

class Engine:
    def __init__(self, symbols, init_cash=1000000.0, start=datetime(2010, 1, 1),
                 end=datetime.now().date()):
        cerebro = bt.Cerebro()
        cerebro.broker.setcash(init_cash)

        # 设置手续费
        cerebro.broker.setcommission(0.0001)
        # 滑点:双边各 0.0001
        cerebro.broker.set_slippage_perc(perc=0.0001)
        cerebro.addanalyzer(bt.analyzers.PyFolio, _name='_PyFolio')

        self.cerebro = cerebro
        self.symbols = symbols
        self.start = start
        self.end = end
        self.optimize = None
        self._add_symbols_data()

    def _add_symbols_data(self):
        # 加载数据
        print("加载数据到backtrader引擎...")
        for s in tqdm(self.symbols):
            df = CSVDataloader.get_backtrader_df(s)
            data = bt.feeds.PandasData(dataname=df, name=s, fromdate=self.start, todate=self.end)

            self.cerebro.adddata(data)
            self.cerebro.addobserver(bt.observers.Benchmark,
                                     data=data)
            self.cerebro.addobserver(bt.observers.TimeReturn)

    def run_strategy(self, stra):
        self.cerebro.addstrategy(stra)
        self.results = self.cerebro.run()

    def _show_result(self, returns):
        returns.index = returns.index.tz_convert(None)

        print('累计收益:', round(empyrical.cum_returns_final(returns), 3))
        print('年化收益:', round(empyrical.annual_return(returns), 3))
        print('最大回撤:', round(empyrical.max_drawdown(returns), 3))
        print('夏普比', round(empyrical.sharpe_ratio(returns), 3))
        print('卡玛比', round(empyrical.calmar_ratio(returns), 3))

    def show_result_empyrical(self):
        if self.optimize:
            strats = [x[0] for x in self.results]  # flatten the result
            for i, strategy in enumerate(strats):
                print(strategy.p.name)
                pyfolio = strategy.analyzers.getbyname('_PyFolio')
                returns, positions, transactions, gross_lev = pyfolio.get_pf_items()
                self._show_result(returns)

        else:
            portfolio_stats = self.results[0].analyzers.getbyname('_PyFolio')
            returns, positions, transactions, _ = portfolio_stats.get_pf_items()
            self._show_result(returns)

        print(positions)
        print(transactions)
        if not self.optimize:
            import matplotlib.pyplot as plt
            (1 + returns).cumprod().plot()
            plt.show()

在这个基础上,大家使用就特别简单了:

from backtrader_extends.engine import Engine
e = Engine(symbols=['161631.SZ'])
e.run_strategy(roc_trend)
e.show_result_empyrical()

图片

图片

年化9.5%,大家总好奇,如何把这个策略优化到接近20%呢?

改一行代码就好:

from backtrader_extends.engine import Engine

e = Engine(symbols=['161631.SZ'])

if __name__ == '__main__':
    # e.run_strategy(roc_trend)
    e.optstrategy(roc_trend, period=range(6, 30, 2), upper=range(1, 10, 1), lower=range(-5, 0, 1))
    e.show_result_empyrical()

图片

最优参数是18,3,-3

图片

import sys

from matplotlib import rcParams

rcParams['font.family'] = 'SimHei'
import backtrader as bt
import pandas as pd


class roc_trend(bt.Strategy):
    # 参数定义
    params = dict(
        period=20,  # 动量周期
        upper=8,
        lower=0,
    )


    def __init__(self):
        self.roc = bt.indicators.ROC(self.data, period=self.p.period)

    def next(self):
        if not self.position:  # not in the market
            if self.roc[0] > self.p.upper / 100.0:
                self.order_target_percent(self.data, 0.99)  # enter long
                # self.buy()  # enter long

        elif self.position.size > 0 and self.roc[0] < self.p.lower / 100.0:  # in the market & cross to the downside
            self.close()  # close long position


from backtrader_extends.engine import Engine

e = Engine(symbols=['161631.SZ'])

if __name__ == '__main__':
    e.run_strategy(roc_trend,period=18,upper=3,lower=-3)
    # e.optstrategy(roc_trend, period=range(6, 30, 2), upper=range(1, 10, 1), lower=range(-5, 0, 1))
    e.show_result_empyrical()

AI量化实验室 星球,已经运行三年多,1200+会员。quantlab代码交付至6.X版本,含几十个策略源代码,因子表达式引擎、遗传算法(Deap)因子挖掘引擎等,每周五迭代一次。

图片

点“阅读原文”,查看策略集(或复制网址:www.ailabx.com/mall)下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI量化投资实验室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值