ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从数据到策略清单:用Python搭建高效板块复盘分析管线

从数据到策略清单:用Python搭建高效板块复盘分析管线 8月13日收盘后如果想稳定复盘四个长期跟踪的方向——酒、煤炭、电力、消费最快的路径不是把资讯刷一遍再凭感觉拍板而是把复盘流程做成一套可复用的程序化分析管线。这篇文章直接给你一套能跑的流程从免费财经接口取板块数据用 pandas 做筛选和指标计算最后输出一张次日策略清单。8月13日只是一个基准日你换成最新交易日就能重复执行。先说明定位这不是荐股文章也不存在代码告诉你明天买什么这种确定性结果。它能做的是把板块的涨跌状态、趋势结构、成交量、资金流向汇总成结构化内容让你在制定次日策略时有统一的事实依据。市场里大部分盘中噪音其实都能被数据屏蔽掉关键是先把数据流和规则流搭好后面无论做主观判断还是量化尝试都有底。从工程角度看这套流程解决的是两个问题一是复盘效率每天不需要手动翻四个板块的行情、资金流和趋势指标二是策略一致性把偏多、偏弱、放量、缩量、过热这些模糊概念转化成固定计算规则让分析结果可以复现、可以回测、可以检查。下面按模块拆开讲。1. 核心能力速览能力项说明分析对象酒/白酒、煤炭、电力、消费四大板块数据来源免费联网数据接口代码示例以 akshare 为例核心能力板块快照、日线趋势、量能变化、资金流向、规则信号输出内容Markdown 或表格形式的次日策略清单运行环境Python 3.9pandasnumpyakshare数据收费接口本身免费但有请求频率限制批量能力可对多个板块和成分股批量计算指标回测能力支持把规则放到历史数据上验证适用场景技术投资者复盘、量化策略原型、板块轮动跟踪从能力分布看这套流程的定位是分析辅助不是自动决策。它把信息整合和规则计算从脑力劳动变成脚本运行省下来的时间应该花在验证结论和风控上而不是继续盯着 K 线图。如果你本身有固定的观察名单每天需要重复看板块涨跌、趋势状态和资金流向这套流程能明显减少重复劳动。2. 适用场景与使用边界这套流程更适合以下情况你已经建立固定观察名单每天需要对比多个板块的强弱你在尝试把主观判断转成可回测的规则而不是停留在感觉要反弹这类模糊表达你想在 T 日收盘后快速生成一份 T1 日的关注清单并且希望清单里的每一项都有数据支撑。它不适合用来自动下单也不适合作为唯一决策依据。股市存在宏观变量、突发事件和情绪冲击这些都无法被简单规则完全覆盖。程序化分析只能降低信息整理成本不能消除市场风险更不能保证规则永远有效。任何指标都会在特定行情阶段失效这是必须接受的事实。合规边界也要说清楚。使用行情接口时要遵守接口服务条款不能高频抓取或绕过访问限制。如果后续把分析结果用于内容发布、产品化模块或培训材料要复核版权和数据来源许可。涉及他人资金操作时必须明确分析不等于投资建议不要用工具输出诱导交易。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 把结果落到本地为了避免每次分析都重新请求接口建议把板块快照保存成 CSVdf_target.to_csv(target_boards_20250813.csv, indexFalse, encodingutf-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(dropTrue) df.rename( columns{ date: date, close: close, volume: volume, }, inplaceTrue, )如果你暂时没有合适的历史接口可以用一个本地模拟数据来验证流程是否跑得通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, periodsn, freqD), close: 100 * np.exp(np.random.randn(n) * 0.01).cumprod(), volume: np.random.randint(100000, 200000, n).astype(float), } )看到演示数据时要注意它只用来验证代码能否运行不表示任何真实行情。真实数据接入后字段名和索引顺序可能不一样所以先打印 columns 和 head 再继续计算是最稳妥的步骤。5.2 计算基础指标对四个板块做统一处理时至少计算这几个指标指标含义用途涨跌幅当日较前一日变化判断当日强弱MA55 日均线判断短期趋势MA1010 日均线判断短期趋势延续量比当日成交量 / 过去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 } }以上是一个示例配置结构实际接口里的板块名称要以数据源返回为准。配置化的另一层好处是便于版本管理配置和代码分开后规则变更记录会非常清晰。如果第一次跑这套流程建议先连续观察三天只记录信号不做任何操作。等确认数据源稳定、指标计算正确、清单符合你的复盘习惯之后再逐步把信号接入正常决策流程。最难得的不是跑通代码而是建立一套能持续积累数据的复盘机制。数据积累得越久后面的回测和参数调优就越有说服力。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进