原创内容第639篇,专注量化投资、个人成长与财富自由。
量化投资具体步骤:数据、指标(因子),信号规则或因子合成,策略,绩效评估,风控。
其实所有的策略都可以归结为以上的步骤。
我们把通用的步骤积累起来,这样就可以快速形成策略,以应对变化的市场,做到有复利,有积累。
量化交易与主观交易不同在于,量化可以沉淀下来很多经验。
今天开放了QQ个人群,群邀请已经在星球置顶了,感兴趣的星友直接加入即可。AI量化实验室——2024量化投资的星辰大海
思考一个问题,回测与实盘,开发策略是可以分开的。
回测讲求效率,而实盘讲求性能和稳定性。
而回测系统不必过于拘泥于细节,多数场景下,向量化回测就够了。
比如vectorBT就是这个逻辑。
像ETF的资产配置,股票的轮动,使用vectorBT或者bt(不是backtrader)就足够了。
这有什么好处呢?策略代码非常简洁,而且不容易出错。
大家感受一下海龟交易系统的代码——只有在这种场景下,也就是精细化的仓位管理,比如向上突破一次,加仓多少个ATR这样的逻辑。
ize = 0 self.buy_count = 0 # 海龟交易法则中的唐奇安通道和平均波幅ATR self.H_line = bt.indicators.Highest(self.data.high(-1), period=self.p.long_period) self.L_line = bt.indicators.Lowest(self.data.low(-1), period=self.p.short_period) self.TR = bt.indicators.Max((self.data.high(0) - self.data.low(0)), \ abs(self.data.close(-1) - self.data.high(0)), \ abs(self.data.close(-1) - self.data.low(0))) self.ATR = bt.indicators.SimpleMovingAverage(self.TR, period=14) # 价格与上下轨线的交叉 self.buy_signal = bt.ind.CrossOver(self.data.close(0), self.H_line) self.sell_signal = bt.ind.CrossOver(self.data.close(0), self.L_line) def next(self): if self.order: return # 入场:价格突破上轨线且空仓时 if self.buy_signal > 0 and self.buy_count == 0: self.buy_size = self.broker.getvalue() * 0.01 / self.ATR self.buy_size = int(self.buy_size / 100) * 100 self.sizer.p.stake = self.buy_size self.buy_count = 1 print('空仓时买入', self.buy_size) self.order = self.buy() # 加仓:价格上涨了买入价的0.5的ATR且加仓次数少于3次(含) elif self.data.close > self.buyprice + 0.5 * self.ATR[0] and self.buy_count > 0 and self.buy_count <= 4: print('加仓买入') self.buy_size = self.broker.getvalue() * 0.01 / self.ATR self.buy_size = int(self.buy_size / 100) * 100 self.sizer.p.stake = self.buy_size self.order = self.buy() self.buy_count += 1 # 离场:价格跌破下轨线且持仓时 elif self.sell_signal < 0 and self.buy_count > 0: print('平仓信号卖出') self.order = self.sell() self.buy_count = 0 # 止损:价格跌破买入价的2个ATR且持仓时 elif self.data.close < (self.buyprice - 2 * self.ATR[0]) and self.buy_count > 0: print('止损信号卖出') self.order = self.sell() self.buy_count = 0 # 交易记录日志(默认不打印结果) def log(self, txt, dt=None, doprint=False): if self.params.printlog or doprint: dt = dt or self.datas[0].datetime.date(0) print(f'{dt.isoformat()},{txt}') # 记录交易执行情况(默认不输出结果) def notify_order(self, order): # 如果order为submitted/accepted,返回空 if order.status in [order.Submitted, order.Accepted]: return # 如果order为buy/sell executed,报告价格结果 if order.status in [order.Completed]: if order.isbuy(): self.log(f'买入:\n价格:{order.executed.price},\ 成本:{order.executed.value},\ 手续费:{order.executed.comm}') self.buyprice = order.executed.price self.buycomm = order.executed.comm else: self.log(f'卖出:\n价格:{order.executed.price},\ 成本: {order.executed.value},\ 手续费{order.executed.comm}') self.bar_executed = len(self) # 如果指令取消/交易失败, 报告结果 elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('交易失败') self.order = None # 记录交易收益情况(可省略,默认不输出结果) def notify_trade(self, trade): if not trade.isclosed: return self.log(f'策略收益:\n毛收益 {trade.pnl:.2f}, 净收益 {trade.pnlcomm:.2f}') def stop(self): self.log(f'(组合线:{self.p.long_period},{self.p.short_period});\ 期末总资金: {self.broker.getvalue():.2f}', doprint=True)
这种策略多见过传统的CTA策略,但AI量化里,多因子、排序、轮动是主角,仓位管理更多通过投资组合来完成,而非这种仓位分配和管理。
吾日三省吾身
昨天一同事过来聊天,说打算创业做点事情。
我第一反应是, 这个时候去创业,怎么考虑的。
尽管我基本明白背后的逻辑,应该是工作上出现的状况。
同事说,年初换了一家公司,觉得很谈得来,在二选一中选择了前者,结果半年不到,公司放弃了原定的规划,同事只能离开。
再尝试到找工作,面试机会倒是有——其实已经挺不容易了——但年龄的坎不好过去了。
肉少狼多,企业自然有的挑。
年轻人有冲劲,还没能家庭负担。
可能,这是多数职场人的归宿吧,或早或迟而已。
另外一个年轻的朋友说,现在公司卷着,说暂时肯定不动了,能不出来就不出来,至少把房贷清了,再积累一些资本,这样稳妥。
同事说,心理建设了1个多月,其实客观看,也不是什么大事,没能房贷,生活成本不高,没有负债,之前的成本也可以确保好多年财务安全。
只不过,习惯了,就得有一个工作,这是一种安全感的来源了吧。
国外很多人,很自然给自己安排一年的空窗期,就是工作一年,休息一年,去看世界,做自己喜欢的事情,而且还没有储蓄,似乎也很自然,但我们就会觉得特别没有安全感。
但事情就这么发生了,也总会有办法。
山重水复疑无路,柳暗花明又一村。
我们都得开始重新思考对孩子的教育观念,理财,写作以及一门硬技能。比如AI,智能体开发等。
如果你不需要通过一个组织去谋生,那学历就不是刚需。
财富自由不是你想不想的问题,而是必须去做的事情。
历史文章:
年化从19.1%提升到22.5%,全球大类资产轮动,加上RSRS择时,RSRS性能优化70倍。(附策略源码)
AI量化实验室——2024量化投资的星辰大海