← Back to skills
extension
Category: Data & AnalyticsNo API key required

主力透视通用版

A股主力透视名单生成流程,完全不依赖通达信(tdx_screener/tdx_api_data)连接器。触发词:透视今天的主力、主力透视、主力透视名单、跑一下主力名单、看今天的主力、今天主力是谁、有没有主力、主力识别、主力是谁、游资还是机构、现在什么阶段、拉升洗盘派发、主力资金扫描、主力介入判定、不用通达信跑主力名单。

personAuthor: user_6c1a7171hubcommunity

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 机构倾向。

三条必须遵守的原则:

  1. 置信度由证据强度决定,不由结论方向决定。 有席位证据就是「高」, 哪怕与行为特征矛盾——此时如实标注矛盾(如「机构席位·手法激进」),不降级、不强行二选一。
  2. 不用榜单覆盖率推翻叙事。 池子与龙虎榜交集为 0 只说明「当天没触发异动阈值」, 不等于池子里没有游资。
  3. 小盘股的自由换手率天然偏高,会系统性推高行为分。 「偏游资」只代表交易特征像游资,不等于主力就是游资。

第三步:什么阶段(四阶段打分 + 筹码修正)

只用量价四维(批量接口拿不到 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 同时导出全部中间字段与分项得分(供人工复核),并保留「资金方向 / 控盘方向」两列。

三条铁律

  1. 第一步禁用阶段词汇(洗盘/拉升/派发)——那是第三步的语义。
  2. 阶段与主力状态可能矛盾,如实并列不做平均——如「双向减持 + 吸筹」= 价格横盘缩量但主力在撤, 是最需要人工判断的组合。HTML 表内保留「资金方向」列让矛盾直接可见。
  3. 不作为投资建议,不预测涨跌。

五、故障排查

| 症状 | 原因与处理 | |---|---| | 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 / 区间涨幅 / 量能倍数本地复算,东财基础表 + 新浪前复权日线 + 东财龙虎榜席位。