楼主: qtbgoo
1856 1

[程序化交易] backtrader策略参数大规模优化--使用粒子群和其他智能算法 修订 [推广有奖]

  • 0关注
  • 2粉丝

大专生

20%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
4.2923
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
307 点
帖子
23
精华
0
在线时间
41 小时
注册时间
2015-11-16
最后登录
2022-12-9

楼主
qtbgoo 在职认证  发表于 2020-11-17 11:15:30 |只看作者 |坛友微信交流群|倒序 |AI写论文
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

backtrader内置的策略参数优化方法是暴力全量搜索方法,也就是遍历每个参数组合值。在参数很多,每个参数取值变化范围大的情况下,优化效率是很低的。


可以采用智能优化算法,比如粒子群优化等进行大规模参数优化。下面,我们用python开源算法库optunity来对backtrader策略参数进行优化。


我们的示例策略是一个简单的双均线策略,要优化两个参数,即两个均线移动窗口,目标是使得账户市值最大化。从Yahoo在线api取得微软股票日线数据,进行回测。


采用optunity中的粒子群算法来优化,代码如下:

  1. from datetime import datetime
  2. import backtrader as bt

  3. import optunity
  4. import optunity.metrics


  5. class SmaCross(bt.SignalStrategy):
  6.     params = (
  7.         ('sma1', 10), # 需要优化的参数1,短期均线窗口
  8.         ('sma2', 30), # 需要优化的参数2,长期均线窗口
  9.     )
  10.     def __init__(self):
  11.         SMA1 = bt.ind.SMA(period=int(self.params.sma1)) # 用int取整
  12.         SMA2 = bt.ind.SMA(period=int(self.params.sma2)) # 用int取整
  13.         crossover = bt.ind.CrossOver(SMA1, SMA2)
  14.         self.signal_add(bt.SIGNAL_LONG, crossover)


  15. data0 = bt.feeds.YahooFinanceData(dataname='MSFT',
  16.                                   fromdate=datetime(2011, 1, 1),
  17.                                   todate=datetime(2012, 12, 31))

  18. def runstrat(sma1,sma2):
  19.    
  20.     cerebro = bt.Cerebro()
  21.     cerebro.addstrategy(SmaCross, sma1=sma1, sma2=sma2)

  22.     cerebro.adddata(data0)
  23.     cerebro.run()
  24.     return cerebro.broker.getvalue()

  25. # 执行优化,执行5次回测(num_evals,实战时回测次数要设大一些,比如100次),
  26. # 设置两个参数sma1,sma2的取值范围
  27. # solver_name可取算法包括 particle swarm,sobol,random search,cma-es,grid search
  28. opt = optunity.maximize(runstrat,  num_evals=5,solver_name='particle swarm', sma1=[2, 55], sma2=[2, 55])

  29. # 得到最优参数结果
  30. optimal_pars, details, _ = opt
  31. print('Optimal Parameters:')
  32. print('sma1 = %.2f' % optimal_pars['sma1'])
  33. print('sma2 = %.2f' % optimal_pars['sma2'])
  34. # 利用最优参数最后回测一次,作图
  35. cerebro = bt.Cerebro()
  36. cerebro.addstrategy(SmaCross, sma1=optimal_pars['sma1'], sma2=optimal_pars['sma2'])
  37. cerebro.adddata(data0)
  38. cerebro.run()
  39. cerebro.plot()
复制代码

optunity支持如下几种算法(solver),读者可以分别测试它们。

particle swarm,sobol,random search,cma-es,grid search


案例来自教程,百度网盘下载:




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:trader Trade Back 智能算法 大规模

沙发
tkfy920 在职认证  学生认证  发表于 2020-11-19 16:56:01 |只看作者 |坛友微信交流群
教程写的不错,欢迎关注Python金融量化,相互交流

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 16:20