第十八章 股海析,心意暖
2020年12月初,清溪镇迎来了入冬后的第一场小雨,冰冷的雨丝夹杂着寒风,斜斜地打在窗户上,发出淅淅沥沥的声响。天空灰蒙蒙的,整个校园都笼罩在一片阴冷的雾气中,气温再次走低,徘徊在零下三摄氏度左右。学生们裹着厚厚的羽绒服,把帽子拉得低低的,双手插在口袋里,缩着脖子快步走在雨中,生怕被冰冷的雨水打湿衣服。李长生依旧保持着晨跑的习惯,只是将晨跑的地点从操场转移到了教学楼的走廊里,来回的折返跑同样让他大汗淋漓,既锻炼了身体,又避免了淋雨。跑完后,他靠在走廊的窗户边,看着外面的雨景,脑海里却在快速梳理着股票价格预测项目的思路,冰冷的雨水丝毫没有影响他的专注。
高一(3)班的课堂上,李长生的「中等生」伪装依旧毫无破绽,甚至已经形成了一种固定的节奏。
第八次周测成绩公布,他的名字稳稳停在班级第二十三名,比上次前进一名,依旧在「不被关注」的安全区间里稳步前行。这次控分,他做得愈发随心所欲,完全不用再在草稿纸上计算扣分点,仅凭多年来对「中等生」身份的拿捏,就能精准控制每一门科目的分数:数学卷的压轴题第二问,他故意只写了一半的解题过程,留下关键步骤不写,刚好扣掉三分;物理卷的实验题,在误差分析部分刻意写得不够全面,扣掉两分;英语卷的七选五,刻意选错一道,让分数保持在88分的中游水平;语文卷的诗歌鉴赏题,按最基础的答题模板作答,不做深度解读,扣掉两分;就连文综卷,他也能精准地在选择题上错两道,主观题答得中规中矩,让总分稳稳落在班级第二十三名。
红底黑字的排名表贴在教室后墙,同学们围在一起翻看,目光大多集中在成绩靠前的同学和自己的名字上,很少有人会留意到中间位置的李长生。班主任刘老师在班会上点评成绩时,依旧是重点表扬前三名,鼓励进步大的同学,批评退步的同学,对中间排名的学生只是一句「保持稳定」便一笔带过,甚至连他的名字都没有念到。只有王帆,在看到排名表时,会下意识地找到他的名字,确认他的排名后,轻轻松了口气,仿佛只要他保持稳定,就足够了。
课堂上,李长生依旧是那个「标准听众」,坐得笔直,低头看着课本,手里的笔看似在认真记录老师讲的知识点,实则笔尖在草稿纸上快速勾勒着股票价格预测的模型框架——LSTM模型的结构优化、注意力机制的引入、多特征融合的方式,这些问题在他的脑海里反复盘旋,占据了他所有的思绪。
数学课上,老师讲着「函数的单调性与极值」,他立刻联想到了股票价格的波动规律——股票价格的上涨与下跌,就像函数的单调递增与递减,而股价的高点与低点,就是函数的极值点。他在草稿纸上画出函数图像,再对照股票的K线图,思考着如何用导数来判断股价的趋势变化,为特征工程提供新的思路。
物理课上,老师讲着「动量与冲量」,力的作用带来动量的变化,这让他想到了股票市场中的「资金量」与「股价波动」的关系——资金的流入与流出,就像力的作用,会带来股价的上涨与下跌,资金量越大,股价的波动幅度也就越大。他开始思考如何将资金量、换手率等特征与股价特征融合,提高模型的预测准确率。
甚至在语文课上,老师讲着「议论文的论据与论证」,他也能联想到模型的「特征」与「预测结果」的关系——特征是论据,模型是论证过程,预测结果是论点,只有选择合适的特征,才能通过模型推导出准确的预测结果。
这种跨学科的知识融合,已经深深融入了他的思维方式,无论老师讲什么内容,他都能快速与自己正在学习的AI技术联系起来,找到共通点,让文化课的学习成为他提升AI能力的「助力」,而不是「负担」。
课间,他依旧独来独往,只是比以往更加忙碌。他会拿出手机,快速浏览股票市场的相关知识,了解K线图、均线、MACD、KDJ等技术指标的含义,这些都是股票价格预测中不可或缺的特征。偶尔,他会在草稿纸上写下这些指标的计算公式,思考着如何将这些技术指标转化为模型能够识别的特征。
王浩依旧会在课间拉着他去打游戏,或是邀请他一起去食堂买零食,他依旧是摇头拒绝,只是语气比以往温和了一些,会说「还有点事没做完,你们去吧」。王浩也早已习惯了他的拒绝,只是会笑着拍他的肩膀说「你这家伙,天天都有做不完的事,小心累坏了」,然后便和其他同学一起离开。
对李长生而言,现在的「要事」,就是那个报酬2000元的「股票价格预测」项目。这是他迄今为止接到的报酬最高、难度最大的项目,也是时间序列预测领域的经典难题。股票价格预测不仅需要处理具有强时间依赖性的股价数据,还需要考虑宏观经济、市场情绪、政策利好、资金量等多种复杂因素的影响,模型的搭建与优化难度,远超之前的门店客流预测项目。
但他没有丝毫畏惧,反而充满了期待。挑战越大,成长也就越快,他渴望通过这个项目,进一步提升自己在时间序列预测领域的技术能力,掌握更复杂的模型搭建与优化方法。
而他与王帆的相处,在这阴冷的冬日雨天里,愈发温暖,那份专属的默契,也变得更加深厚,更加细腻,像一杯温热的奶茶,暖到了心底。
天气阴冷,教室的窗户关得严严实实,暖气开得很足,与外面的寒冷形成了鲜明的对比。王帆依旧每天带着那个粉色的保温杯,只是里面的水,从白开水变成了温热的红糖姜茶,课间会主动递给她,轻声说:「天冷,喝点姜茶暖暖身子,不容易感冒。」
他会接过杯子,喝上几口,温热的姜茶带着淡淡的甜味和姜的辛辣,顺着喉咙流下,瞬间驱散了周身的寒意,也温暖了他的胃。「谢谢你。」他会轻声说,然后把杯子还给她,眼神里带着一丝不易察觉的感激。
两人之间的交流,也越来越自然,越来越走心。不再局限于学习和日常的简单问候,偶尔会聊一些更深入的话题。
王帆会问他:「你每天都这么忙,到底在做什么呀?」
他会犹豫一下,然后轻声说:「在学一些东西,做一些项目。」
她不会追问具体是什么项目,只是点点头,说:「那你也要注意休息,别太累了,身体才是最重要的。」
他会轻轻「嗯」一声,然后说:「我知道,你也是。」
她会笑着说:「我没事,我不像你,天天熬夜。」
他会低头,嘴角微微扬起,说:「以后会注意的。」
这些简单的对话,没有华丽的辞藻,却充满了关心与理解。她尊重他的隐私,从不追问他不想说的事;他也懂得她的关心,会努力照顾好自己,不让她担心。
他们之间的默契,已经到了「无需多言,心领神会」的地步。她一个眼神,他就知道她需要什么;他一个动作,她就知道他又熬夜了。
雨天的课间,教室的窗户上会凝结一层薄薄的水雾,王帆会用手指在水雾上画画,偶尔会画一个小小的太阳,然后转头看他,笑着说:「你看,画个太阳,就不冷了。」
他会看着窗户上的太阳,轻声说:「嗯,挺好看的。」
有一次,晚自习结束后,外面的雨下得很大,李长生没有带伞,站在教学楼门口,犹豫着要不要冒雨回去。王帆看到后,主动走过来,把自己的伞递给他,说:「你拿着吧,我家离得近,跑回去就好。」
他连忙摇头,说:「不用,你拿着吧,我没事。」
她说:「没事,我跑得快,你别淋感冒了,不然又要熬夜补回来,更累。」
说着,她便把伞塞到他手里,转身就跑进了雨里,一边跑,一边回头对他说:「记得明天把伞还给我!」
他站在门口,手里拿着她的伞,看着她在雨中奔跑的背影,心里涌起一股浓浓的暖意。那把伞,是粉色的,和她的保温杯一样,带着淡淡的香味。
第二天,他把伞还给她,轻声说:「谢谢你,昨天没淋到雨。」
她笑着说:「没事,举手之劳。」
从那以后,每当遇到下雨天,他都会下意识地看一眼她的书包,确认她有没有带伞。而她,也会在看到他没带伞时,主动把伞递给他。
他们之间的这些小细节,像一颗颗散落的星星,在寒冷的冬日里,默默闪烁着温暖的光芒。没有人注意到,也没有人在意,但对他们而言,这些却是最珍贵的瞬间。
郊外的小木屋里,依旧是他的主战场,也是他挑战股票价格预测项目的地方。
新电脑的屏幕每天都会亮到深夜,冷白色的光芒照亮了整个木屋,也照亮了他专注的脸庞。窗外的雨淅淅沥沥地下着,敲打着木屋的窗户,发出轻微的声响,却丝毫没有影响到他。他的所有精力,都投入到了这个高难度的项目中。
客户提供的数据集是某只股票过去两年的交易数据,包含日期、开盘价、收盘价、最高价、最低价、成交量、成交额、换手率等字段,要求根据这些数据,预测未来七天的股票收盘价,预测准确率不低于85%。客户特别强调,股票价格预测难度极大,只要准确率能达到85%,就算完成任务。
拿到数据集后,李长生没有立刻搭建模型,而是先对数据进行了全面而细致的探索性分析。这是时间序列预测项目的关键步骤,尤其是股票价格预测,只有充分了解数据的特征和规律,才能搭建出合适的模型。
他用Pandas对数据进行清洗,处理了少量的缺失值和异常值;用Matplotlib绘制了股票收盘价的时间序列图、K线图,分析股价的趋势性、周期性和波动性;用相关性分析,研究了成交量、成交额、换手率等特征与收盘价的相关性;还计算了股价的涨跌幅、移动平均线(5日、10日、20日)、MACD、KDJ等技术指标,分析这些指标与股价的关系。
通过分析,他发现股票价格数据具有极强的非线性和波动性,没有明显的周期性,受成交量、换手率等因素的影响很大,而且存在很多突发的异常波动,这给模型的搭建带来了很大的困难。同时,他还发现,收盘价与开盘价、最高价、最低价的相关性极高,与成交量、换手率的相关性中等,这些特征都可以作为模型的输入。
接下来,是特征工程。这是股票价格预测项目的核心环节,特征的选择与构建,直接决定了模型的预测准确率。他根据探索性分析的结果,结合股票市场的技术指标,构建了一系列丰富的特征:
1. 基础价格特征:开盘价、最高价、最低价、收盘价、涨跌幅;
2. 成交量特征:成交量、成交额、换手率;
3. 移动平均线特征:5日均价、10日均价、20日均价、5日与10日均价差、10日与20日均价差;
4. MACD特征:DIF、DEA、MACD柱状线;
5. KDJ特征:K值、D值、J值;
6. 滞后特征:收盘价的滞后1天、3天、5天、7天,涨跌幅的滞后1天、3天、5天;
7. 滚动统计特征:收盘价的5日滚动均值、5日滚动方差、10日滚动均值、10日滚动方差;
8. 时间特征:年、月、日、星期,是否为月末、季末。
为了提高模型的泛化能力,他还对特征进行了标准化处理,将所有特征值转换为均值为0、方差为1的分布,避免因特征量级差异过大影响模型的收敛速度。同时,他将数据集按照时间顺序分为训练集和测试集,训练集占80%,测试集占20%,确保模型能够学习到时间序列的内在规律。
接下来是模型选择与搭建。股票价格数据具有极强的非线性和时间依赖性,传统的ARIMA模型已经无法满足需求,必须使用更复杂的深度学习模型。结合之前做门店客流预测的经验,他决定搭建基于注意力机制的LSTM模型——注意力机制能够让模型自动关注重要的特征和时间步,忽略无关的信息,从而提高模型的预测准确率,非常适合处理股票价格这种复杂的时间序列数据。
他设计的模型结构,比之前的LSTM模型更加复杂,也更加完善:
-输入层:接收处理后的高维特征向量;
- LSTM层1:128个神经元,返回序列,捕捉长期时间依赖;
-注意力层:引入注意力机制,对LSTM层的输出进行加权,突出重要特征;
- LSTM层2:64个神经元,返回序列,进一步提取特征;
- Dropout层:dropout率为0.3,防止过拟合;
- LSTM层3:32个神经元,不返回序列;
-批归一化层:加快模型收敛,提高稳定性;
-全连接层1:16个神经元,激活函数为ReLU;
-输出层:1个神经元,输出预测的股票收盘价。
模型搭建完成后,他设置了关键的训练参数:优化器为Adam,学习率为0.0005(股票数据波动大,设置较小的学习率让模型收敛更平稳),损失函数为均方误差(MSE),训练轮数为200,批次大小为64,同时加入了早停机制(Early Stopping),当测试集损失连续10轮不再下降时,自动停止训练,避免过拟合。
第一次训练,模型在测试集上的预测准确率为82.3%,虽然达到了一般的预测水平,但没有达到客户要求的85%。而且,从训练曲线可以看出,模型在训练集上的损失不断下降,而测试集的损失下降到一定程度后开始波动,存在过拟合现象,同时,模型对股价的突发波动预测不够准确,误差较大。
接下来,他开始了漫长而细致的模型优化过程。这是整个项目中最耗时、最考验耐心和技术能力的环节,股票价格预测的难度远超他的预期,每一次优化,都需要他反复思考、反复调试,稍有不慎,就会导致模型性能下降。
他从五个方面入手,对模型进行了全面的优化:
第一,解决过拟合问题。他进一步提高了Dropout层的dropout率,从0.3调整为0.4;在全连接层后也加入了Dropout层;同时,加入了更强的L2正则化,惩罚过大的权重;还对训练数据进行了数据增强,通过随机添加微小噪声的方式,扩充数据集,提高模型的鲁棒性。
第二,优化模型结构。他调整了LSTM层的神经元数量,将第一层的128个减少到100个,第二层的64个减少到50个,避免模型过于复杂;在注意力层后加入了一个池化层,进一步降维,减少参数数量;还调整了注意力机制的权重计算方式,让模型能够更精准地捕捉重要特征。
第三,调整超参数。他通过网格搜索,对学习率、批次大小、训练轮数等超参数进行了全面的优化。将学习率从0.0005调整为0.0003,让模型的收敛更加平稳;将批次大小从64调整为32,让模型能够更好地学习到数据的细节特征;将训练轮数从200调整为150,结合早停机制,有效避免过拟合。
第四,优化特征工程。他通过特征重要性分析,删除了一些与收盘价相关性较低、对模型贡献不大的特征,比如部分时间特征和滚动统计特征;同时,增加了一些新的特征,比如股价的波动幅度(最高价-最低价)、成交量的滚动变化率等,进一步提升特征的表达能力。
第五,改进预测方式。他将「单步预测」改为「多步预测」,通过滑动窗口的方式,让模型一次性预测未来七天的收盘价,同时引入了时间序列的趋势约束,让预测结果更符合股价的实际波动规律,减少突发误差。
每一次优化,他都要重新训练模型,观察预测准确率、损失曲线、预测值与实际值的对比图,分析优化的效果。这个过程极其繁琐,也极其枯燥,往往一次训练就要花费近一个小时,而一次优化效果不佳,就需要重新调整思路,再次调试。
窗外的雨下了又停,停了又下,小木屋里的灯光,始终亮着。李长生坐在电脑前,手指在键盘上快速敲击,眼睛紧紧盯着屏幕上的代码、训练进度条和准确率数据,眼神里充满了专注与执着。他忘记了时间,忘记了疲惫,忘记了外面的寒冷与阴雨,全身心地投入到了模型的优化中。
饿了,就拿出提前准备好的面包和牛奶,快速吃几口;累了,就靠在椅背上,闭上眼睛,休息几分钟,脑海里却依旧在梳理模型的优化思路;遇到难题时,就拿出纸笔,在纸上画下模型的结构,一步步排查问题,寻找解决方案。
就这样,经过五天五夜的高强度优化,反复调试了上百次,他的努力终于有了回报。
当他最后一次按下运行键,模型开始训练。屏幕上的进度条一点点前进,训练集和测试集的准确率不断上升,损失不断下降,而且,训练集和测试集的损失曲线始终保持着高度的一致,没有出现过拟合的迹象。
当训练完成,早停机制在第120轮自动停止训练时,屏幕上显示的结果,让他的眼睛瞬间亮了起来,连日来的疲惫,仿佛在这一刻烟消云散。
测试集准确率:86.9%
不仅达到了客户要求的85%,还超出了1.9个百分点!
他立刻对模型进行了全面的测试,用模型预测了未来七天的股票收盘价,并与实际的历史数据进行对比。屏幕上,预测值的曲线与实际值的曲线几乎重合,只有在少数突发波动的位置,存在微小的误差,整体的预测效果非常理想。
他还绘制了预测值与实际值的对比图、误差分布图、特征重要性图等可视化图表,直观地展示了模型的预测效果。从特征重要性图中可以看出,模型确实能够自动关注开盘价、成交量、5日均价等重要特征,这也证明了注意力机制的有效性。
那一刻,李长生靠在椅背上,长长地舒了一口气,嘴角扬起了一抹久违的、灿烂的笑容。这抹笑容,带着难以掩饰的兴奋、成就感,还有一丝释然。连续五天五夜的努力,无数次的调试,无数次的失败,无数次的重新开始,终于换来了成功。
这是他迄今为止完成的难度最大、技术含量最高的项目,也是他在时间序列预测领域的一次重大突破。他不仅掌握了基于注意力机制的LSTM模型的搭建与优化方法,还深入理解了股票市场的数据分析方法和技术指标,积累了处理复杂非线性时间序列数据的宝贵经验。
他稍微休息了一下,喝了一口水,然后开始撰写详细的项目报告。报告中,他详细介绍了数据探索性分析、特征工程、模型搭建、模型优化的全过程,附上了大量的可视化图表和模型性能指标,还对预测结果进行了分析,给出了一些合理的投资建议。他希望,这份报告不仅能让客户看到模型的预测效果,还能让客户了解到背后的技术逻辑。
做完这一切,已经是清晨七点多。天已经亮了,外面的雨停了,阳光透过云层,洒在郊外的大地上,驱散了连日来的阴冷。他看了一眼时间,快速收拾好东西,将训练好的模型文件、预测结果、项目报告一起打包,发送给了买家。
然后,他锁上小木屋的门,朝着学校的方向,快步走去。
连续五天五夜没有好好休息,他的身体已经到了极限,眼睛里布满了血丝,脸色苍白,脚步也有些虚浮,每走一步,都感觉浑身酸痛。但他的眼神,却依旧坚定,充满了光芒,那是成功后的喜悦,也是对未来的期待。
走到半路,手机震动了一下,是外包平台的消息提醒。他点开一看,是买家的回复,还有一条报酬到账的通知。
买家的消息充满了惊喜和赞赏,发了一连串的感叹号:「太厉害了!真的太厉害了!准确率竟然达到了86.9%,远超我的预期!我原本以为能达到85%就不错了,没想到你竟然做到了!报告写得非常详细,可视化图表也很直观,我能清楚地看到未来七天的股价趋势,这对我来说太有价值了!你绝对是我遇到过的最专业、最厉害的AI开发者!五星好评!以后我所有的股票预测项目,都交给你做!还会把你推荐给我的朋友!」
紧接着,报酬到账的提醒弹了出来,一串醒目的数字映入眼帘:2000元。
他点开余额界面,屏幕上的数字清晰地显示着:15110元。
一万五千一百一十元!
这个数字,像一道光,照亮了他的眼睛。这不仅仅是一笔钱,更是对他技术能力的最高认可。从最初的几百元的小项目,到现在两千元的高难度项目;从最初的数据分析,到计算机视觉,再到时间序列预测;从最初的懵懂探索,到现在的熟练掌握,他用了短短三个月的时间,完成了别人可能需要几年才能完成的成长。
他的脚步,不由得放慢了一些,抬头看了一眼天空。阳光正好,洒在他的身上,带来一丝温暖。他的心里,充满了感慨,也充满了希望。
走到学校门口,早自习的铃声刚刚响起。他深吸一口气,压下心中的激动与感慨,整理了一下衣服,迈步走进了校园。
教室里,王帆已经坐在了座位上,正在认真地早读。看到他走进来,她立刻抬起头,目光落在他苍白的脸上和布满血丝的眼睛里,眼神里闪过一丝心疼,快步走到他身边,轻声说:「你是不是又熬了好几天?脸色怎么这么差?」
他愣了一下,点了点头,声音有些沙哑:「嗯,刚忙完。」
她没有多说什么,只是转身回到自己的座位,从书包里拿出一杯温热的牛奶、一个三明治,还有一盒退烧药,放在他的桌上,轻声说:「这是我早上买的,你快吃点东西。还有,这是退烧药,你好像有点发烧,吃完东西记得吃一片。」
他看着桌上的牛奶、三明治和退烧药,心里涌起一股浓浓的暖流,眼眶微微有些发热。他抬起头,看着她的眼睛,她的眼神里充满了心疼和关心,像冬日里的阳光,温暖而耀眼。
「谢谢你。」他的声音,带着一丝不易察觉的颤抖。
她笑了笑,摇了摇头,说:「不用客气,快坐下来吃吧,别凉了。吃完药,要是不舒服,就趴在桌上休息一会儿,我帮你看着老师。」
说完,她便回到自己的座位,继续早读,只是偶尔会抬头,看他一眼,眼神里满是关心。
李长生坐在座位上,拿起三明治,慢慢吃着。温热的牛奶顺着喉咙流下,温暖了他疲惫的身体,也温暖了他的心。他看着身边认真早读的王帆,心里默默想:有你在,真好。
早自习结束后,他的手机又震动了起来,这次,不是外包平台的消息,而是好几条新的私信,都是不同的买家发来的,想要委托他做AI项目,有「销量预测」的,有「用户行为分析」的,还有「图像分割」的,报酬都不低。
他看着屏幕上的私信,眼神里充满了坚定。
他知道,自己的努力,没有白费。他的AI之路,已经越走越宽,越走越远。
高一的时光,已经过去了近四个月,2020年,也即将走到尽头。
他的双轨生活,依旧稳定而坚定,在校园与小木屋之间,在中等生与AI开发者之间,自由切换。
学校里,他是沉默的中等生,在寒冷的冬日里,感受着同桌最真挚的关心与温暖,这份温暖,成为了他前进的动力。
小木屋里,他是专注的AI学习者,在复杂的AI世界里,不断探索,不断突破,用一行行代码,搭建着自己的梦想。
窗外的阳光,越来越明亮,洒在教室里,洒在他的身上,带来温暖的气息。
他知道,2021年,即将到来。
新的一年,会有新的挑战,也会有新的成长。
而他,已经准备好了。
他的脚步,从未停下。
他的梦想,正在一步步,照进现实。
