ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用Python构建A股板块量化分析框架:白酒煤炭电力消费实战指南

用Python构建A股板块量化分析框架:白酒煤炭电力消费实战指南 8月13日这个时间节点对A股投资者来说有些特殊。中报进入密集披露期白酒和消费需要靠业绩验证逻辑迎峰度夏让煤炭和电力进入需求旺季中秋国庆的备货周期大概率启动消费板块的关注度开始回升。于是很多人收盘后反复问同一个问题明天策略怎么办但这里真正需要想清楚的是如果白酒、煤炭、电力、消费同时出现在你的备选名单里你到底用什么指标去跟踪、比较和验证没有一套数据化的分析框架明天策略最终只会变成情绪化决策——哪个板块涨了追哪个哪个板块跌了又急着切换。这恰恰是大多数散户亏钱的根源。这篇文章不预测点位不推荐个股而是提供一套可落地的板块研究方法。我会把这四个板块的产业逻辑、核心观察指标、Python分析流程完整拆开让你在收盘后能自己跑一遍数据形成有依据的策略预案而不是靠盘感做决定。先说明风险本文只讲研究框架和数据分析方法不构成任何投资建议。市场有风险所有决策都需要你独立判断并自担风险。1. 这篇文章真正要解决的问题先说一个真实场景。假设现在是8月13日晚间你需要为下一个交易日做一个简单的计划。打开行情软件四个板块各有各的理由煤炭看着像在走趋势电力有高股息逻辑白酒超跌不少消费又有利好预期。到底选谁散户最常见的做法是看哪个顺眼买哪个或者看昨天涨了哪个就追哪个。这样做最大的问题是你根本不知道自己的判断依据是什么所以第二天一旦波动就会彻底乱掉。我建议把这个问题拆成三个层面第一产业逻辑层面。四个板块当前的核心矛盾分别是什么例如白酒看库存和批价煤炭看供需和长协价电力看来水和电价政策消费看社零和居民收入预期。这个层面的理解决定你愿不愿意在这个时间窗口关注它。第二数据验证层面。产业逻辑说得再好也需要量价数据来验证。均线趋势、相对强度、资金流向、成交量变化这些都是可以计算的客观指标。这个层面帮你排除逻辑正确但市场不认的板块。第三策略预案层面。验证完后你会得出一个结论哪些板块符合条件哪些板块暂时回避。然后针对符合的板块预设第二天的触发条件和应对方案而不是盘中临时起意。说白了明天策略不是一个预测动作而是一个预案动作。本文要解决的就是如何用数据搭建从产业逻辑到策略预案的完整工作流。2. 白酒、煤炭、电力、消费的核心逻辑与观察指标这四个板块放在一起其实覆盖了A股几种典型风格白酒代表核心资产和消费复苏预期煤炭代表高股息和周期红利电力代表防御性和公用事业属性消费代表宏观需求和政策刺激方向。2.1 白酒板块库存、批价与业绩验证白酒板块的波动从来不是简单看销量而是看渠道库存和批发价格。渠道库存决定酒厂向经销商的压货空间批价决定渠道利润和终端信心。8月中旬这个时间节点白酒的关注点是中秋国庆备货节奏。正常情况下经销商会在8月中下旬开始为双节备货这时酒厂的出货数据、经销商的打款意愿、终端烟酒店的动销反馈都比单纯的市盈率更有参考价值。如果你是做短中期跟踪最实用的三个指标是龙头酒企批发价变化、渠道库存水位、中报业绩与指引。这三个指标能快速判断白酒是处于去库存阶段还是补库存阶段。2.2 煤炭板块供需缺口与价格锚煤炭的逻辑核心是量价而价格锚定在供需关系上。动力煤看电厂日耗和港口库存炼焦煤看钢厂开工率和焦化厂补库意愿。8月中旬正好是迎峰度夏的后半程全国多地仍处于高温状态电厂日耗通常维持高位。这时候需要观察的是港口煤炭库存是否持续下降、电厂日耗是否超预期、产地安全检查是否影响供给。只要日耗维持高位、库存去化顺畅煤价就有支撑。煤炭还有一个特殊属性高分红。很多煤炭上市公司过去几年分红率较高这让它在利率下行背景下具备类债券的配置价值。所以煤炭的行情有时候是周期逻辑和红利逻辑的叠加。你要先判断当前市场主要交易的是哪种逻辑才能理解走势背后的原因。2.3 电力板块来水、电价与防御属性电力板块在A股市场里更像一个稳定器。它的核心逻辑是发电量相对稳定、现金流可预期、分红能力较强。8月需要跟踪的维度有三个。第一是来水情况水电大省来水丰枯直接影响发电量和利润第二是电价政策市场化交易电价的变化会改变市场对电力公司未来收入的预期第三是高温天气的持续性这会影响全社会用电需求。电力和煤炭在这个时间窗口有联动关系高温推高用电负荷用电负荷推高火电需求火电需求又拉动动力煤消费。理解这个链条你就知道为什么有时候煤炭和电力会同步走强有时候又会分化——分化的关键是电价政策和成本传导能力。2.4 消费板块预期修复与政策催化消费板块覆盖范围很广从食品饮料到家电、旅游、零售都算消费。它的特点是基本面变化慢但预期变化快。8月看消费更多是看预期层面。社会消费品零售总额数据、CPI走势、居民消费信心指数、促销费政策的落地节奏都会影响板块估值。每年8月到9月市场还会提前交易国庆长假的消费预期免税、酒店、旅游、餐饮链都会有资金关注。但要注意消费板块内部差异巨大。高端消费和大众消费的逻辑截然不同必须分开看。例如高端白酒看商务需求和礼赠需求大众消费品看居民购买力恢复。用中证消费指数代替整个消费板块在分析上会丢失很多细节。2.5 板块逻辑对比板块核心矛盾关键观察指标典型市场风格白酒库存周期、批价、动销经销商库存、批发价、中报业绩核心资产、消费复苏煤炭供需缺口、长协价、高分红港口库存、电厂日耗、煤价周期红利、高股息电力来水、电价、需求水电出力、市场化电价、用电量防御型、公用事业消费居民收入、政策预期社零数据、CPI、促销政策困境反转、预期驱动看完这个表你应该能感受到这四个板块没有一个能用单一指标解释。需要构建一个多维度数据跟踪体系才能减少误判。3. 环境准备与分析工具链分析板块行情靠肉眼盯盘是不够的。推荐用 Python 搭建一套简单的数据工作流每天收盘后自动拉取行情数据、计算指标、输出信号。这套工作流不追求复杂只追求可靠。我建议使用以下工具Python 3.9 及以上版本建议用 Anaconda 或 Miniconda 管理环境。pandas 和 numpy用于数据处理和指标计算。akshare 或 tushare用于获取行情数据。注意这两个库的接口会随版本更新而变化文中代码以通用思路为主。matplotlib 或 pyecharts用于可视化。本地 CSV 文件用于存储每日数据快照避免每次重复请求接口。如果你还在用 Excel 手工整理数据建议尽快迁移到脚本化流程。原因很简单可重复、可追溯、减少操作误差。每天收盘后运行一条命令自动输出四个板块的核心指标和信号比手动翻行情软件高效得多。创建项目目录结构和虚拟环境mkdir sector-analysis cd sector-analysis python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate pip install pandas numpy akshare matplotlib版本问题要说明一下akshare 是一个活跃更新的库接口名在不同版本可能变化。如果你安装后发现某个接口报错优先去官方文档查最新调用方式不要死记硬背老接口名。本文的示例代码给出的是通用调用逻辑真实使用时以你的库版本为准。4. 使用 Python 获取板块行情数据先写一个数据获取工具模块。这个模块的核心任务是把板块行情数据落盘供后续分析使用。考虑到不同数据源的接口差异这里提供两个思路。第一个是直接使用 akshare 的指数历史数据接口第二个是如果接口不可用可以先用本地 CSV 模拟数据后续再切换到真实数据源这样可以保证分析流程先跑通。# 文件路径sector-analysis/data_loader.py import pandas as pd import akshare as ak from datetime import datetime, timedelta def fetch_index_daily(symbol: str, start_date: str 20240101) - pd.DataFrame: 获取指定指数的日线行情数据。 symbol 示例 - 000300: 沪深300 - 399997: 中证白酒 注意不同板块指数对应的 symbol 以数据源说明为准。 try: df ak.index_zh_a_hist( symbolsymbol, perioddaily, start_datestart_date, end_datedatetime.now().strftime(%Y%m%d) ) df.rename(columns{ 日期: date, 开盘: open, 收盘: close, 最高: high, 最低: low, 成交量: volume }, inplaceTrue) df[date] pd.to_datetime(df[date]) return df except Exception as e: print(f接口调用失败{e}) return pd.DataFrame() if __name__ __main__: # 先下载沪深300用于后续计算相对强度 hs300 fetch_index_daily(000300) hs300.to_csv(./data/hs300.csv, indexFalse) print(hs300.tail())这段代码的关键点是把数据源返回的中文字段统一改写成英文字段方便后续流程处理。另外把结果保存成 CSV 是一个好习惯避免每次分析都重复请求接口也可以减少网络异常带来的不确定性。在使用 akshare 之前先确认你安装的版本里有没有index_zh_a_hist这个方法。不同版本方法名可能不同如果报错就在 Python 交互环境中执行import akshare as ak print([name for name in dir(ak) if index in name.lower()])把输出中的可用方法名替换到代码里即可。如果你更习惯用 tushare也可以在 token 配置完成后用pro.index_daily接口。两种数据源选一个即可不需要同时维护。关键在于把流程沉淀成脚本而不是每天手工处理。5. 核心指标计算均线、RSI、MACD 与相对强度数据拉下来之后就要开始计算技术指标。这里要强调一点技术指标不是水晶球它只是帮你过滤噪音、量化趋势状态的工具。不要神话它但也不要完全无视它。5.1 移动平均线与趋势判断均线是最基础的趋势指标。我们主要用 MA20 和 MA60 来判断中短期趋势价格在 MA20 之上说明短期多头占优价格在 MA60 之上说明中期趋势偏强。两个均线的排列状态多头排列还是空头排列比单条均线更有参考价值。5.2 RSI超买超卖判断RSI 用于衡量一段时间内涨跌力量的强弱。常用参数是 14 天。RSI 高于 70 进入超买区低于 30 进入超卖区。它的价值在于识别极端状态比如板块短期涨幅过大时RSI 会提示你不能盲目追高。但 RSI 在强趋势中会长期钝化也就是持续处于超买区却不回调。所以 RSI 更适合作为辅助确认指标而不是单一买卖信号。5.3 MACD趋势动能判断MACD 由快线 DIF、慢线 DEA 和柱状图组成。DIF 上穿 DEA 是金叉下穿是死叉。柱状图的正负和长短变化反映趋势动能强弱。MACD 在震荡行情中会产生较多假信号所以需要结合趋势方向综合判断。5.4 相对强度 RS板块对比的关键指标前面三个指标都只反映单个板块自身状态。真正用于板块对比的是相对强度 RS计算方法是RS 板块区间涨幅 - 基准指数区间涨幅基准指数建议用沪深300。如果白酒板块近20日涨幅是3%沪深300是1%那白酒的 RS 就是2%。RS 越大说明该板块相对市场越强。这个指标在板块轮动中非常实用。市场资金永远在寻找相对强势的方向RS 持续提升的板块往往更容易获得增量资金关注。5.5 指标计算代码实现# 文件路径sector-analysis/indicators.py import pandas as pd def add_ma(df: pd.DataFrame, windows: list [20, 60]) - pd.DataFrame: 增加移动平均线列 for w in windows: df[fma{w}] df[close].rolling(windoww).mean() return df def add_rsi(df: pd.DataFrame, period: int 14) - pd.DataFrame: 计算 RSI 指标 delta df[close].diff() gain delta.clip(lower0).rolling(windowperiod).mean() loss -delta.clip(upper0).rolling(windowperiod).mean() rs gain / (loss 1e-10) df[frsi{period}] 100 - (100 / (1 rs)) return df def add_macd(df: pd.DataFrame, fast12, slow26, signal9) - pd.DataFrame: 计算 MACD 指标 ema_fast df[close].ewm(spanfast, adjustFalse).mean() ema_slow df[close].ewm(spanslow, adjustFalse).mean() df[dif] ema_fast - ema_slow df[dea] df[dif].ewm(spansignal, adjustFalse).mean() df[macd] (df[dif] - df[dea]) * 2 return df def calc_relative_strength(sector_df: pd.DataFrame, benchmark_df: pd.DataFrame, period: int 20) - pd.DataFrame: 计算板块相对基准指数的相对强度 RS。 用指定周期内的累计涨幅差值来衡量。 sector_ret sector_df[close].pct_change(period) bench_ret benchmark_df[close].pct_change(period) merged pd.DataFrame({ date: sector_df[date], sector_ret: sector_ret, bench_ret: bench_ret }).dropna() merged[rs] (merged[sector_ret] - merged[bench_ret]) * 100 return merged计算完这些指标后建议把它们合并成一张宽表保存。后续分析时一行就是一天的数据方便直接筛选和观察。# 文件路径sector-analysis/build_features.py import pandas as pd from data_loader import fetch_index_daily from indicators import add_ma, add_rsi, add_macd, calc_relative_strength # 板块与基准指数数据 sector_symbols { 白酒: 399997, # 实际使用时以数据源说明为准 煤炭: 399998, 电力: 399999, 消费: 399996, } hs300 pd.read_csv(./data/hs300.csv, parse_dates[date]) for name, symbol in sector_symbols.items(): df fetch_index_daily(symbol) if df.empty: print(f{name} 数据获取失败跳过) continue df add_ma(df) df add_rsi(df) df add_macd(df) rs_df calc_relative_strength(df, hs300) # 合并相对强度 df pd.merge(df, rs_df[[date, rs]], ondate, howleft) df.to_csv(f./data/{name}_features.csv, indexFalse) print(f{name} 数据处理完成最新日期{df[date].max()})6. 资金流向与成交额验证技术指标反映的是价格状态但价格可以被少数资金影响所以还需要观察成交量和资金流向来做二次确认。成交额是最容易获取、也最能说明问题的指标。板块指数放量上涨说明资金关注度提升行情延续概率较大缩量上涨则要警惕持续性不足。同样下跌时放量比缩量更危险说明资金在快速离场。这一层分析不需要太复杂的模型用成交额的简单移动平均就能建立基本认知当日成交额高于过去5日均值1.2倍以上说明当日交投活跃低于0.8倍说明市场观望情绪浓厚。# 文件路径sector-analysis/volume_check.py import pandas as pd def check_volume_activity(df: pd.DataFrame, short_window: int 5) - pd.DataFrame: 判断最近成交量能是否放大 df df.copy() df[volume_ma5] df[volume].rolling(windowshort_window).mean() df[volume_ratio] df[volume] / df[volume_ma5] return df # 使用示例 sector_df pd.read_csv(./data/白酒_features.csv, parse_dates[date]) sector_df check_volume_activity(sector_df) latest sector_df.iloc[-1] print(f最新日期{latest[date]}) print(f当日成交量能比{latest[volume_ratio]:.2f}) print(结论放量 if latest[volume_ratio] 1.2 else 结论缩量或常态)资金流向数据方面北向资金的实时数据目前获取限制较多不建议把北向数据作为唯一决策依据。更实用的做法是关注两融余额变化和行业资金净流入数据即使有滞后也能从趋势上辅助判断。从技术上讲价格、成交量、资金流向三者互相验证比只看单一指标可靠得多。如果你发现一个板块技术指标偏多但成交额持续萎缩、资金流向也没有起色那大概率是假突破。7. 从信号到策略预案一个最小可行框架所有指标计算完成后最后一步是把它们综合成一个可执行的策略预案。我推荐用五维评分卡的方式而不是把每个指标单独拿出来解读。五维评分卡包含趋势、动能、量能、相对强度、风险度。每项打分范围是 -2 到 2总分范围是 -10 到 10。评分规则如下维度评分规则趋势收盘价在 MA20 与 MA60 之上且多头排列2仅站上 MA201跌破 MA20-1跌破 MA60-2动能MACD 金叉或柱状图持续为正2柱状图转正1柱状图转负-1死叉-2量能成交额显著放大且价格上涨2温和放量1缩量上涨-1放量下跌-2相对强度RS 为正且持续提升2RS 为正但走平1RS 为负但回升-1RS 为负且走弱-2风险度RSI 高于 80 或价格距 MA60 过远-2RSI 位于 70-80-1RSI 位于 40-702RSI 位于 30-401RSI 低于 30 但趋势未走坏0# 文件路径sector-analysis/scorer.py def score_sector(df: pd.DataFrame) - dict: 根据最新数据输出板块评分 latest df.iloc[-1] prev df.iloc[-2] score 0 # 趋势评分 if latest[close] latest[ma20] and latest[close] latest[ma60]: score 2 if latest[ma20] latest[ma60] else 1 elif latest[close] latest[ma20]: score 1 elif latest[close] latest[ma20]: score - 1 else: score - 2 # MACD 动能评分 if latest[dif] latest[dea]: score 2 if latest[macd] 0 else 1 else: score - 2 if latest[macd] 0 else 1 # RS 相对强度评分 if latest[rs] 0: score 2 if latest[rs] prev[rs] else 1 else: score - 1 if latest[rs] prev[rs] else 2 # RSI 风险度评分 if latest[rsi14] 80: score - 2 elif latest[rsi14] 70: score - 1 elif latest[rsi14] 40: score 2 elif latest[rsi14] 30: score 1 return {score: score, close: latest[close], date: str(latest[date])}得到各板块评分后策略预案的思路就很清晰了优先关注总分在 6 分以上的板块。总分在 2 到 5 分的板块保持观望等待信号进一步确认。总分低于 0 的板块坚决规避不因跌得多就盲目抄底。这只是一个最小可行的框架。每个投资者可以根据自己的风险偏好调整权重比如更看重趋势还是更看重相对强度。关键是必须先有规则再谈操作。没有规则第二天开盘后你依然会被分时图牵着走。注意评分卡输出的不是明天一定涨的信号而是在众多板块中哪个板块当前状态更值得纳入观察列表的排序结果。真正执行时还要结合大盘环境、突发消息和自身仓位控制。8. 常见错误与排查思路在实际使用这套流程时很多人会遇到一些典型问题这里集中梳理一下。问题现象可能原因排查方式解决方案数据接口突然报错akshare 版本更新导致接口变更打印库版本查看 dir 中可用接口名查阅对应版本文档替换为新接口名板块指数代码对不上不同数据源对同一板块的指数代码不一致用数据源提供的指数列表接口核对以所选数据源官方文档为准统一符号表指标结果出现 NaN 空值数据起始日短于指标所需窗口检查数据最早日期和 rolling 窗口长度拉取更长历史数据或对前 N 行不做判断相对强度 RS 出现异常大值基准指数或板块数据存在除权除息缺口对比日线数据中的复权字段优先使用前复权数据评分结果与行情观感不一致指标参数或评分权重设置不合理回溯历史数据交叉验证评分与后续表现调整参数或权重增加样本回测只分析单日信号频繁买入卖出忽略了多日连续验证增加连续 N 日信号过滤条件要求至少连续 2 日满足条件才纳入观察新手最容易犯的错误是把评分当成必涨指令然后盘中频繁操作。正确的做法是评分只是观察列表的加入条件真正执行交易还需要结合自己的持仓、风险承受能力和大盘环境。另一个常见错误是数据口径混乱。有人看板块涨跌幅时用了不同起始日期导致相对强度计算结果完全失真。建议在脚本中统一基准日例如统一使用当年第一个交易日作为起点。9. 最佳实践与工程建议把这套流程从自己跑着玩变成每天稳定运行需要注意下面几个工程习惯。第一数据要落盘。每一次接口请求都尽量保存到本地 CSV 或 SQLite 数据库方便以后回溯也能减少对数据源接口的频繁调用。行情数据有累积价值今天觉得没用的字段未来回测时可能非常关键。第二脚本要可重复。把数据获取、指标计算、评分输出拆成独立模块形成一条完整的流水线。这样每次运行只需要一个入口命令比如python run_pipeline.py入口脚本内部依次执行数据更新、特征计算、评分输出并把当日结果写入一个 summary 文件。这样你回家打开电脑三分钟就能看到最新评分。第三加上简单的日志记录。在关键步骤打印日期、数据量、运行耗时出现问题时能快速定位是数据源问题还是本地代码问题。# 文件路径sector-analysis/run_pipeline.py import logging from datetime import datetime logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(flogs/pipeline_{datetime.now().strftime(%Y%m%d)}.log), logging.StreamHandler() ] ) logging.info(开始执行板块分析流水线) # 这里依次调用数据更新、特征计算、评分模块 logging.info(板块分析流水线执行完成)第四定期复盘评分结果。每天记录评分的同时也记录决策和结果。每周回头看一次总结哪些信号最终被验证哪些信号是噪音。这个过程比任何指标都重要因为你在建立属于自己的经验库。第五遵守最小操作原则。不是每个板块都要交易。四选一甚至空仓等待都是合理的选择。框架的价值不在于让你每天都有操作而在于让你明确知道什么时候不该操作。10. 总结与后续学习方向回到最初的问题8.13 白酒、煤炭、电力、消费明天策略怎么做正确的回答方式是先判断产业逻辑是否成立再用价格趋势、成交量和相对强度进行数据验证最后通过评分卡形成策略预案。本文已经把这条链路完整拆开并且用 Python 实现了从数据获取到评分输出的最小工作流。你应该已经理解真正的策略不是某个神奇的买卖点而是一套可重复、可验证、可改进的研究流程。每天变化的不是框架而是输入的数据。数据更新后框架会告诉你四个板块当前谁更强、谁更弱、谁值得纳入观察。后续值得深入的方向有三个。第一是回测框架把你设计的评分规则放到历史数据上验证胜率和盈亏比避免过度拟合第二是行业景气度跟踪把价格类指标和产业数据结合起来比如煤炭的港口库存、白酒的渠道调研、电力的发电量数据第三是风险管理模块把仓位控制、止损条件、组合分散纳入统一管理。对于已经在实践这套方法的朋友建议先跑通一个板块再复制到其他板块。不要一开始就追求覆盖所有行业那会让数据维护变成负担。从白酒或煤炭开始跑一个月看输出结果和实际盘面是否吻合然后逐步扩大范围。最后再提醒一次本文所有内容均为个人研究框架分享不构成任何投资建议。市场有风险入市需谨慎。如果你今天只记住一句话就记住这句明天策略不是预测出来的是复盘出来的——先把框架建好再谈下一次操作。
返回列表