第12章 李代码的爬虫初战
凌晨两点十七分,李代码的显示器还亮着。
三块屏幕,左边是黑色终端里滚动的绿色日志,中间是Chrome浏览器开着二十几个标签页,右边是Excel表格和Python编辑器。房间唯一的光源是屏幕光,映在他三天没刮胡子的脸上,像某种诡异的仪式。
他正在写一个爬虫。
不是普通爬虫——那种抓取网页信息、批量下载图片的初级玩意,他大三就会写了。这个爬虫要高级得多,它要潜入几十个财经论坛、数百个股票贴吧、上千个投资微信群聊的聊天记录(通过某些非公开接口),抓取关键词出现的频率、情感倾向、讨论热度,然后喂进一个LSTM神经网络,预测下一个交易日的板块轮动。
简单说,他要量化市场情绪。
这个想法诞生于两周前,在茶水间被那个用《易经》算股票的实习生“击败”之后。李代码当时就明白了:这个市场里,理性分析干不过玄学,基本面干不过消息面,而消息面的本质是情绪传导。与其研究财报,不如研究人心——用代码研究。
过去十四天,他睡了不到七十个小时。咖啡罐在脚边堆成小山,外卖盒子散发馊味,但代码就要完成了。现在只差最后一步:把抓取到的文本数据做情感分析,正面词加分,负面词减分,再加权时间衰减——越临近收盘的讨论,权重越高。
他敲下最后一行代码:
def calcute_sentiment_score(text, timestamp):
# 情感词典加载
positive_words = load_positive_dict()
negative_words = load_negative_dict()
# 时间衰减系数
time_factor = calcute_time_decay(timestamp)
# 计算基础情感分
base_score = len([w for w in text if w in positive_words]) - len([w for w in text if w in negative_words])
# 应用衰减
final_score = base_score * time_factor
return final_score
运行。没有报错。进度条开始缓慢爬升:1%...5%...12%...
李代码靠在椅背上,闭上眼睛。他能听见机箱风扇的嗡鸣,能闻到自己身上的汗味,能感觉到心脏因为过度摄入***而不规则地跳动。但更多的是兴奋——一种即将揭开市场面纱的兴奋。
他想证明,这个由贪婪和恐惧驱动的市场,是可以被量化的。那些看似随机的波动,那些突如其来的涨停跌停,那些“消息灵通人士”的“内幕消息”,归根结底都是情绪的共振。而情绪,是可以被测量的。
进度条爬到100%。终端弹出结果:
今日市场情绪指数:-0.34(偏悲观)
热门板块情绪排名:
1. 新能源汽车:+0.87
2. 半导体:+0.45
3. 白酒:-1.23
...
李代码盯着屏幕。新能源汽车板块情绪分最高,符合预期——最近政策利好不断。白酒板块情绪分最低,也合理,毕竟估值在高位,资金有出逃迹象。但半导体只有+0.45,这有点意外。他看了几篇研报,都说半导体景气度持续,资金在流入。
他的爬虫说不是。
他调出原始数据:抓取的八千多条关于半导体的讨论中,“卡脖子”“制裁”“产能过剩”等负面词出现频率是正面的两倍。虽然研报乐观,但散户情绪已经转向悲观。
“有意思。”李代码喃喃自语。研报代表机构的“嘴”,散户情绪代表市场的“腿”。嘴说一套,腿走另一套,这事儿常有。
他看了眼时间:凌晨三点二十。距离A股开盘还有六个小时。
他做了个决定:信爬虫。
不是全信,是拿一部分资金试水。他有三万块闲钱,原本打算换台新电脑。现在,他决定用这一万块,验证他的模型。
他打开交易软件,登录那个尘封已久的账户——去年亏了八千块后就没再碰过。账户余额:31247.86元。他选了新能源汽车板块里情绪分最高的三只股票,半导体板块里情绪分最低但基本面还行的两只股票(逆向操作),白酒板块完全不碰。
挂单。设置买入价:今日开盘价上浮1%(防止高开买不到)。设置止损:-5%。止盈:+10%。
做完这一切,天快亮了。窗外泛起鱼肚白,城市的轮廓在晨雾中显现。李代码关掉显示器,瘫在床上,却睡不着。脑子里全是数字、曲线、概率。
他想起了大学时上的第一门编程课。教授说:“代码世界是确定的,输入决定输出。现实世界是不确定的,充满了随机性。”
当时的李代码觉得这话太哲学。现在他明白了:他正在尝试用确定的代码,去捕捉不确定的现实。像个用渔网捞风的傻瓜。
但万一捞到了呢?
早晨八点,李代码被闹钟叫醒。睡了不到四小时,但精神亢奋。他冲了个冷水澡,煮了壶浓得发苦的咖啡,坐在电脑前。
九点十五分,集合竞价开始。
他的五只股票,三只新能源汽车高开,两只半导体低开——完全符合情绪指数预测。
九点三十分,正式开盘。
新能源汽车板块高开高走,他买入的三只股票,十分钟内分别涨了3%、2.5%、4%。半导体板块低开低走,他买入的两只股票,一只跌了1%,一只横盘。
李代码心脏狂跳。不是因为赚钱——那一万块就算涨10%也才一千块——而是因为预测对了。他的模型,那个用十四天不眠之夜堆出来的代码怪物,第一次实战,就蒙对了。
不对,不是蒙。是基于数据的判断。
他不断刷新情绪指数的实时更新。新能源汽车的情绪分在攀升,从+0.87涨到+1.12。半导体的情绪分在下降,从+0.45跌到+0.21。
十点,他的新能源汽车股票平均涨了5%。半导体股票跌了2%。
十点半,新能源汽车板块开始回调。情绪指数显示,讨论热度在下降,负面词汇开始出现:“获利了结”“冲高回落”“量能不足”。
李代码犹豫了三秒,卖出了两只新能源汽车股票,留了一只最强的。卖出价分别比买入价高4.8%和3.7%。
十一点,他留下的那只新能源汽车股票继续冲高,涨到7%。半导体股票跌到-3%。
中午休市。李代码瘫在椅子上,手心全是汗。账户浮动盈利:+862元。半天,赚了他月薪的五分之一。
更重要的是,他的模型在实时验证中表现良好。情绪指数的变化领先股价波动大约十五分钟——足够他做出反应。
他点了个外卖,但吃不下。大脑在高速运转:要不要加仓?要不要调整参数?下午情绪会怎么走?
他打开爬虫的后台,查看实时抓取的数据流。每分钟新增数千条讨论,关键词云图在滚动,“新能源”“锂电”“涨停”出现频率最高。但在这些热词之下,有一些不起眼的关键词在悄悄增加:“监管”“问询”“减持”。
他点开“减持”相关的讨论,发现集中在几只小盘股上。其中一只是他留的那只新能源汽车股票的供应商。有帖子说,这家供应商的大股东可能减持。
李代码皱眉。这是噪音,还是有效信息?他的模型没有考虑个股层面的利空,只做板块情绪分析。
他快速写了个补充脚本,抓取所有“减持”关键词出现的股票代码,然后交叉比对基本面数据——股东结构、近期公告、历史减持记录。
结果出来了:那家供应商确实有减持可能,但概率不高,而且就算减持,对下游整车厂的影响也有限。
他决定忽略这个信号。
下午一点,开盘。
他留的那只新能源汽车股票,在冲高到8%后开始回落。两点,回落到5%。两点半,回落到3%。
李代码看着它一点点跌回去,像看着潮水退去。他本该在最高点卖出的——情绪指数在十一点半就显示过热了。但他贪心了,想等更高。
最后,他在涨2%时卖掉了。加上上午卖出的两只,今天总盈利:+1423元。年化收益率……他懒得算,反正很高。
半导体股票更惨,一只跌了5%,触发了止损线自动卖出;另一只跌了4%,他手动割了。
收盘后,李代码复盘全天操作。新能源汽车板块整体涨了3.2%,他抓住了一半涨幅。半导体板块跌了2.8%,他吃到了大部分跌幅。
总战绩:盈利1423元,扣除亏损,净利润896元。
不多,但意义重大。这证明他的思路可行——市场情绪可以被量化,并且可以用来指导交易。
他给模型打了第一个勾。
晚上,李代码没有继续写代码。他出门了,去了那家“暴打空头”奶茶店。店里人满为患,他排队二十分钟,买到了一杯“涨停甜度”的柠檬茶。
喝着酸甜的饮料,他观察店里的人。大部分是年轻人,捧着手机看盘后分析,讨论明天买什么。有人兴奋地说“今天赚了十个点”,有人懊恼“又卖飞了”。
李代码听着,突然觉得荒诞。这些人,用真金白银,在玩一个近乎随机的游戏。而他用代码,试图找到这个游戏的规律。
“哥们,今天怎么样?”旁边一个戴眼镜的男生凑过来问。
李代码想了想,说:“还行,小赚。”
“买的啥?”
“新能源。”
“牛逼啊!我买的半导体,套了。”眼镜男叹气,“你说半导体还有戏吗?”
如果是以前,李代码会说“看技术面”“看基本面”或者“我也不知道”。但现在,他有数据。
“情绪面不太好。”他说,“散户讨论里负面词多。”
眼镜男愣了:“情绪面?那是啥?”
李代码不知道怎么解释。难道说“我用爬虫抓了八千条讨论做了情感分析”?
“就是一种感觉。”他含糊道。
眼镜男似懂非懂地点点头,转回去继续看手机。
李代码喝完奶茶,走回家。路上,他打开手机,看到一条推送:“新能源汽车板块今日大涨,机构看好后市。”
他笑了。机构看好?他的爬虫显示,下午两点以后,新能源汽车的情绪分已经从+1.12跌到+0.76。散户在获利了结,机构在唱多接盘。
信息差。这就是信息差。
回到家,李代码没有立刻开始工作。他站在窗前,看着城市的夜景。万家灯火,每一盏灯下,可能都有一个看盘的人,一个研究K线的人,一个渴望从市场里分一杯羹的人。
而他,李代码,一个普通的程序员,刚刚用代码窥见了这个庞大游戏的一角。
他回到电脑前,打开编辑器。今天只是开始,模型还有很多可以优化的地方:情感词典不够完善,时间衰减系数需要调整,板块关联性没有考虑……
他新建了一个文件,命名为:
market_sentiment_v2.0.py
这一次,他要抓取更多数据:微博话题热度、财经新闻情感倾向、甚至股民表情包的使用频率(比如“牛”和“熊”的表情数量比)。
他要建一个更精准的模型。
一个能预测人心,或者至少,能预测人心如何影响股价的模型。
敲下第一行代码时,他想起了那个用《易经》算股票的实习生。实习生用八卦,他用代码。看似天差地别,但本质上都在做同一件事:寻找确定性,在一个不确定的世界里。
不同的只是工具。
而工具,会进化。
凌晨四点,李代码的爬虫再次启动。这一次,它的触角伸向更广阔的网络空间,抓取着亿万人的贪婪、恐惧、希望和绝望。
数据流如瀑布般倾泻在屏幕上。
李代码盯着那些滚动的字符,眼睛发亮。
他知道,这只是开始。
真正的战争,刚刚打响。
而他,有了第一件武器。
一件名为“代码”的武器。
一件试图量化人心的武器。
疯狂吗?
也许。
但在这个疯狂的市场里,疯狂也许是唯一的理性。
窗外,天色又渐渐亮了。
新的一天,新的战斗。
而李代码,已经准备好了。