窗外的深圳湾在晨光中泛着细碎的金光,林晨却无暇欣赏。书房的窗帘拉上了一半,三块屏幕亮着,映着他专注的脸。距离上次黄金期货盈利已经过去一周,账户里的数字又往上跳了跳,稳定在七万八左右。短暂的喜悦过后,一种更深层的渴望在他心里滋长——现有的系统,本质上还是基于规则和传统机器学习模型(预测价格走势)的“半自动”系统。它聪明,但还不够“智慧”。
“如果能训练出一个真正懂得在复杂金融市场里‘生存’和‘狩猎’的智能体呢”?这个念头一旦冒出,就再也压不下去。
他点开收藏夹里标记已久的几篇论文和开源项目。《playing Atari with deep Reinforcement Learning》、《deep Reinforcement Learning for trading》。强化学习(Reinforcement Learning, RL),这个让AI在游戏里从零开始击败人类冠军的技术,其核心思想深深吸引了他:智能体(Agent)通过与环境(Environment)交互,根据行动(Action)获得的奖励(Reward)来学习最优策略(policy)。这不正是一个交易员在市场中摸索、试错、最终形成自己交易体系的抽象过程吗?
“把市场看作环境,把买卖操作看作行动,把盈亏看作奖励……”林晨喃喃自语,手指在键盘上无意识地敲击着。这个类比让他兴奋。传统的量化策略,往往是人类设计好规则(比如“金叉买,死叉卖”),或者用监督学习预测未来价格然后制定策略。而强化学习,是让AI自己从海量历史数据中探索,找出能最大化长期累积收益的“行为模式”。它可能发现人类根本想不到的微妙特征和时机。
但兴奋很快被现实的复杂性冲淡。金融市场的“环境”极其复杂、非稳态、充满噪声,奖励信号(盈亏)稀疏且延迟,还存在高昂的“试错成本”(真金白银的亏损)。这比Atari游戏里控制一个小方块吃豆子难了无数个数量级。
“先从概念和经典算法啃起”。林晨定了定神,打开了Notion笔记,新建了一个页面,标题写上“强化学习入坑笔记(量化交易视角)”。
他给自己规划了三天的基础理论学习。第一天,搞懂马尔可夫决策过程(mdp)、价值函数(Value Function)、策略梯度(policy Gradient)这些核心概念。厚厚的pRmL(pattern Recognition and machine Learning)书和相关博客文章成了他主要的精神食粮。三十五岁的大脑重新像海绵一样吸收这些略显抽象的数理知识,有时一个公式要推导好几遍,在草稿纸上写满才豁然开朗。
“状态(State)、动作(Action)、奖励(Reward)、策略(policy)……”他像念经一样重复着这些术语,试图将它们烙印在思维里。理解到一定程度后,他开始尝试用python写一些最简单的模拟环境,比如一个简化的“股票赌大小”游戏,来验证最基本的q-learning算法。
第二天和第三天,他集中火力攻克两个当下最主流的深度强化学习算法:dqN(deep q-Network)和ppo(proximal policy optimization)。
dqN算是深度强化学习的开山之作之一,用深度神经网络来近似q值函数(评估在某个状态下采取某个动作的长期价值)。林晨仔细研究了其核心技巧:经验回放(Experience Replay)和目标网络(target Network)。经验回放就是把智能体与环境交互的经历(状态、动作、奖励、新状态)存储起来,然后随机抽样进行训练,打破数据间的相关性,提高稳定性。目标网络则是单独用一个更新较慢的网络来提供q值目标,缓解训练震荡。
“这思路妙啊”,林晨看着代码实现,忍不住赞叹,“就像人不能只盯着最近一笔交易的得失,要时不时回顾总结过去的各种交易情况(经验回放)。也不能因为今天赚了点就立刻飘了,得有个相对稳定的自我评价基准(目标网络)”。
而ppo则属于策略梯度家族,直接优化策略函数本身。它通过一个“裁剪”技巧,限制每次策略更新的幅度,确保训练更加稳定。林晨发现,ppo在连续动作空间(比如决定买卖多少比例仓位)或者更复杂的策略建模上往往比dqN更有优势。
“dqN更像是在学习‘在什么情况下做什么动作最好’的查表,而ppo是在学习一套‘行为准则’本身”。他尝试用自己理解的语言总结。
理论学习告一段落,林晨摩拳擦掌,准备动手将RL融入他的投资系统。这才是真正的挑战。
他首先需要定义“环境”。他选取了A股市场某只流动性较好的EtF(交易所交易基金)的分钟级历史数据,时间跨度三年。环境的状态(State)设计为过去N分钟的价格序列、成交量、以及一些技术指标(如RSI、mAcd)的向量。动作(Action)简化为三个:买入(全仓)、卖出(清仓)、持有。奖励(Reward)则定义为每次动作转换后持仓市值的变化率(考虑手续费)。
接着是构建智能体。他决定先用相对简单的dqN试试水。在pytorch框架下,他搭建了一个包含几层全连接网络的q网络,输入是状态向量,输出是三个动作对应的q值。
训练开始。他让智能体在历史数据上“回测”,一开始完全是随机探索,买买卖卖。看着模拟账户曲线像过山车一样上蹿下跳,林晨哭笑不得。训练过程极其缓慢,而且非常不稳定。有时智能体似乎学到了一点东西,知道在下跌时卖出,但很快又会陷入疯狂交易的怪圈,累积的手续费就把模拟利润吃光了。
“奖励稀疏……动作对收益的影响有延迟……市场状态非马尔可夫……”他一边盯着训练日志里几乎不增长的累计奖励,一边揪着头发总结问题。经典的“稀疏奖励”和“信用分配”难题活生生摆在眼前。一次成功的买入,可能得益于几天前某个卖出动作避免了更大亏损,但智能体很难建立起这种长程的因果关系。
他尝试调整奖励函数,加入一些基于技术面判断的“塑形奖励”(Shaping Reward),比如当价格突破均线时给予微小正奖励,试图引导学习。也尝试了更复杂的网络结构,加入LStm层来处理时间序列特征。
连续三天的调试,每天对着屏幕超过十四小时。苏婉晚上进来送水果,看到他眉头紧锁、屏幕上满是曲折的损失函数曲线和乱七八糟的交易信号图,轻轻叹了口气,把水果放下,默默带上门。
第四天深夜,林晨遇到了一个更棘手的问题:过拟合。智能体在训练数据(某一段历史时期)上表现得似乎不错,累计奖励开始缓慢上升,但换到另一段“未见过的”历史数据(验证集)上测试,表现就一塌糊涂,甚至不如随机策略。
“它在死记硬背特定历史行情下的‘正确答案’,而不是学会通用的交易原则”。林晨靠在椅背上,感到一阵深深的疲惫和挫败。窗外的灯火已稀疏,城市进入沉睡。屏幕的光映着他眼里的血丝。
他关掉训练程序,起身走到窗边,做了几个深蹲,活动了一下僵硬的脖颈。冷水洗了把脸,回来坐下,没有继续钻牛角尖调试参数,而是打开了另一个文档——他的求职简历。
简历上,“项目经验”一栏已经更新了“基于机器学习的多市场量化交易系统(个人项目)”,并简要描述了架构和实盘成绩。现在,他思考着是否要把“探索强化学习在量化交易中的应用”也作为一个研究方向写上去,哪怕目前还没出成果。
“写上去”,他对自己说,“至少表明我的技术视野和持续学习的态度。t厂或者那些金融科技公司,应该会看重这种前沿技术的探索能力”。
他简要地在简历末尾的“技能与兴趣”部分加了一句:“正在研究深度强化学习(dqN/ppo)在金融时序决策中的应用”。
做完这件事,他重新打开代码。这一次,他没有急于运行,而是从头开始审视整个训练框架。环境设计是否合理?状态特征是否真正具有预测性?动作空间是否太简单或太复杂?奖励函数是否真正引导智能体关注长期收益?
“也许,我太心急了,总想让它立刻学会‘赚钱’”。林晨反思,“或许第一步,应该先让它学会‘不亏钱’,或者学会在模拟环境中达到某个基准策略(比如简单均线策略)的水平”。
他决定换一个思路,不再直接用历史价格数据,而是先在一个自己完全可控的、简化但能体现某些市场特性的模拟环境中训练智能体。比如,模拟一个具有趋势和均值回复特性的随机价格序列。先验证算法本身的有效性,再逐步迁移到真实复杂环境。
思路一转,压力似乎小了一些。他新建了一个项目文件夹,命名为“RL_trading_Simulator”。当手指再次在键盘上敲下第一行代码时,那种熟悉的、面对未知挑战的专注感又回来了。挫败感仍在,但已被一种更坚定的探索欲覆盖。
他知道,这条路不容易,甚至可能短期内看不到实用成果。但内心深处有个声音告诉他,这个方向是对的。让AI学会在不确定性的海洋中自主导航,这不仅是提升投资系统的关键一跃,或许也是他个人技术生涯中必须征服的一座高山。
窗外,天色已微微发白。新的一天即将开始,而他的代码世界,才刚刚进入又一个攻坚的深夜。