原创内容第782篇,专注量化投资、个人成长与财富自由。
昨天我们把backtrader+ctpbee的实盘整合代码跑通了,年化19.3%,回撤仅8%的实盘策略,以及backtrader整合CTPBee做实盘(附python代码和数据)
这两周我们加进来一项工作就是实盘对接相关(先从期货CTP的整合开发),当然低代码平台会持续开发。
if __name__ == '__main__':with open('./params.json', 'r') as f:ctp_setting = json.load(f)cerebro = bt.Cerebro(live=True)store = CTPStore(ctp_setting, debug=True)cerebro.addstrategy(SmaCross, store=store)# 由于历史回填数据从akshare拿,最细1分钟bar,所以以下实盘也只接收1分钟bar# https://www.akshare.xyz/zh_CN/latest/data/futures/futures.html#id106data0 = store.getdata(dataname='ag2112.SHFE', timeframe=bt.TimeFrame.Minutes, # 注意符号必须带交易所代码。num_init_backfill=100 if is_trading_period() else 0) # 初始回填bar数,使用TEST服务器进行模拟实盘时,要设为0data1 = store.getdata(dataname='rb2201.SHFE', timeframe=bt.TimeFrame.Minutes, # 注意符号必须带交易所代码。num_init_backfill=100 if is_trading_period() else 0) # 初始回填bar数,使用TEST服务器进行模拟实盘时,要设为0cerebro.adddata(data0)cerebro.adddata(data1)cerebro.run()
今天我们来讲讲整合的细节。
import json import backtrader as btfrom live_trade.backtrader_ctp import CTPStore from datetime import datetime, time# Origin定义不要删除,ctpbee接口需要它 class Origin:""""""def __init__(self, data):self.symbol = data._dataname.split('.')[0]self.exchange = data._name.split('.')[1]# 说明在交易日上午8点45到下午3点,以及晚上8点45到凌晨2点45分,可进行实时行情模拟交易。 # 中国期货交易时段(日盘/夜盘),只有在交易时段才能进行实时模拟仿真,其他时段只能进行非实时模拟仿真。双休日不能进行模拟仿真 DAY_START = time(8, 45) # 日盘8点45开始 DAY_END = time(15, 0) # 下午3点结束 NIGHT_START = time(20, 45) # 夜盘晚上8点45开始 NIGHT_END = time(2, 45) # 凌晨2点45结束# 是否在交易时段 def is_trading_period():""""""print('is_trading_period检查!')current_time = datetime.now().time()trading = Falseif ((current_time >= DAY_START and current_time <= DAY_END)or (current_time >= NIGHT_START)or (current_time <= NIGHT_END)):trading = Truereturn tradingclass SmaCross(bt.Strategy):lines = ('sma',)params = dict(smaperiod=5,store=None,)def __init__(self):self.beeapi = self.p.store.main_ctpbee_apiself.buy_order = Noneself.live_data = False# self.move_average = bt.ind.MovingAverageSimple(self.data, period=self.params.smaperiod)def prenext(self):print('in prenext')for d in self.datas:print(d._name, d.datetime.datetime(0), 'o h l c ', d.open[0], d.high[0], d.low[0], d.close[0], ' vol ',d.volume[0])def next(self):print('------------------------------------------ next start')for d in self.datas:print('d._name', d._name, 'd._dataname', d._dataname, d.datetime.datetime(0), 'o h l c ', d.open[0],d.high[0], d.low[0], d.close[0], ' vol ', d.volume[0])pos = self.beeapi.app.center.get_position(d._dataname)print('position', pos)# 可以访问持仓、成交、订单等各种实盘信息,如何访问参考http://docs.ctpbee.com/modules/rec.htmltrades = self.beeapi.app.center.tradesprint('trades', trades)account = self.beeapi.app.center.accountprint('account', account)if not self.live_data: # 不是实时数据(还处于历史数据回填中),不进入下单逻辑return# 开多仓print('live buy')# self.open_long(self.data0.close[0] + 3, 1, self.data0)print('---------------------------------------------------')def notify_order(self, order):print('订单状态 %s' % order.getstatusname())def notify_data(self, data, status, *args, **kwargs):dn = data._namedt = datetime.now()msg = f'notify_data Data Status: {data._getstatusname(status)}'print(dt, dn, msg)if data._getstatusname(status) == 'LIVE':self.live_data = Trueelse:self.live_data = False# 以下是下单函数def open_long(self, price, size, data):self.beeapi.action.buy(price, size, Origin(data))def open_short(self, price, size, data):self.beeapi.action.short(price, size, Origin(data))def close_long(self, price, size, data):self.beeapi.action.cover(price, size, Origin(data))def close_short(self, price, size, data):self.beeapi.action.sell(price, size, Origin(data))
目前simnow不可访问,使用openctp需要替换下面两个dll:
venv\Lib\site-packages\ctpbee_api\ctp
吾日三省吾身
如果你希望一件事发生,你需要集齐这件事发生需要的所有要素就可以了。
像造火箭,关键步骤也是27个左右。
提高对客观世界评估的精准性,你会发现看似遥不可及的事情,也会变得简单很多。
大象装冰箱,总共分几步。
冰箱门打开,把大象关进去,把冰箱门关上。
其中第二步比较难,我们再来考虑是找一个大一点的冰箱,还是找一头小一点的大象。
把一个难题分解成一个个可解的问题。
有一点感触,学一个新技能或者进入一个新领域,会有一种错觉,在新手期,一切都很新鲜,很兴奋,然后很快进入瓶颈期,开始爬坡,觉得不好玩了,和想象中的情况不一样。
之前好多次安装node.js,折腾vue和react。一开始照着tutorial写,肯定很舒服——如果这一步都不顺利,那么说明框架不成熟,应该考虑弃用。不过到了具体应用,就开始爬坡,这一步最最难的,如果突破了,后面就正式入门了。
——受益于大模型,卡壳的地方可以让模型来写或改,这个过程也会顺利很多。咱们的低代码平台,现在就是使用的前后端分离的架构,前端使用ionic+react,ionic 在N年前就打算用,现在才算正式用起来了。
学英语也是如此,学吉他也是如此。
这把年纪好,吉他就算了,英语还是要突破一下的。
生活无外乎是见招拆招,不必提前焦虑,一切都是体验,允许一切发生。
代码和数据下载:AI量化实验室——2025量化投资的星辰大海
AI量化实验室 星球,已经运行三年多,1300+会员。
aitrader代码,含几十个策略源代码,因子表达式引擎、遗传算法(Deap)因子挖掘引擎等,支持vnpy,qlib,backtrader和bt引擎,内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。
扩展 • 历史文章
EarnMore(赚得更多)基于RL的投资组合管理框架:一致的股票表示,可定制股票池管理。(附论文+代码)
deap系统重构,再新增一个新的因子,年化39.1%,卡玛提升至2.76(附python代码)
deap时间序列函数补充,挖掘出年化39.12%的轮动因子,卡玛比率2.52
年化19.3%,回撤仅8%的实盘策略,以及backtrader整合CTPBee做实盘(附python代码和数据)
近四年年化收益19.3%,而最大回撤仅8%,卡玛比率2.34,投资应该是一件简单的事情。(附python代码+数据)