数据正在下载,但“猜”不能停——从串行、解耦到即友的“猜想与反驳”
昨天那篇文章发完,我也没停下,晚上又往前拱了一小步。
说“一小步”是因为数据下载还是断断续续,进度条卡在三分之二,剩下的一百多只股票怎么都下不完。
没办法,数据下不完,闲着也是闲着,总结一下昨晚的进展吧。
一、从“并行”到“串行”,再到“解耦”
上次文章里的代码,用的是多线程并行下载。300只股票,15个线程同时跑,理论上两小时搞定。实际上呢?十分钟之后,终端开始报错:
‘utf-8’ codec can’t decode byte 0xa8…
Error -3 while decompressing data…
[Errno 9] Bad file descriptor
“`
我问AI怎么回事。它分析了一通,说是网络问题、库版本问题,建议我升级、重试。我照着做了,问题依旧。
后来我换了个思路:既然并行不行,那就串行。一次只下一只股票,每次间隔1秒。虽然慢(300只加起来要两三个小时),但至少不再报错了。
我把这个想法告诉AI,它说:“这样效率比较低,但可以试试。”——你看,它不会主动建议你“降级”的。因为它的优化目标永远是“更快、更准、更高效”,它不知道接口的稳定性比速度更重要。
AI擅长在既定框架内找最优解,但它不会主动质疑框架本身。并行快,但接口扛不住,那再快也没用。这个判断需要人来做。
于是数据又能继续下载了。趁着这段间隙,我回顾了整体过程,觉得哪里有点怪怪的,突然脑中一闪:训练脚本每次运行都要全量下载,即使数据没变。这就像每次做饭都要从种菜开始,完全不讲道理。
于是我让AI把流程拆成了四个独立的脚本:
1. download_data.py — 首次全量下载,串行,支持断点续传。
2. update_data.py — 每日增量更新,只请求缺失的日期区间。
3. train_model.py — 每周训练,只读缓存,不联网。
4. predict_daily.py — 每日预测,也只读缓存。
这个“解耦”的思路不是AI给的。
AI很擅长帮你实现一个你已经想好的架构,但它不会主动告诉你“你的架构有问题,应该拆开”。你需要先有那个判断,然后再让它帮忙写代码。
二、AI的“谄媚”和我的“探测脚本”
这次折腾中,AI帮我写了不少代码,但也经常把我带进沟里。最典型的就是“猜测数据格式”。
比如Baostock返回的股票列表,我让AI写解析函数。它看了一眼文档,自信地写出`row[0]`就是股票代码。结果运行后发现全是日期。
我让AI改代码,AI继续猜测数据格式。我受不了了,就让AI给我一个探测脚本,打印了前10行原始数据,才发现真实返回的是`[日期, 代码, 名称]`,股票代码在第二个字段。
我跟AI说:“你为什么不先让我打印一下原始数据再写代码?”它回答:“为了避免给您增加额外的步骤。”——这不就是典型的“讨好型人格”么?宁可猜错,也不愿意让用户多跑一步。
后来我养成习惯:凡是涉及数据格式的地方,先写一个10行的小脚本把原始输出打印出来,看懂了再让AI写正式的解析逻辑。这个流程虽然多了一步,但省去了后面无数次改代码的时间。
还有时间解析。Baostock返回的`time`字段是`20260401094500000`这种14位数字,我需要提取`HHMM`。AI一开始给的正则又长又复杂,我说:“你就取第9到12位不行吗?”它愣了一下,说“可以,更简洁”。
——有时候AI会过度设计,把简单问题复杂化。
三、任务时间:从“下午4点半”到“早上8点”
这种每天要进行的任务,放在哪个时间点合适呢?关于任务的时间,也有一段小插曲。
AI一开始建议我每天下午4点半运行更新,理由是“收盘后数据已就绪”。我犹豫了一下,觉得盘中数据可能不稳定,万一4点半数据还没更新完呢?
后来我让AI查了Baostock的说明,发现上一交易日的分钟数据通常在次日凌晨才能完全提供。
于是我把时间改成了“每个交易日上午8点”。
– 8:00 运行`update_data.py`,只更新到上一个完整交易日(避免盘中不完整数据)。
– 8:15 运行`predict_daily.py`,基于上一个完整交易日的特征进行预测。
– 8:30 打开Streamlit看板,查看今日推荐。
这个时间点,数据已经稳定,开盘前就能拿到信号。AI没有主动提醒我考虑数据延迟的问题,它只是照搬了“收盘后运行”的常见模式。
四、人和AI怎么配合?我最近在想的事
进步真正的起点,是一个人面对一个没人解决过的问题,闭着眼睛往前走了一步。这一步没有任何依据,没有任何保证,甚至大概率是错的。但它一旦被迈过去,从此世界就多了一条以前没有的路。
即刻“莫唯书Mark”
我们从小被教育做事情要有依据,要等有足够证据再下结论。这套方法论在稳定、重复的环境里管用,但在真正的创新面前完全失效。因为真正的新东西在刚出现的时候,是没有依据的,必须被凭空“猜”出来。
即刻“莫唯书Mark”
这就是“猜想与反驳”的核心逻辑:你提出一个猜测,然后拼命试图推翻它。扛住了就暂时成立,扛不住就知道这条路不通。错误不再是失败的证据,而是进步的燃料。
即刻“莫唯书Mark”
我从不担心AI太强,我担心的是我们会因为太舒服而忘记自己还有“闭着眼睛往前走一步”的能力。
即刻“莫唯书Mark”
如果你不主动想,AI不会替你想。如果你连问题都提不出来,它就只是台高级计算器。
人类的这个独特能力,希望不会在和AI相处中,因为顺其自然的自己偷懒而渐渐被放弃了。

五、最终产出的四个脚本和当前进度
现在我的项目目录长这样:
stock/
├── minute_cache/ # 分钟数据缓存(parquet文件)
├── download_data.py # 首次全量下载(串行,已跑通)
├── update_data.py # 每日增量更新(只到上一个完整交易日)
├── train_model.py # 每周训练(只读缓存)
├── predict_daily.py # 每日预测(只读缓存)
├── dashboard.py # Streamlit看板
├── model.pkl # 训练好的模型
└── predictions.csv # 历史预测结果
“`
数据下载还在进行中——不是代码问题,是免费接口就这个速度。等全部下完,接下来才是重头戏:训练模型,看看预测准确率到底怎么样。
说实话,我不确定这个策略能不能赚钱。但它至少让我跑通了一套自动化的数据管道:每天8点更新,8点15自动预测,打开浏览器就能看到推荐。
这件事本身还有点其他价值——即使最终模型表现一般,这个框架也可以用来实验其他特征和算法。
写这篇文章的时候,数据还没下完。我也不知道最终的模型效果能不能跑赢基准,更不敢说能赚钱。等数据下完,训练完成,我再来写第三篇——看看模型到底有没有用,还是又是个玄学。
当然,一如既往:本文完全由AI生成,真假自辨。
夜雨聆风