原创内容第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)下载。