njucm njucm.org
← Projects

中国集采 / 医保卫生经济学分析 · ChinaHTA

仓库:leerogerstheman/ChinaHTA

面向中国市场准入(market access)场景,而不是照搬欧美 HTA 模板。

国内 HEOR / 市场准入岗真正在做的事是:集采降价后患者的年治疗费用变了多少? 一个新产品进医保后未来五年对医保基金的预算冲击有多大?在 DRG 付费下, 某类药品的成本结构是盈余还是亏损?本项目把这些做成可复现的计算流程。

实测结果(示例数据集)

在 39 条中选记录、15 个通用名的示例数据上运行完整流程:

集采降价幅度分析

指标数值
不加权平均降幅54.06%
按约定采购量加权平均降幅78.90%
中位降幅84.39%
降幅区间0.00% – 94.56%
集采前采购额(参考价口径)676,768,442 元
集采后采购额(中选价口径)152,004,878 元
采购额节省524,763,563 元(节省率 77.54%)

加权与不加权差 24.8 个百分点,这本身就是一个有意义的观察:采购量大的品种 降幅更深。只报不加权平均值会显著低估集采的实际影响 —— 这正是本项目同时给出 两个口径的原因。

患者年治疗费用变化

药品集采前集采后
吉非替尼57,670 元/年13,456 元/年
伊马替尼35,770 元/年7,694 元/年
恩替卡韦4,599 元/年760 元/年

预算影响分析(BIA,5 年,5% 贴现)

指标数值
参考预算11,029,211,945 元
未贴现影响−1,518,581,796 元
贴现后影响−1,328,878,288 元
PSA(5000 次)均值−1,325,883,186 元
PSA 95% CI[−2,363,031,712, −616,569,755]
单因素敏感性最大摆动s_max 因子 797,326,973 元
情景对比乐观 −2,631,733,334 / 基准 −1,328,878,288 / 悲观 −480,100,188

成本-效果分析(CEA)

指标数值
增量成本 ΔC−8,216.70 元
增量效果 ΔE+0.0800 QALY
ICER−102,708.75 元/QALY(优势策略 dominant)
净货币效益 NMB(WTP=10 万)+16,216.70 元
P(成本有效)100.0%
ICER 中位数(PSA)−101,751.23 元/QALY

Markov 队列模型与 DRG

模块结果
Markov(3 状态 × 10 周期)总成本 19,724,716 元,总 QALY 4,530.4947,生命年 7,390.08
DRG(5 病组 × 600 例)支付 49,080,000 元,成本 48,958,800 元,结余 +121,200 元(+0.25%),保本费率 9,975.31
一致性自检10/10 通过
单元测试80/80 通过

数据来源与合规说明(重要)

国家医保局、NMPA 等站点部署了 JavaScript 反爬保护,普通 HTTP 客户端无法访问。

本项目不抓取政府网站,也不尝试绕过任何反爬保护。 工具围绕用户自备的 结构化数据设计:你从国家医保局或省级药采平台下载集采中选结果(PDF/Excel), 整理为文档化的表头后喂给工具。

examples/ 中的样本数据明确标注为示意性数据(ILLUSTRATIVE SAMPLE DATA), 不是真实药品价格,仅用于演示数据格式与计算流程。文件头、README、字段说明中均 有醒目标注。列名支持中文别名,便于直接使用中文表格。

快速开始

git clone https://github.com/leerogerstheman/ChinaHTA
cd ChinaHTA

# 用自备数据运行完整分析
python china_hta.py run --data 你的集采数据.csv --outdir 输出目录

# 用示例数据跑通全流程
python china_hta.py run --data examples/vbp_sample.csv --outdir examples/example_output

输出:SQLite + CSV + Excel(多工作表)+ Markdown 报告。

环境要求:Python 3.9+,依赖 numpy / pandas / openpyxl / XlsxWriter。

测试

python tests/run_tests.py     # 或 python -m pytest tests/

ICER、贴现、Markov 队列轨迹、BIA 总额等关键计算均有手工核算的期望值断言。

开发中修复的两个真实缺陷

1. Beta 采样器静默失真(严重) _beta_from_mean_sd 先把均值裁剪到 (0,1) 再做矩匹配。当效应量均值 ≥1 时(累计 QALY, 如 1.08),它返回的分布均值是 0.91 / sd 0.285 —— 与目标完全不符。后果:PSA 的 ΔE 均值 是 0.0080 而非 0.0800(差 10 倍),且 P(成本有效) 被错误报为 91.7% 而非 100%。 已修复:越界的 mean/sd 现在直接报错而非静默截断。

2. 示例数据免责声明未进入报告(安全相关) cmd_run 硬编码 is_sample=False,导致 README 自己的示例命令生成的报告里没有 “示意性数据”提示 —— 存在把虚构价格读成真实数据的风险。已修复。

两个缺陷均有回归测试,并在 README §13 中记录。

验证方式(独立复算)

除单元测试外,用 csv + fractions.Fraction 精确有理数写了一个不 import src/ 任何模块的独立脚本复算(避免共享 bug 自我认证):

  • ICER:加权中选价 6.520763、参考价 29.032269 → ΔC=−8,216.699818、ΔE=0.08 → ICER=−102,708.747723,与管线输出一致
  • BIA:逐年展开 dB*_y = T_y·s_y·(C_new−C_old)·d_y(y1..y5),贴现后合计 −1,328,878,287.81 vs 管线 −1,328,878,288 —— 全部吻合
  • 一致性自检 10/10;删除全部输出后从零重跑,每一个 README 数字都精确复现

局限

  • CEA 的效应增量(ΔE=+0.08 QALY)是示意性假设:集采改变的是价格而非疗效, 若 ΔE=0 则 ICER 在构造上无定义。报告与 README 中均已标注,但这是分析上最弱的一环。
  • DRG 数据为合成构造(5 个病组),权重与成本指数均为示意值。
  • 年用量默认 365 单位/年(已标注);真实分析需由用户提供 DDD 或说明书用法用量, 工具刻意不自行推断 DDD。
  • 样本数据为示意性数据,不代表任何真实药品的实际价格
  • BIA/CEA 结果高度依赖输入假设(市场规模、爬坡曲线、贴现率、效用值), 工具的作用是让假设显式化并可做敏感性分析,而非给出”正确答案”
  • 输出不构成医保决策或临床建议

资源