乐于分享
好东西不私藏

数据正在下载,但“猜”不能停——从串行、解耦到即友的“猜想与反驳”

数据正在下载,但“猜”不能停——从串行、解耦到即友的“猜想与反驳”

昨天那篇文章发完,我也没停下,晚上又往前拱了一小步。

说“一小步”是因为数据下载还是断断续续,进度条卡在三分之二,剩下的一百多只股票怎么都下不完。

没办法,数据下不完,闲着也是闲着,总结一下昨晚的进展吧。

一、从“并行”到“串行”,再到“解耦”

上次文章里的代码,用的是多线程并行下载。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不会主动建议你降级,因为它的优化目标是“更快”。是我先“猜”——也许接口扛不住并发——然后才试了串行。这一步没有任何数据支持,纯粹是猜。
任务时间点从下午4点半改到早上8点,也是靠经验在猜:当天的数据,收盘后一个多小时真的能清洗干净入库么?
即友接着说,

这就是“猜想与反驳”的核心逻辑:你提出一个猜测,然后拼命试图推翻它。扛住了就暂时成立,扛不住就知道这条路不通。错误不再是失败的证据,而是进步的燃料。

即刻“莫唯书Mark”
拿这次来说,探测脚本猜对了格式,时间猜对了时机,解耦猜对了架构。但更多的猜测其实是错的——并行方案是错的,下午4点半更新也是错的。可没有这些错,就不会有后面的对。
那现在的AI呢?
它本质上是一个巨大的模式匹配器。它读过全人类写的大部分东西,然后学会了“接下来该说什么”。你问它一个问题,它就在见过的所有答案里找出最有可能的那一个。它算得比人快一万倍,但暂时还不会在没有依据的地方,闭着眼睛往前走一步。
这意味着AI目前还只是一个超级助手,而非真正的创造者。它能把你教给它的东西用到极致,但没办法凭空想出一个你从没教过它的假设。
即友最后说了一句我很认同的话:

我从不担心AI太强,我担心的是我们会因为太舒服而忘记自己还有“闭着眼睛往前走一步”的能力。

即刻“莫唯书Mark”
如果每次遇到问题都习惯性问AI,不再自己去猜、去试、去错,那这个能力确实会退化。AI负责“如何做”,人负责“做什么”——这个分工里最危险的部分,不是AI不够强,而是人懒得想了。

如果你不主动想,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生成,真假自辨。

点击本页右下角的“点赞”和“在看”来支持我,分享商业公司、身边社会和读书的一些想法和个人偏见。