A股主力透视名单(免通达信版)
这是什么
与 ashare-mainforce-identifier(通达信版)同一套方法论与打分逻辑,但数据层换成公开源,
因此不需要 tdx_screener / tdx_api_data 连接器。
已验证的数据等价性(2026-09-18 同日对账):
| 环节 | 与通达信版的一致性 | |---|---| | CYW 主力控盘 | 相关系数 1.0000、MAE 0.00、比值 1.0000 | | 20日 / 5日区间涨幅 | MAE 0.004pp / 0.000pp | | 量能倍数 V | MAE 0.007 | | 席位证据(机构 / 龙虎榜) | 机构代码覆盖 22/22、金额 20/22 一致;席位代码覆盖 16/16,但选席类型 12/16、金额 11/16 一致(TDX 选席规则未解出,见 §七) | | 最终名单 | 召回 0.81、精确 0.82;交集内阶段与主力状态 100% 一致 |
核心前提(必须向用户说明):A股不公布账户级数据,所有「主力资金」都是按单笔成交金额分档推断的。 三步都只能输出概率判断 + 置信度,不能输出确定结论。不构成投资建议,不预测涨跌。
一、执行步骤
0. 环境
需要 Python 环境含 akshare、pandas、requests(akshare ≥ 1.18)。
若本机已有可用虚拟环境,直接用它;否则新建:
python3 -m venv .venv && .venv/bin/pip install akshare pandas requests
1. 确认时点
本流程用收盘数据。盘中运行必须先告知用户数据未定盘。 基础表是最新收盘快照,只能用于当日跑批;历史日期无法回溯。
2. 一键跑批
PY=<含 akshare 的 python>
$PY <skill目录>/reference/run.py --date YYYY-MM-DD --outdir <输出目录>
不带 --date 则自动取最近交易日;龙虎榜自动取上一交易日(T+1 披露)。
耗时:基础表约 30 秒,全市场日线约 8~10 分钟(5200+ 只,进程池),席位约 1 分钟。
中途中断可重跑续传(按代码断点续跑)。输出 主力名单_YYYYMMDD.html + .csv。
冒烟测试:--top 300 只取前 300 只。清缓存重取:--refresh。
缓存位置:默认 ./.mfs_cache(当前工作目录下),可用 --cache <目录> 或环境变量 MFSCAN_CACHE 覆盖。
⚠️ 不要把缓存指向技能安装目录——技能目录在沙箱/只读挂载下通常不可写,会报 PermissionError。
3. 交付
按 §四 输出契约交付 HTML + CSV。交付物内不放方法论段落。
二、数据源与口径(关键)
| 技能需要 | 数据来源 | 说明 |
|---|---|---|
| CYW 主力控盘 | 本地复算 | 公式见下,与通达信数值完全一致 |
| 20日 / 5日区间涨幅、量能倍数V | 本地复算(前复权日线) | akshare 新浪前复权 |
| 主力净额 | 东财 push2delay clist(f62) | 一次分页取全市场(单页上限 100) |
| 换手率 | 东财 clist(f8) | 流通股本口径 |
| 流通市值 | 东财 clist(f21) | 用于估计自由流通市值 |
| 席位证据 | 东财龙虎榜(上一交易日) | 机构专用 / 陆股通专用 / 营业部 |
CYW 复算公式(成交量单位 = 手):
VAR4 := IF(HIGH>LOW, ((CLOSE-LOW)/(HIGH-LOW) + (CLOSE-HIGH)/(HIGH-LOW)) * VOL, 0);
CYW := SUM(VAR4, 10) / 10000;
因为 CYW 数值与原口径完全一致,按市值分档的强控盘阈值(50 / 120 / 180 / 280)可原样沿用。
口径校准(必读)
公开源没有「自由流通市值」,而它是 R = 主力净额 / 自由流通市值 的分母和市值分档依据。
run.py 中的 FREE_RATIO = 0.74 是用 180 只真值反解的 自由流通/流通 比值(使 R 的 MAE 从 1.048pp 降到 0.805pp)。
- 实测该比值四分位区间 0.496~0.831,离散度大,这是名单召回约 0.8 而非 1.0 的主因,属已知误差,不要掩盖。
- 切勿使用东财 clist 的
f50字段:它对部分股票返回明显错值(如万科A 给出 9597 亿),不是自由流通市值。 - 用普通
换手率替代自由换手率(流通股本口径),会使第二步 D1 维度系统性偏低。
不可用的源(不要浪费时间)
quotes.sina.cn 纯 JSON K线端点(限流 HTTP 456)、东财 push2 主站(被拒)、
东财 push2his(间歇可用)、腾讯 fqkline(501)、网易 chddata(502)。
三、三步方法论
第一步:有没有主力(两维度框架)
不做单一门槛——「有没有主力」被压缩成一个布尔值,就必须在筛选阶段回答「哪种才算主力」。
| 维度 | 回答什么 | 数据 | 是否需阈值 |
|---|---|---|---|
| 资金动作 | 今天有没有大资金在动?往哪走? | R = 主力净额 / 自由流通市值 | 不需要,正负号自带信息 |
| 控盘结构 | 这票是否被某一方掌控? | CYW 主力控盘 | 仅分档,且按市值分档(50/120/180/280) |
两维度时间尺度不同(当日 vs 累积)→ 会打架,而打架处信息量最大。
判定标准:控盘维度 |CYW| ≥ 本档线 且 资金维度 |R| > 1%(活跃)或 |R| < 0.5%(蛰伏)。
两者同时成立 = 有主力;缺一不可。再剔除 ST / 次新 / 未盈利。
五种状态(一律用方向词,禁止用阶段词):
| 状态 | 资金方向 | 控盘方向 | |---|---|---| | 双向增持 | 流入 | 增持 | | 控盘静默 | 静默 | 增持 | | 控盘未松·资金微出 | 微流出 | 增持 | | 资金进·控盘出 | 流入 | 减持 | | 双向减持 | 流出 | 减持 |
命名铁律:第一步只输出两维度各自的方向,绝不下阶段结论。 「洗盘」「派发」「拉升」需要量价数据,那是第三步的活。
取数陷阱:蛰伏通道用 控盘度 > 分档线(仅正值)。
若不限制符号,|CYW| 达标的负值静默股会全部涌入,名单会翻倍。
第二步:主力是谁(席位证据优先)
A 层 · 硬证据(置信度 = 高)——东财龙虎榜(T-1)三个信号:
机构专用→ 机构深股通专用/沪股通专用→ 北向(外资机构)XX证券…营业部→ 游资
B 层 · 行为特征(置信度 ≤ 中)——无席位证据时用四维游资倾向分(engine.behavior):
自由换手率 30% / 自由流通市值 25% / 涨幅形态 20% / 单日资金强度 25%。
分档:≥70 游资特征明显 | 55~70 略偏游资 | 45~55 特征中性 | 30~45 略偏机构 | <30 机构倾向。
三条必须遵守的原则:
- 置信度由证据强度决定,不由结论方向决定。 有席位证据就是「高」, 哪怕与行为特征矛盾——此时如实标注矛盾(如「机构席位·手法激进」),不降级、不强行二选一。
- 不用榜单覆盖率推翻叙事。 池子与龙虎榜交集为 0 只说明「当天没触发异动阈值」, 不等于池子里没有游资。
- 小盘股的自由换手率天然偏高,会系统性推高行为分。 「偏游资」只代表交易特征像游资,不等于主力就是游资。
第三步:什么阶段(四阶段打分 + 筹码修正)
只用量价四维(批量接口拿不到 MA60 数值):20日涨幅 / 5日涨幅 / 量能倍数V / 当日涨跌幅。
V = (5日区间换手 ÷ 5) ÷ (20日区间换手 ÷ 20) # 用换手率口径,V 不受换手率定义影响
V > 1 放量,V < 1 缩量——这是区分四阶段最有效的一刀: 拉升要放量、洗盘要缩量、派发是放量滞涨。
| 阶段 | 核心特征 | |---|---| | 吸筹 | 涨幅温和 · 近期未启动 · 缩量 | | 洗盘 | 已有涨幅 · 近期回调 · 明显缩量 | | 拉升 | 涨幅累积 · 近期走强 · 放量 | | 派发 | 位置偏高 · 放量滞涨 · 当日走弱 |
取最高分;前两名差距 ≤6 分标「A→B 过渡」(代表模型无法定论)。
打分函数用分段线性插值(engine.interp)而非阶梯,否则大量股票同分、排序失去意义。
筹码修正层:本版只用 CYW(纯 CYW 健康度)。
TDX 的 SCRPLUS 集中度90% 本地无法复现(相关仅 0.63、MAE 5.4,
三角/均匀分布 × 衰减/不衰减四种组合均无改善),已按决策降级。
CYW 分档:≥50→100 · ≥20→85 · ≥0→70 · ≥-20→55 · ≥-60→40 · ≥-150→25 · <-150→10;
健康度 < 35 触发保守降级(吸筹→趋势走坏·疑似派发 / 洗盘→洗盘→派发过渡 / 拉升→拉升→派发过渡)。
🚨 实践教训:方向性 bug
处理「越小越好」的维度(距MA60、涨幅温和度、换手率、量能)时,
不要用 ramp(x, ...) 传负值——阈值会忘记同步取负,导致该维度永远得最低分。
统一用 interp 写递减曲线。
四、输出契约
只输出结果名单,去掉所有解释性语句。 方法论、局限说明一律不放进交付物。
固定列:# / 股票 / 阶段 / 主力类型+置信度 / 主力状态 / 20日涨幅 / 5日涨幅 / 量能倍数V / 资金强度R / CYW控盘 / 当日涨跌
结构:标题 + 一行 meta(日期 · 合计 N 只 · 含 N 只过渡)→ 按阶段分组小标题 → 数据表 → 末尾「使用说明」紧凑表 → 脚注一行。 禁止:方法论章节、长段落、KPI 卡片、note/warn 提示框。
CSV 同时导出全部中间字段与分项得分(供人工复核),并保留「资金方向 / 控盘方向」两列。
三条铁律
- 第一步禁用阶段词汇(洗盘/拉升/派发)——那是第三步的语义。
- 阶段与主力状态可能矛盾,如实并列不做平均——如「双向减持 + 吸筹」= 价格横盘缩量但主力在撤, 是最需要人工判断的组合。HTML 表内保留「资金方向」列让矛盾直接可见。
- 不作为投资建议,不预测涨跌。
五、故障排查
| 症状 | 原因与处理 |
|---|---|
| HTTP 456 | 新浪 quotes.sina.cn 端点被限流;本技能已避开,改用 akshare 前复权端点 |
| 多线程直接 abort / libmini_racer | akshare 新浪接口依赖 V8,非线程安全;必须走进程池(fetch_daily 已实现) |
| 日线进程池卡住 | 单次调用无超时;_daily_worker 已加 20s alarm 超时 + 重试 |
| 席位金额恰好翻倍 | 东财席位明细接口返回重复行;必须先按席位名称去重(已实现) |
| 名单数量约为预期两倍 | 蛰伏通道未限制 CYW 为正(见第一步「取数陷阱」) |
| 基础表取数失败 | push2delay 不可达;检查网络,勿改用 push2 主站(被拒) |
| PermissionError 写 cache | 缓存被指到了只读目录(如技能安装目录);改用 --cache 指向工作区内目录 |
六、脚本结构
reference/
run.py 端到端入口(CLI:--date / --outdir / --top / --lhb-date / --refresh / --cache)
datasource.py 取数层:fetch_base / fetch_daily / fetch_seats / 交易日历
engine.py 打分引擎:bucket / flag_of / interp / scores / behavior / fuse / render
engine.py 是自包含的,可单独 import 做参数调优或回测。
缓存默认写到 ./.mfs_cache(可安全删除,下次运行会重新抓取),不写在技能目录内。
七、参考:与通达信版的口径差异汇总
| 项 | 通达信版 | 本版 | 影响 | |---|---|---|---| | 主力净额 | tdx_screener | 东财 f62(小约 2.4%) | R 微偏 | | 自由流通市值 | 专有字段 | 流通市值 × 0.74 | 名单边界差异主因(召回 ≈0.8) | | 自由换手率 | 专有字段 | 普通换手率 | 行为分 D1 偏低 | | 筹码集中度90% | SCRPLUS | 已去除(健康度=纯CYW) | 轻微 | | 龙虎榜 | T-1 | T-1(已对齐) | 无 | | CYW / 区间涨幅 / V | 专有 | 本地复算 | 无(数值一致) |
席位选席规则:未对齐,属已知偏差
代码覆盖 16/16(TDX 命中的票本版都取到),但具体选到哪个席位只有 12/16 与 TDX 一致。实测反例:
000056 TDX[机构专用] 1,517,794 | 本版[营业部] 52,620
000572 TDX[陆股通] 5,500,346 | 本版[营业部] 93,024,849 ← TDX 舍大取小
002285 TDX[营业部] 10,523,156 | 本版[陆股通] 10,549,194 ← 与上一条反向
300741 TDX[陆股通] 6,968,834 | 本版[机构专用] 29,995,680
「机构专用 > 陆股通 > 营业部」的优先级假设被 002285 与 300741 同时证伪,TDX 规则目前未解出。 本版采用的可辩护规则是:全部席位中「买入金额」最大者,取其净额。
影响面:只影响少数票的主力类型标签,不影响名单成员、阶段、主力状态、置信度。 如需更保守,可把类型分歧的票标为「席位存疑」而不是硬给一个类型。
八、变更记录
1.0.1
- 修复
nan金额:isinstance(nan, float)为真,导致卖出金额缺失时净额变成nan, 证据列显示「净买入 nan亿」。改为显式判 NaN。仅影响证据文字,不影响名单/阶段/标签。 - 修正席位口径:
INST= 机构专用席位买入金额最大值(此前误用净额)、LHB= 买入金额最大席位的净额(此前误用净额排序)。修复后机构代码覆盖由 17 只回到 22/22。 - 缓存目录改为可配置:默认
./.mfs_cache,支持--cache/MFSCAN_CACHE。 此前写在技能目录内,在沙箱/只读挂载下会PermissionError。 - 修正文档中过度乐观的表述:席位一致性由「16/16 全部命中」更正为
「覆盖 16/16、类型 12/16、金额 11/16」。此前核验用
abs(比值-1)>0.01, 而NaN参与比较恒为False,导致 NaN 行被静默判为通过——这是核验方法的盲点。
1.0.0
- 首个版本:CYW / 区间涨幅 / 量能倍数本地复算,东财基础表 + 新浪前复权日线 + 东财龙虎榜席位。
微信扫一扫