8月13日收盘后,如果想稳定复盘四个长期跟踪的方向——酒、煤炭、电力、消费,最快的路径不是把资讯刷一遍再凭感觉拍板,而是把复盘流程做成一套可复用的程序化分析管线。这篇文章直接给你一套能跑的流程:从免费财经接口取板块数据,用 pandas 做筛选和指标计算,最后输出一张"次日策略清单"。8月13日只是一个基准日,你换成最新交易日就能重复执行。
先说明定位:这不是荐股文章,也不存在"代码告诉你明天买什么"这种确定性结果。它能做的是,把板块的涨跌状态、趋势结构、成交量、资金流向汇总成结构化内容,让你在制定次日策略时有统一的事实依据。市场里大部分盘中噪音其实都能被数据屏蔽掉,关键是先把数据流和规则流搭好,后面无论做主观判断还是量化尝试,都有底。
从工程角度看,这套流程解决的是两个问题:一是复盘效率,每天不需要手动翻四个板块的行情、资金流和趋势指标;二是策略一致性,把"偏多、偏弱、放量、缩量、过热"这些模糊概念转化成固定计算规则,让分析结果可以复现、可以回测、可以检查。下面按模块拆开讲。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 分析对象 | 酒/白酒、煤炭、电力、消费四大板块 |
| 数据来源 | 免费联网数据接口,代码示例以 akshare 为例 |
| 核心能力 | 板块快照、日线趋势、量能变化、资金流向、规则信号 |
| 输出内容 | Markdown 或表格形式的次日策略清单 |
| 运行环境 | Python 3.9+,pandas,numpy,akshare |
| 数据收费 | 接口本身免费,但有请求频率限制 |
| 批量能力 | 可对多个板块和成分股批量计算指标 |
| 回测能力 | 支持把规则放到历史数据上验证 |
| 适用场景 | 技术投资者复盘、量化策略原型、板块轮动跟踪 |
从能力分布看,这套流程的定位是分析辅助,不是自动决策。它把信息整合和规则计算从脑力劳动变成脚本运行,省下来的时间应该花在验证结论和风控上,而不是继续盯着 K 线图。如果你本身有固定的观察名单,每天需要重复看板块涨跌、趋势状态和资金流向,这套流程能明显减少重复劳动。
2. 适用场景与使用边界
这套流程更适合以下情况:你已经建立固定观察名单,每天需要对比多个板块的强弱;你在尝试把主观判断转成可回测的规则,而不是停留在"感觉要反弹"这类模糊表达;你想在 T 日收盘后快速生成一份 T+1 日的关注清单,并且希望清单里的每一项都有数据支撑。
它不适合用来自动下单,也不适合作为唯一决策依据。股市存在宏观变量、突发事件和情绪冲击,这些都无法被简单规则完全覆盖。程序化分析只能降低信息整理成本,不能消除市场风险,更不能保证规则永远有效。任何指标都会在特定行情阶段失效,这是必须接受的事实。
合规边界也要说清楚。使用行情接口时,要遵守接口服务条款,不能高频抓取或绕过访问限制。如果后续把分析结果用于内容发布、产品化模块或培训材料,要复核版权和数据来源许可。涉及他人资金操作时,必须明确"分析不等于投资建议",不要用工具输出诱导交易。
3. 环境准备与数据源选择
开始之前准备一个干净的 Python 环境。建议使用 3.9 或更高版本,避免旧版本在 pandas 和接口兼容性上出问题。下面整套流程只依赖数据接口和数据分析库,不需要额外装数据库,也不需要 GPU,普通开发机就能跑。
3.1 安装依赖
pip install akshare pandas numpy如果网络环境无法直接访问默认源,可以换清华镜像源:
pip install akshare pandas numpy -i https://pypi.tuna.tsinghua.edu.cn/simple安装完先确认版本,避免后续接口名对不上:
python -c "import akshare, pandas; print(akshare.__version__, pandas.__version__)"akshare 的接口变化比较频繁,不同版本返回的字段和函数名可能有差异。所以先确认版本,再跑正式脚本,是最省事的排查思路。如果 import 阶段就报错,大概率是安装环境不干净,建议在虚拟环境里重新装一遍。
3.2 数据源选择
| 数据源 | 是否需要 token | 板块分类 | 特点 |
|---|---|---|---|
| akshare | 不需要 | 有行业板块接口 | 免费、接口多、更新频繁 |
| tushare | 需要 token | 有行业分类 | 需要积分门槛,部分接口收费 |
| baostock | 不需要 | 行业分类较弱 | 历史行情稳定,实时性较弱 |
| 手动 CSV | 不需要 | 自己维护 | 完全可控,但更新成本高 |
从快速验证的角度,akshare 最省事,它把大量公开行情接口封装成了 Python 函数,适合先跑通流程。缺点也明显:接口名和字段会随版本变化,今天能跑的代码过几个月可能要小改。下面所有示例代码都只针对你本地安装的版本做参考,运行时报错就先检查接口名和文档,不要硬套代码。
4. 数据获取与板块筛选
先拿到一张全行业板块快照表,每一行是一个行业板块,每一列是一个维度,比如涨跌幅、总市值、换手率、上涨家数、下跌家数、领涨股。这张表是后续所有分析的原材料。
4.1 拉取行业板块快照
akshare 的行业板块接口写法大致如下:
import akshare as ak import pandas as pd df_industry = ak.stock_board_industry_name_em() print(df_industry.shape) print(df_industry.columns.tolist()) print(df_industry.head())不同版本返回的字段不完全一致。比较常见的字段包括行业名称、涨跌幅、总市值、换手率、上涨家数、下跌家数、领涨股票和领涨股票涨跌幅。运行后以实际返回为准。如果接口在你的 akshare 版本里不存在,可以用下面的方式找一下可用函数:
funcs = [f for f in dir(ak) if "industry" in f or "board" in f] print(funcs)把候选函数列出来后,再逐个查看对应的接口文档,确认参数和返回字段。这一步能避免很多版本兼容问题,也方便你对数据源做二次封装。
4.2 筛选酒、煤炭、电力、消费板块
拿到全行业板块表以后,需要从里面把目标板块筛出来。板块名称在不同数据源里叫法不一样,最简单的办法是关键词匹配:
target_keywords = ["酒", "煤炭", "电力", "食品", "商业"] mask = df_industry["板块名称"].apply( lambda name: any(k in str(name) for k in target_keywords) ) df_target = df_industry[mask].copy() print(df_target)注意:这个筛选逻辑依赖板块名称。比如"酿酒行业"能匹配到"酒","煤炭行业"能匹配到"煤炭","电力行业"能匹配到"电力",但"消费"对应的板块可能分散在"食品饮料""商业百货""家用电器"等多个分类里。更稳妥的做法是先打印全部板块名称,人工确认后再写关键词,避免漏掉目标板块或误配其他行业。
4.3 把结果落到本地
为了避免每次分析都重新请求接口,建议把板块快照保存成 CSV:
df_target.to_csv("target_boards_20250813.csv", index=False, encoding="utf-8-sig")保存日期写进文件名,方便后续做多日对比。读取时用:
df_target = pd.read_csv("target_boards_20250813.csv")CSV 是中间产物,保留它有两个作用:一是盘中反复分析时不依赖网络,二是积累几天后可以做板块强弱对比。如果你把这份文件保存到固定目录,后续接入定时任务时只需要读取当天最新文件,历史文件自动成为数据资产。
5. 技术指标计算与信号生成
板块快照只能反映当天状态,真正要判断趋势,还需要日线数据。用日线数据计算均线、量比、累计涨幅,才能判断当前是趋势延续还是末端加速。
5.1 构造板块日线数据
如果能从数据源拿到板块指数的历史行情,通常包含日期、开盘、收盘、最高、最低、成交量和成交额字段。下面是读取后的基础结构:
import pandas as pd df = pd.read_csv("plate_daily.csv", parse_dates=["date"]) df = df.sort_values("date").reset_index(drop=True) df.rename( columns={ "date": "date", "close": "close", "volume": "volume", }, inplace=True, )如果你暂时没有合适的历史接口,可以用一个本地模拟数据来验证流程是否跑得通:
import pandas as pd import numpy as np # 演示数据:非真实行情,仅用于测试计算流程 np.random.seed(42) n = 60 df_demo = pd.DataFrame( { "date": pd.date_range("2025-05-01", periods=n, freq="D"), "close": 100 * np.exp(np.random.randn(n) * 0.01).cumprod(), "volume": np.random.randint(100000, 200000, n).astype(float), } )看到演示数据时要注意:它只用来验证代码能否运行,不表示任何真实行情。真实数据接入后,字段名和索引顺序可能不一样,所以先打印 columns 和 head 再继续计算,是最稳妥的步骤。
5.2 计算基础指标
对四个板块做统一处理时,至少计算这几个指标:
| 指标 | 含义 | 用途 |
|---|---|---|
| 涨跌幅 | 当日较前一日变化 | 判断当日强弱 |
| MA5 | 5 日均线 | 判断短期趋势 |
| MA10 | 10 日均线 | 判断短期趋势延续 |
| 量比 | 当日成交量 / 过去5日均量 | 判断是否放量 |
| 20日涨幅 | 当前价 / 20日前价格 | 判断累计热度 |
def add_indicators(df): df = df.sort_values("date").copy() df["pct_change"] = df["close"].pct_change() * 100 df["MA5"] = df["close"].rolling(5).mean() df["MA10"] = df["close"].rolling(10).mean() df["volume_ma5"] = df["volume"].rolling(5).mean() df["vol_ratio"] = df["volume"] / df["volume_ma5"] df["return_20d"] = df["close"].pct_change(20) * 100 return df计算完成后,要关注最后一行的 MA5 与 MA10 关系、量比是否明显大于 1、20 日涨幅是否过热,这三个点基本决定了次日策略的基调。如果某一行的指标出现 NaN,说明历史数据量不足,至少需要 20 根以上日线才能算满 return_20d。
5.3 规则信号生成
规则的作用是把指标状态变成明确信号。下面是一套很基础的示例规则,不是为了直接买卖,而是演示信号怎么结构化:
def generate_signal(last): if last["close"] > last["MA5"] and last["MA5"] > last["MA10"]: trend = "短趋势偏多" elif last["close"] < last["MA5"] and last["MA5"] < last["MA10"]: trend = "短趋势偏弱" else: trend = "震荡整理" if last["vol_ratio"] > 1.5: volume_state = "明显放量" elif last["vol_ratio"] < 0.8: volume_state = "明显缩量" else: volume_state = "量能平稳" if last["return_20d"] > 15: heat_state = "短线热度偏高" else: heat_state = "热度正常" return { "trend": trend, "volume": volume_state, "heat": heat_state, }规则里的阈值 1.5、0.8、15,都是示例参数。不同板块、不同市场环境下,这些参数要重新调。程序化的好处就是参数可以集中管理,改一处全表生效。把信号生成函数独立出来,后续要加布林带、RSI、MACD 等指标时,只需要在 add_indicators 里加计算,再在 generate_signal 里加判断逻辑。
6. 次日策略清单输出
指标的最终意义是变成可执行清单。清单不需要提具体买卖点,但要有状态、有触发条件、有风险提示。这样在盘中看到行情变化时,你能快速判断是否触发了预设条件。
6.1 清单结构
建议输出字段如下:
| 字段 | 说明 |
|---|---|
| 板块 | 板块名称 |
| 趋势状态 | 偏多 / 偏弱 / 震荡 |
| 量能状态 | 放量 / 缩量 / 平稳 |
| 热度状态 | 正常 / 偏高 |
| 次日观察点 | 需要观察的关键条件 |
| 风险点 | 当前状态下最大的风险 |
趋势状态决定你该不该关注这个板块,量能状态决定关注力度,热度状态决定是否要警惕追高风险。观察点和风险点则是把抽象判断落地成具体条件短语,方便盘中快速核验。
6.2 生成完整清单
def build_strategy_table(df_dict): rows = [] for board_name, board_df in df_dict.items(): board_df = add_indicators(board_df) last = board_df.iloc[-1] signal = generate_signal(last) rows.append( { "板块": board_name, "趋势状态": signal["trend"], "量能状态": signal["volume"], "热度状态": signal["heat"], "次日观察点": build_observation(signal, last), "风险点": build_risk(signal, last), } ) return pd.DataFrame(rows)这里把"次日观察点"和"风险点"实现函数留成了空白,因为不同分析者关心的细节不同。你可以直接在函数里写条件短语模板,比如根据趋势状态和量能状态拼接出"放量站上5日均线继续跟踪,跌破5日均线转弱"这类描述,也可以从外部配置文件读取模板。
6.3 怎么读这份清单
拿到清单后,优先看趋势状态。如果四个板块同时出现"偏多",说明市场整体氛围偏强,重点观察量能能否延续;如果出现"偏弱",就先避开,等趋势修复。再看热度状态,短期涨幅过大的板块要警惕冲高回落,不要因为"还在涨"就忽略位置。
观察点和风险点建议写成条件句,例如:
- 放量站上 5 日均线,继续跟踪;跌破 5 日均线,转弱。
- 热度偏高但量能跟不上,注意缩量滞涨。
- 20 日涨幅过大但趋势仍强,只能用固定风险预算参与。
这类条件句可以手动写在策略模板里,也可以做成配置文件。重要的是让输出内容可控、可复核,而不是一句"明天继续看多"就结束。程序化清单的最大价值是:每个结论都能追溯到具体数据和规则。
7. 风险控制与合规提醒
程序化分析只是一个辅助工具,写到策略清单里的东西都要经过风险过滤。
第一批风险是数据风险。免费接口可能延迟、可能字段变动、可能在盘中返回不完整数据,这都会影响指标计算。对策是:数据保存到 CSV 后做一次完整性检查,比如确认板块数量、日期范围、是否有 NaN。如果发现某一天数据缺失,宁可不生成当日清单,也不要拿残缺数据硬算。
第二批风险是规则风险。任何规则都可能失效,尤其在市场风格切换时。一个阶段有效的量比阈值,到另一个阶段可能完全不适用。规则上线前要回测,上线后要持续观察胜率和盈亏比,不能一套参数用到底。更合理的方式是定期复盘规则表现,把明显退化的规则移除或重新调参。
第三批风险是合规与信息安全。不要使用非法爬虫手段批量抓取数据,不要私下传播来源不明的行情数据。如果策略被做成软件或内容输出,必须明确标注不构成投资建议。涉及他人账户或资金时,更要保持克制,分析工具不能成为诱导交易的借口。尤其是当分析内容被转发到社群时,一定要保留"仅供研究参考,不对盈亏负责"之类的风险提示。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| import akshare 失败 | 未安装或版本过旧 | 运行 pip show akshare | 重新安装并升级到最新版本 |
| 接口名不存在 | 版本变更导致函数名变化 | 用 dir() 搜索板块相关函数 | 以官方文档为准替换接口 |
| 返回 DataFrame 为空 | 网络问题或接口限流 | 打印返回结果和日志 | 等待片刻后重试,降低请求频率 |
| 板块名称匹配不到 | 不同数据源分类名不同 | 打印全部板块名称 | 调整关键词或手工指定板块名 |
| 指标出现大量 NaN | 历史数据量不足 | 查看数据条数和起始日期 | 增加历史数据条数 |
| 模拟数据能跑通但真实数据报错 | 字段名不一致 | 打印真实数据的 columns | 用 rename 统一字段名 |
| 策略输出过于敏感 | 信号阈值设置不合理 | 查看指标分布 | 调低/调高阈值,做回测验证 |
| 高频请求被限流 | 循环里请求太快 | 加 time.sleep 间隔 | 增加延时并缓存中间结果 |
排查的时候记住一个原则:先看数据层,再看计算层,最后看规则层。数据层的问题最容易造成误导,因为数据错了,后面所有指标和信号都是错的。真正常见的坑反而不是策略复杂,而是数据源字段变了、日期没有排序、文件路径不对这些小问题。
9. 最佳实践与后续优化
如果这套流程适合你的复盘习惯,可以从三个方向继续完善。
第一,把流程做成定时任务。工作日收盘后自动拉数据、算指标、生成清单,并把结果发到自己的消息通道。一开始可以先只生成 Markdown 文件,稳定后再接通知。定时任务要注意运行时间要晚于数据源更新完毕的时间,否则拿到的是不完整快照。脚本可以简单用系统 cron 或 Windows 任务计划程序启动,不需要额外部署。
第二,给规则加上回测。任何信号规则先放到过去几个月的板块数据上验证,观察信号出现的次数、后续表现和最大回撤。没有回测的规则,本质上只是主观想法的另一种表达。回测时要注意避免未来函数,指标计算只能用当天及之前的数据。如果回测样本太少,结论不具备统计意义,也要谨慎。
第三,把参数和板块列表配置化。板块名称、关键词、指标阈值、观察点模板都放到 JSON 或 YAML 配置里,改配置就能切换观察名单,不需要改代码。这样做的好处是复盘范围可以快速扩展到其他行业,而不仅仅是酒、煤炭、电力、消费。
{ "boards": { "酒": ["酿酒行业", "白酒"], "煤": ["煤炭行业"], "电": ["电力行业"], "消费": ["食品饮料", "商业百货", "家用电器"] }, "threshold": { "vol_ratio_high": 1.5, "vol_ratio_low": 0.8, "return_20d_high": 15 } }以上是一个示例配置结构,实际接口里的板块名称要以数据源返回为准。配置化的另一层好处是便于版本管理,配置和代码分开后,规则变更记录会非常清晰。
如果第一次跑这套流程,建议先连续观察三天,只记录信号,不做任何操作。等确认数据源稳定、指标计算正确、清单符合你的复盘习惯之后,再逐步把信号接入正常决策流程。最难得的不是跑通代码,而是建立一套能持续积累数据的复盘机制。数据积累得越久,后面的回测和参数调优就越有说服力。