先说个背景:我平时盯盘时间并不充裕,但又不想完全凭感觉买卖。前两年刚开始接触量化时,跟很多人一样,以为“全自动选股”就是装个软件、填几个指标参数,让它每天给我推几只票。真跑起来才发现,数据源、复权、停牌、增量更新、情绪干扰——每一个环节都在劝退新手。后来我索性用Python把整套流程自己搭了一遍,从数据抓取到智能初筛全部自动化,跑了大半年,虽然不敢说它能预测涨跌,但确实帮我从每天手工翻几百只股票的状态里解放了出来。这篇文章就把我搭建这套系统的完整思路、代码细节、踩过的坑一次性写清楚,希望能给同样在Python和AI边缘试探的朋友一点参考。
1. 为什么非要用代码来做这件事:从手动翻票到系统初筛
很多人会觉得,看股票嘛,打开行情软件,按涨幅排名一个个翻不就完了。但实操过的人都知道,当你需要同时看技术形态、财务指标、量能变化、公告新闻,还要保持情绪稳定不追涨杀跌,人的注意力根本撑不过半个小时。我一开始也是这么干的,结果就是今天被某个热点带偏,明天被一根大阴线吓得清仓,毫无纪律可言。
后来我给自己定了个规矩:凡是能用规则描述的事情,就让代码去干;凡是需要主观判断的事情,再交回给人。这个思路落实到选股上,就是把“每天翻几千只股票,粗筛出值得进一步研究的二十只”这个动作,变成一个半自动的筛选管线。我给它起了个名字叫“股票龙虾”——因为它像个有着两只大钳子的机器人,一只钳子负责往家里捞数据,另一只钳子负责把垃圾和噪声捏碎,最后只留下干净的、符合条件的猎物。
这套系统有三层定位,大家先在心里有个底:
- 第一层是数据自动化:它拉取的是公开行情数据,不需要人每天手动导出Excel,也不依赖某些行情软件的公式系统。你说自己也想搞一套,没问题,核心就是Python请求公开数据源并做本地化存储。
- 第二层是规则化初筛:把可量化的标准写成策略,比如财务指标阈值、均线排列、动量排名、波动率区间等,让程序批量计算。这相当于把过去你眼睛扫图表的动作拆解成一个个固定逻辑。
- 第三层是AI辅助分析:传统指标擅长处理数字,但公告标题、新闻通稿、研报摘要里面的语气和态度,传统公式没法直接量化。这部分我会用大模型API做语义初筛,把文本信息转成可参与打分的情感标签。
我当时用这套系统替代的,其实就是“每天早上开盘前花二十分钟翻一遍自选股和涨幅榜”的习惯。系统会在每天收盘后自动把数据拉齐、跑完初筛,第二天开盘前我只需要花五分钟看一眼输出名单,再决定要不要人工深入研究。
需要强调一句,这套系统输出的是“初筛候选池”,不是“买入指令”。它解决的是信息过载和注意力分配问题,而不是替你拍板。明确了这层边界,你在搭建和使用它的时候才不会走偏。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据是地基:行情数据获取的三种主流方式与我的选型
2.1 免费开源库、券商接口、自写爬虫,怎么选
行情数据是整个系统的地基,这个环节如果数据质量不行,后面所有筛选逻辑都是空中楼阁。我实际调研下来,个人开发者做A股数据分析通常有三条路:
| 方案 | 优点 | 缺点 | 适合人群 |
|---|---|---|---|
| 开源数据接口库(如AkShare、Tushare Pro、Baostock) | 免费或低成本、字段丰富、上手快 | 接口可能变动、有频率限制、部分库需要注册token | 绝大多数个人开发者 |
| 券商/量化平台官方API | 数据稳定、实时性好、有专业支持 | 一般需要券商开户或机构资质,门槛较高 | 已经在券商开户且走量化交易通道的人 |
| 自己写爬虫抓网页数据 | 完全自主可控、不受第三方接口限制 | 维护成本极高,网页改版就废,还可能涉及合规风险 | 极少数有精力长期维护的人 |
我最终选择的是第一类方案,主力用了AkShare加Baostock的组合。原因很简单:AkShare覆盖的接口非常多,从历史行情、实时行情到交易日历都有;Baostock则胜在免费且不需要token,做一些长时间的日线回测数据拉取比较稳。
这里特别提一句,网上很多旧教程里的AkShare接口现在已经变了,比如早期版本获取A股列表用的接口名,在后来版本里已经换成了stock_info_a_code_name()。所以如果你照着老教程跑不通,不要怀疑自己,先去官方文档页搜一下新接口名。我自己跑的时候也被这个坑绊过两回。
2.2 Python环境准备和安装
因为很多读者可能是第一次接触Python,我多说几句环境的事。你不用下载Anaconda那么大一个全家桶,直接到Python官网下载安装包就行。Windows安装时有一个非常关键的勾选项——一定要勾选“Add Python to PATH”,否则后面在命令行里输入python会提示找不到命令,这一步是新手最常见的问题。
装好之后打开终端(Windows叫命令提示符或PowerShell),依次执行:
bash复制python --version
pip --version
能正常输出版本号,说明环境OK。然后把需要用到的库装一下:
bash复制pip install akshare baostock pandas schedule requests
如果你的网络环境装库比较慢,可以用国内镜像源加速。注意,这个步骤只是装依赖,不涉及任何代理工具。
2.3 第一批数据入手:A股列表和日线行情
环境就绪后,先把数据跑通。下面这段代码拉取全部A股代码列表,并打印前五只股票:
python复制import akshare as ak
# 获取A股上市公司代码与名称
df_code = ak.stock_info_a_code_name()
print(df_code.head())
print("总股票数:", len(df_code))
接着拉取某只股票的历史日线数据。以贵州茅台(600519)为例:
python复制import akshare as ak
df_daily = ak.stock_zh_a_hist(
symbol="600519",
period="daily",
start_date="20240101",
end_date="20241231",
adjust="qfq" # 前复权
)
print(df_daily.head())
print(df_daily.tail())
adjust="qfq"表示前复权,这个概念我们下一节详细说。如果你把period换成weekly,拿到的就是周线数据。
2.4 为什么不建议自己写爬虫
可能有人觉得,既然AkShare底层也是爬虫,那我干脆自己写一个,岂不更自由?我的看法是:能封装的数据获取,就不要自己造轮子。自己写爬虫获取行情数据,需要处理cookie过期、IP限制、网页结构变化、验证码、断线重连等一系列问题。花一周写出来的爬虫,可能三个月后对方网站改版就直接报废。而开源库实际上已经帮你把这些麻烦处理掉了,虽然接口偶尔变动,但维护成本比自己写低一个数量级。
数据源选型这件事,我得到的最大教训是:先小步快跑,不要贪多求全。一开始别想着把财务、公告、资金流、龙虎榜全部拉下来,先把代码列表和日线跑通,存到本地,再逐步加字段。数据链路越短,出错时越好排查。
3. 先让数据“干净”起来:清洗、对齐与增量更新的那些坑
如果说拉数据是搬运工的工作,那清洗数据就是质检员的工作。很多人拿到数据就往策略里塞,结果算出来的指标完全不对,回头还以为是策略问题。我第一版系统就栽在复权和停牌这两件事上。
3.1 复权到底是怎么回事
先讲一个非常容易踩的坑:除权除息日。比如某只股票现在价格100元,公司宣布10派10元,也就是每股分红1元。除息日当天,股价会从100元直接跳到99元开盘。如果只看原始价格,你会以为这只股票一天跌了1%,但事实是公司把利润分给你了,你手里还多了现金分红。
更夸张的是送转股。如果10送10,股价直接砍半,图表上看像腰斩,但你的持股数量翻倍了,总资产其实没变。如果不做复权处理,所有均线、涨跌幅、动量指标都会被这种人为跳空扭曲。
复权分为前复权和后复权:
- 前复权(qfq):把历史价格向下调整,让当前价格与市场真实价格一致。绝大多数行情软件默认显示前复权。
- 后复权(hfq):把历史价格向上调整,让首日价格为基准,走势更真实反映长期收益,但显示的价格不是真实成交价。
在我们这种“全市场扫一遍”的选股场景下,看历史收益率和均线趋势,建议用后复权做计算,用前复权做展示。我在日线拉取时,会在数据文件里同时保留原始价和前复权价,回测和实盘信号都用前复权数据,因为这样计算出的信号相对来说更贴近真实交易时的盘面观察。
如果你用AkShare,直接传adjust="qfq"就好了;如果你用Baostock,取数时能拿到adjustFlag参数,可以一次把不复权、前复权、后复权都拉出来。
3.2 停牌和缺失值不能直接填充
股票停牌时,当天就没有行情数据。如果你用pandas的fillna()把缺失值填成前一天的收盘价,会让MACD、RSI这类带周期计算的指标发生偏差,甚至产生“停牌期间还在交易”的错误信号。
我的处理原则是:停牌日期直接保留为空,不填充,计算指标时用skipna逻辑跳过空值。在使用Baostock时,交易日没有成交量的记录会被过滤掉,所以拿到数据后先检查一下量能是否为0或NaN,如果出现且日期不是节假日,优先怀疑是停牌。
3.3 交易日历:别在周六跑数据,别把调休日当节假日
A股什么时候开市,不是简单地“周一到周五”,还有法定节假日调休。比如国庆节前的周末可能要上班,但股市不开;春节前后的交易日安排也经常调整。如果你用pd.bdate_range()生成工作日,再拿这个日期去拉行情,大概率会出现节假日请求失败。
稳妥的做法是用交易日历接口。AkShare提供一个交易日历接口,示例代码如下:
python复制import akshare as ak
df_trade_date = ak.tool_trade_date_hist_sina()
print(df_trade_date.tail())
拿到这个DataFrame后,把所有交易日存成列表,后面的定时任务只在这个列表内的日期运行,可以有效减少无效请求。
3.4 增量更新:用日期游标避免重复拉全量
如果你每天拉一次全市场几千只股票的三年日线,接口会被限流,本地存储也会越来越大。正确的思路是“增量更新”:本地已经存到2025年4月1日,下次更新就只拉4月2日到4月3日的数据。
逻辑其实很简单,就是用一个日期游标记录每只股票本地数据的最大日期:
python复制import os
import pandas as pd
import akshare as ak
DATA_DIR = "./stock_data"
def update_stock_daily(symbol: str):
file_path = os.path.join(DATA_DIR, f"{symbol}.csv")
# 如果本地已有数据,就读取最后一行的日期
if os.path.exists(file_path):
df_old = pd.read_csv(file_path)
last_date = pd.to_datetime(df_old["date"]).max().strftime("%Y%m%d")
else:
last_date = "20200101"
# 从本地最大日期开始拉取,end_date 可以留空自动取当天
df_new = ak.stock_zh_a_hist(
symbol=symbol,
period="daily",
start_date=last_date,
end_date="20500101",
adjust="qfq"
)
# 去掉可能重复的最后一天数据,再合并
if os.path.exists(file_path):
df_new = df_new[df_new["日期"] > pd.to_datetime(last_date)]
df_merged = pd.concat([df_old, df_new], ignore_index=True)
else:
df_merged = df_new
df_merged.to_csv(file_path, index=False, encoding="utf-8-sig")
这里有个小细节:stock_zh_a_hist返回的日期列名是中文“日期”,不是英文date,很多初学朋友在这里会报KeyError。字段名到底是中文还是英文,取决于你用哪个接口,建议每次拿到DataFrame先打印columns确认一下。
3.5 本地存储选CSV还是SQLite
我第一版用的是CSV,一个股票一个文件。好处是直观,能直接拿Excel打开看;坏处是股票数量多了以后,文件数量变得很庞大,做全市场扫描时要遍历几千个文件,效率明显下降。
后来我迁移到了SQLite,一个文件搞定,查询速度和文件管理都好了不少。如果你还在起步阶段,用CSV没问题;但如果你打算长期跑全市场,我建议直接用SQLite。只要在代码里把to_csv换成to_sql,把read_csv换成read_sql,改动成本并不高。
数据清洗这个环节我总结一句:宁可缺失,不要乱填。数据质量问题的隐蔽性在于,它不会让程序报错,只会让最终结果慢慢失真,让你误以为策略失效了,其实是数据根本没对齐。
4. 智能筛选模型搭建:从指标公式到AI参与的初筛管线
数据干净了,接下来是系统的核心——筛选模型。我把筛选分成两大部分:传统量化指标的机器打分,和基于大模型的文本语义初筛。两者结合,才配叫“AI智能筛选”。
4.1 先把筛选逻辑定义成可计算的规则
在写代码之前,建议先把自己的选股逻辑写在纸上。不是为了学术严谨,而是为了逼自己面对一个问题:你到底凭什么觉得一只股票值得关注?
我第一版规则很简单粗暴,目的是先把流程跑通。当时我设置的过滤条件是这样的(仅作为示例):
- 上市时间超过3年,剔除次新股
- 最近一季度ROE大于10%
- 最近一年营收增速大于10%
- 股价在5日均线之上
- 近20日日均成交额大于1亿元
- 当前价格在10元以上
这些条件本质上是在描述“有一定盈利质量、流动性不错、短期趋势没有走坏”的股票。你不用照抄我的条件,关键是形成“用规则表达想法”的习惯。
4.2 打分而非一票否决
单一的硬性过滤有个毛病:假如一只股票ROE是9.8%,其他所有条件都很优秀,就因为差0.2%被刷掉了,可能有点可惜。所以我后来把过滤逻辑改成了打分制。
每个维度按0到100分打分,再按权重线性加权:
python复制def composite_score(row):
score = 0.0
# 财务质量
score += min(row["roe"] / 15.0 * 100, 100) * 0.3
# 成长性
score += min(row["revenue_yoy"] / 20.0 * 100, 100) * 0.2
# 趋势强度:股价相对60日均线的位置
if row["close"] > row["ma60"]:
score += 60 * 0.2
score += min((row["close"] / row["ma60"] - 1) * 100, 10) * 2 * 0.2
else:
score += 30 * 0.2
# 流动性:成交额越集中在合适的区间,分数越高,这里只是示意
score += min(row["amount_20d"] / 5e8 * 100, 100) * 0.15
# AI情绪得分,从外部传入,默认给50分
score += row.get("ai_sentiment_score", 50) * 0.15
return score
上面这些权重看起来拍脑袋,其实我是参考了很多人的公共经验后设的初始值,然后边跑边改。你不用担心权重设置不完美,重要的是整个管线可以随意调参,这样你后续才有优化的空间。
4.3 AI在这里到底能做什么
你可能要问,既然都能打分,那AI的角色是什么?我做下来的体会是,AI主要负责处理那些“公式没法搞定”的文本信息。
具体来说,我会把两类文本交给大模型:
- 公司公告标题和摘要:比如“关于签订重大合同的公告”“关于收到政府补助的公告”,标题本身就有情绪倾向。
- 近期新闻标题列表:个股新闻的聚合标题,能一定程度反映市场关注点和舆论风向。
为什么不用现成的金融情感词典?因为中文金融文本的表达太灵活了,“业绩预增”“商誉减值”“收到问询函”这些词需要结合上下文理解,传统词典对否定句式和新词的处理很弱。而大模型在这类短文本分类任务上,效果是明显过硬的。
4.4 大模型情感判断的代码示例
我用一个函数,把新闻标题列表传给大模型,让它返回JSON格式的情感判断。这里的关键点在提示词设计上,需要明确告诉模型输出格式:
python复制import json
from openai import OpenAI
client = OpenAI(
api_key="你的API_KEY",
base_url="你的接口地址"
)
def judge_news_sentiment(news_list):
prompt = f"""
你是一名A股资讯分析助手。请阅读以下个股相关新闻标题,判断其整体情绪。
新闻标题:
{json.dumps(news_list, ensure_ascii=False)}
请严格输出如下JSON格式,不要输出任何其他内容:
{{
"sentiment": "positive / neutral / negative",
"score": 0到100之间的整数,50为中性,
"reason": "一句话说明判断理由"
}}
"""
resp = client.chat.completions.create(
model="你的模型名称",
messages=[
{"role": "user", "content": prompt}
],
temperature=0.2
)
content = resp.choices[0].message.content.strip()
# 清理可能的Markdown代码块标记
content = content.replace("```json", "").replace("```", "").strip()
return json.loads(content)
调用时,把当天每只股票的新闻标题列表传入,得到0到100的情感分,再当成一个因子加权到刚才的composite_score()里。
4.5 提示词工程里最容易忽略的事
经验不足的人第一次调大模型接口,容易遇到两个问题:
第一个是模型不听话,输出了一堆解释而不是纯JSON。解决办法是上面代码里加一步对输出内容做清洗,把所有json和标记去掉;更稳的办法是在提示词里加一句“不要输出任何解释性文字”。只要你的提示词约束越明确,出错率越低。
第二个问题是API调用耗时。全市场几千只股票,如果你每天给每只都发一次请求,费用和延迟都吃不消。我的做法是只在第一轮候选池出炉后,再对有候选资格的一两百只股票做AI文本分析。这样既省了成本,又让AI筛选集中在最值得关注的范围内。
4.6 关于模型选型的小建议
如果你要处理的是纯文本分类、情感判断这种简单任务,没必要一上来就接最大最贵的模型。我自己试下来,中等规模的模型在这类任务上完全够用,而且响应更快、成本更低。更复杂的深度研报分析,我才会单独用更强的模型去处理。这个思路就像筛选泥沙时用筛子就够了,没必要开一台挖掘机。
整个筛选环节跑通后,你每天收盘后要做的事非常机械:先执行数据更新,再执行打分程序,最后把得分前20的股票存成一个待研究清单,供次日人工复核。
5. 全自动闭环:任务编排、异常重试与运行监控
整套系统如果只能手动在命令行里跑,还谈不上“全自动”。你需要让它在收盘后自动运行,然后在第二天早盘前把结果送达到你手上。
5.1 用几行代码实现定时任务
我推荐使用schedule库做轻量级定时调度,它足够简单,不需要额外部署分布式任务框架。下面是一个调度脚本的骨架:
python复制import schedule
import time
import datetime
import akshare as ak
DAILY_HOUR = 17 # 每天17点后运行,A股15点收盘,留出数据更新时间
def is_trade_day():
"""判断今天是否交易日,最简单方法:查交易日历接口"""
df_cal = ak.tool_trade_date_hist_sina()
today = datetime.date.today()
return today in set(pd.to_datetime(df_cal["trade_date"]).dt.date)
def daily_job():
if not is_trade_day():
print("非交易日,跳过")
return
print("开始更新行情数据...")
update_all_stocks()
print("开始执行智能筛选...")
run_screener()
print("当日任务完成")
schedule.every().day.at(f"{DAILY_HOUR:02d}:00").do(daily_job)
while True:
schedule.run_pending()
time.sleep(60)
is_trade_day()会先判断当天是不是交易日,不是就直接跳过——这比在代码里写一堆假期判断要省事得多。
5.2 异常重试:数据接口说崩就崩
免费数据接口的稳定性,说多了都是泪。我遇到过AkShare某个接口临时失效、服务器返回空数据、网络超时等各种问题。所以重要数据更新函数里,我加了异常重试机制:
python复制import time
def fetch_with_retry(func, retries=3, wait_seconds=5):
for attempt in range(retries):
try:
return func()
except Exception as e:
print(f"第{attempt + 1}次尝试失败:{e}")
if attempt < retries - 1:
time.sleep(wait_seconds)
else:
raise RuntimeError("重试多次仍然失败,请人工检查数据源")
所有网络请求相关的操作,都包一层fetch_with_retry,能解决90%的偶发网络问题。
5.3 日志系统:没有日志的定时任务等于裸奔
如果你把系统部署在一台长期开机的电脑或者服务器上,没有日志监控,出了问题根本不知道什么时候开始坏的。Python有个内置的logging模块,配合RotatingFileHandler可以按大小切分日志文件:
python复制import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger("stock_lobster")
logger.setLevel(logging.INFO)
handler = RotatingFileHandler(
"stock_lobster.log",
maxBytes=10 * 1024 * 1024,
backupCount=5,
encoding="utf-8"
)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("系统启动")
5.4 交付结果:邮件还是即时通知
筛选结果写到一个CSV文件里只是第一步,要想真正方便,建议把结果推送到你常用的通讯工具上。最简单的做法是接入常见即时通讯机器人的webhook接口,把当日候选股票列表、综合得分、入选原因打包成一条消息发出来。
要注意,推送之前先把敏感信息和免责声明加上:“本清单仅作为数据分析演示,不构成任何投资建议”。这句话既是对用户的保护,也是一种纪律提醒。
5.5 部署环境建议
如果有一台云服务器或者旧的迷你主机,把脚本部署上去是最理想的,7x24小时运行,不用操心电脑休眠。如果暂时没有服务器,用一台不常关机的台式机也行。Windows下可以用“任务计划程序”定时启动脚本,Linux下用crontab,但这两种方式都需要在脚本里处理路径切换和环境变量问题。
我自己的做法是把代码放到固定目录,用统一的环境启动命令去执行,避免双击运行时环境变量不对的坑。
6. 跑了大半年之后的真心话:这套系统的能力与边界
系统搭建完成只是万里长征第一步,真正有价值的是后面反复调优和使用过程中积累的认知。我把自己跑了大半年之后最真实的感受写在这里,可能会劝退一些人,也可能让你省掉几个月的试错。
6.1 数据质量永远是第一优先级
我在第3节反复强调数据清洗,这里不想再重复数据有多重要,只想说一个现象:当你的策略跑出来的结果不如预期时,不要第一反应就去调权重、换因子,先检查数据里有没有隐藏的脏数据。我调试系统过程中最离谱的一次,是因为某只股票在停牌期间没有做剔除处理,导致它的“20日涨幅”被错误地计算成了负值,连续几天被指标当成超跌股推上来。后来查出来是停牌处理逻辑漏了一个分支。
先怀疑数据,再怀疑策略,这是量化初筛的第一原则。
6.2 筛选逻辑不可能一成不变
市场环境会变,选股标准也会变。以前你觉得“低价股有翻倍潜力”,注册制推行后壳价值消退了,低价股反而可能成为退市风险股。所以筛选逻辑最好设计成配置文件,不要写死在代码里。
我的做法是把所有规则参数放到一个config.py或.yaml文件里:
yaml复制filters:
min_roe: 8.0
min_revenue_yoy: 5.0
min_amount_20d: 1.5e8
min_close: 5.0
weights:
roe: 0.3
revenue_yoy: 0.2
trend_score: 0.2
liquidity_score: 0.15
ai_sentiment_score: 0.15
每次调整完参数,重新跑一遍当天数据就能看到候选池变化。你甚至还可以把历史每日的候选池存下来,三个月后复盘时看看当初系统筛出来的股票,后续表现到底如何。
6.3 AI情感因子的权重一定不要设太高
大模型对文本的理解能力确实强,但新闻情绪是瞬息万变的。今天铺天盖地都是“利好”的股票,明天可能就爆出黑天鹅。AI因子的作用是给你提供另一维度的参考,而不是主导你的决策。
我最初把AI情绪因子权重设到了0.3,跑了一个月后发现,候选股票频繁跟着当天的新闻热搜走,换手率和波动率都上来了,和我“寻找稳健标的”的初衷完全相反。后来我把权重压到0.1到0.15之间,候选池才稳定下来。用一句话概括我的体会:AI在这里是个助理,不是老板。
6.4 它不会替你解决“买不买”的问题
写到这儿肯定有朋友想问:那它到底能不能赚钱?
我的回答是:它负责的是把全市场5000多只股票,根据你的偏好压缩成一份值得花时间研究的名单。真正赚不赚钱,取决于你深入研究之后怎么决策、什么时候进场、以及你的风控纪律。工具帮不了你控制情绪,也帮不了你扛住回撤。
我现在的使用方式也更像是一个“研究助理”:每天早上看它推的二十只股票,挑出三五只感兴趣的,认真看公告和财报,再决定要不要动手。这个习惯坚持下来,最大的收益反而不是某只股票赚了多少,而是我对市场的观察方式从“凭感觉”变成了“有体系、可复盘”。
6.5 后续还能怎么扩展
如果你觉得这套系统还不够过瘾,可以沿着下面几个方向继续深入:
- 把日线行情换成分钟级行情,做日内波动分析
- 接入更多基本面数据,把毛利率、现金流、负债率纳入打分
- 给候选股票自动生成一份简要分析报告,直接输出给用户阅读
- 加入回测引擎,把你设定的筛选参数放到历史数据上跑一遍,看看它过去三年表现如何
- 换成你自己关心的其他投资品种,只要数据源支持,逻辑几乎可以原样复用
我自己下一步的计划就是加入回测模块,让每次调参都能在几秒钟内看到历史表现变化,而不是靠感觉判断“参数有没有变好”。
最后分享一个我个人的体会:搭建这套系统的过程,比系统本身更有价值。它逼迫我把散落在行情软件、财报网站、新闻资讯里的信息,整理成一套有逻辑、可验证的工作流。当你真正把这件事做完,你会发现自己对市场的理解比过去提升了一个层级。希望这篇文章能帮你少踩一些坑,早点把数据自动化和智能初筛这套东西跑起来。
