鹏城的夜晚,科技园区的灯火透过书房窗户,在林晨的电脑屏幕上投下斑驳光影。他盯着“phoenix trader”系统过去一周的详细交易日志,眉头紧锁。
836元的盈利,这个数字在家庭开销面前杯水车薪,但更让他警觉的是日志里那几笔亏损交易。
“问题不在盈亏本身”,林晨喃喃自语,手指在触摸板上滑动,“而在一致性”。
他调出系统的决策逻辑图。目前的核心模型是基于 LStm(长短期记忆网络)对股价时序数据进行预测,简单来说,就是让 AI“记忆”历史走势规律来推测未来。但一周的回测和实盘数据显示,这种单一模型在震荡市中表现尚可,一旦遇到突发消息引发的剧烈波动——比如上周三那笔亏损 -2.1% 的交易——就容易“失灵”。
“就像只靠一条腿走路”,林晨揉了揉发涩的眼睛,起身去冲第二杯咖啡,“稳定性太差”。
厨房里,苏婉给乐乐辅导完功课,正收拾书包。见林晨出来,她轻声问:“又遇到难题了”?
“嗯,策略需要优化”。林晨往马克杯里倒热水,速溶咖啡的香气弥散开,“现在这个模型,太容易受噪声干扰”。
苏婉走过来,靠在水池边:“我不懂技术,但听起来,你是想让它更‘聪明’一点”?
“更‘稳健’一点”。林晨纠正道,“投资不是追求单次暴利,而是长期稳定盈利。现在的系统,胜率大概 55%,最大回撤……”他调出手机上的计算器快速按了几下,“一周内就出现过 2.1%,年化下来可能很吓人。这不行”。
“那你打算怎么改”?
“加‘拐杖’。”林晨喝了口咖啡,思路逐渐清晰,“不能只依赖一个 AI 预测模型。得引入那些被市场验证了几十年的技术指标,让它们和 AI 互相印证。就像……中医把脉还要结合现代仪器检查,多重验证”。
回到书房,林晨打开新的浏览器标签页。他需要快速补课。
mAcd(指数平滑异同移动平均线)、RSI(相对强弱指标)、布林带(bollinger bands)……这些名词在炒股软件里常见,但他过去十年做跨境电商后台开发,对这些传统金融技术指标只是耳闻,从未深究。
“从头学”。他打开知乎、掘金、Github,搜索技术指标的 python 实现原理。
mAcd 的核心是快慢均线的分离与聚合,用来判断趋势强度和转折;RSI 衡量价格变动速度,评估超买超卖;布林带则通过标准差构造通道,反映价格波动区间和突破信号……
林晨一边查资料,一边在 Jupyter Notebook 里写测试代码。他先尝试用 ta-lib 库(一个金融技术分析函数库)直接计算这些指标。
import talib
import numpy as np
# 假设close_prices是收盘价序列
close_prices = np.array([...])
# 计算mAcd
macd, macd_signal, macd_hist = talib.mAcd(close_prices)
# 计算RSI
rsi = talib.RSI(close_prices, timeperiod=14)
# 计算布林带
upper_band, middle_band, lower_band = talib.bbANdS(close_prices)
代码很简单,但关键是如何解读这些指标,并将它们转化为交易信号。
“不能简单看金叉死叉”。林晨翻阅着经典技术分析书籍的电子版,“这些指标都有滞后性,单独使用效果有限。但如果是多个指标在同一时间窗口内发出共振信号呢”?
他脑海中浮现出一个多因子决策框架。
假设 AI 的 LStm 模型给出“看涨”概率为 65%,这本身只是一个中等强度的信号。但如果此时 mAcd 在零轴上方形成金叉,RSI 从超卖区(低于 30)回升至 50 以上,同时价格突破布林带中轨向上——多个技术指标同时转向积极,那么这笔交易的成功概率就可能大幅提升。
反之,如果 AI 看涨,但 mAcd 死叉、RSI 超买、价格触及布林带上轨,系统就应该忽略这个买入信号,甚至考虑反向操作。
“权重分配是个关键”。林晨新建了一个 Excel 表格,开始设计打分系统。
他将决策因子分为三类:
AI 核心预测(权重 40%):LStm 模型输出的涨跌概率值。
趋势指标(权重 35%):mAcd、均线系统等,判断大方向。
震荡指标(权重 25%):RSI、布林带等,判断短期位置和超买超卖状态。
每个类别下,不同的信号状态(如金叉、死叉、超买、突破等)赋予不同分值。最后加权求和,总分超过某个阈值(比如 60 分)才执行交易。
“这还不够”。林晨盯着表格,“阈值不能固定。牛市和熊市,震荡市和趋势市,市场情绪不同,阈值应该动态调整”。
他想起之前学机器学习时接触过的“自适应系统”。或许可以加入一个市场状态分类器?先用简单算法(比如波动率、均线排列)判断当前是趋势市还是震荡市,再根据不同的市场状态,微调决策模型的权重和阈值。
思路越来越多,林晨却感到一阵焦虑。复杂度在增加,而时间不等人。家庭存款还在缓慢消耗,每个月的房贷、生活费、乐乐的兴趣班费用……这些数字像背景音一样持续低鸣。
他深吸一口气,压下烦躁。
“代码可以骗人,但逻辑不会”。他对自己说,“一步步来。先实现多指标集成,回测看看效果”。
接下来的三天,林晨进入了近乎闭关的状态。
白天苏婉带乐乐去学校后,他就坐在电脑前,一行行代码编织着更复杂的决策网络。晚上家人睡了,他继续调试参数、跑回测。书房成了孤岛,只有键盘敲击声和主机风扇的嗡鸣相伴。
过程中遇到了不少坑。
ta-lib 库对数据长度有要求,短时间序列计算某些指标会返回 NaN(非数字)。他不得不修改数据预处理管道,确保足够长的历史数据窗口。
多个指标的信号有时互相矛盾。比如 mAcd 看涨,但 RSI 已严重超买。他需要设计更精细的冲突解决规则,不是简单投票,而是分析矛盾背后的市场情境——是强势逼空行情,还是顶部衰竭征兆?
回测系统也需要升级。原来只记录盈亏,现在要记录每一笔交易触发时,各个因子的具体得分、市场状态分类、最终决策总分。这样事后才能分析哪些因子有效,哪些是噪声。
第三天深夜,初步版本完成了。
林晨用过去两年的 A 股数据(2023 年初至 2024 年底)进行回测。这个时间段包含了下跌、震荡和反弹多种行情,是很好的测试场。
他启动了回测程序。
进度条缓慢爬行。屏幕上不断刷出模拟交易记录:
2023-04-15, 买入, 因子得分: 72.3 (AI:65, 趋势:15, 震荡:-7.7), 状态: 震荡市
2023-04-22, 卖出, 收益率: +3.2%
2023-05-06, 买入, 因子得分: 58.1 (AI:70, 趋势:-5, 震荡:-6.9), 状态: 下跌市 -> 忽略,未交易
2023-07-11, 买入, 因子得分: 81.5 (AI:68, 趋势:20, 震荡:-6.5), 状态: 反弹市
...
两个小时后,回测结束。
林晨屏住呼吸,看向最终报告。
回测周期:2023-01-04 至 2024-12-29(约两年)
初始资金:100,000 元
最终资金:136,847 元
总收益率:36.85%
年化收益率:约 17%
最大回撤:8.2%
胜率:61.3%
交易次数:147 次
他眼睛一亮。
相比之前单一模型回测的大起大落(年化可能更高但回撤常超过 15%),新策略的曲线平滑了许多。36.85% 的总收益不算惊艳,但关键在于最大回撤控制在 8.2%——这是一个职业投资者可以接受的波动范围。胜率从 55% 提升到 61.3%,意味着交易质量在提高。
“有戏”。林晨握了握拳,疲惫的脸上露出笑容。
但他没有立刻庆祝。职业习惯让他先找问题。
仔细查看亏损交易,发现大部分集中在 2023 年下半年市场单边下跌时。即便系统通过市场状态分类降低了仓位,但“做多”策略在熊市天然劣势,仍然难以避免小额亏损。
“如果加入做空机制呢”?林晨脑海里闪过这个念头,随即又摇头,“A 股做空门槛高,而且我的实盘账户现在也没权限。先聚焦多头优化”。
他注意到,在 2024 年的结构性行情中,系统表现更好。当 AI 模型与技术指标共振时,往往能抓住一些板块轮动的机会。
“明天用这个新策略跑实盘”。林晨看了眼时间,凌晨两点半。他保存好所有代码和回测数据,关机。
躺到床上时,大脑却依然活跃。
技术指标整合只是第一步。接下来还可以考虑更多维度:基本面数据(市盈率、营收增长率)?新闻情绪分析(爬取财经新闻做情感打分)?甚至……其他市场的联动(美股、港股对 A 股的影响)?
越想越远,越想越复杂。
“不能贪多”。他在黑暗中提醒自己,“先把当前框架跑稳。实盘验证才是试金石”。
窗外,科技园区的灯光依然明亮。那些灯火下,无数和他一样的程序员、产品经理、创业者,或许也在为某个算法、某个功能、某个商业模型绞尽脑汁。
这个时代,技术是杠杆,但找到正确的支点,需要耐心、迭代,还有那么一点在混沌中洞察规律的运气。
林晨闭上眼睛。
明天,新的实盘周期开始。优化后的“phoenix trader”将迎来第一次实战检验。
他不知道的是,就在他沉睡时,系统后台的一个定时任务悄然启动——它正在自动下载最新的美股盘前数据。而在林晨原本只针对 A 股设计的策略逻辑里,某个边界条件判断,因为数据格式的细微差异,正悄然发生着预料之外的变化……