Skip to content

zxcsnd777/SCM

Repository files navigation

合成控制法政策效应分析系统

CI Python License Tests

评估宏观经济政策对 A 股市场影响的自动化因果推断工具——基于合成控制法(Synthetic Control Method)

pip install . && scm-analysis --user-file data/user_input.csv

快速上手

安装

方式一:从 PyPI 安装(推荐)

pip install scm-policy-analysis      # CLI 基础版
pip install scm-policy-analysis[gui]  # 带 GUI 桌面端

方式二:从源码安装(开发/贡献)

git clone https://github.com/Z7X2C7/scm-policy-analysis && cd scm-policy-analysis
pip install -e ".[dev]"              # 开发模式
pre-commit install

准备数据

data/user_input.csv 中写入政策和股票信息,格式如下:

policy_name policy_date treatment_stock_code treatment_stock_name donor_stock_code donor_stock_name
政策名称 2024-01-15 002594.SZ 比亚迪 601238.SH 广汽集团
  • policy_name — 政策名称(必填)
  • policy_date — 政策发布日期(必填)
  • treatment_stock_code / treatment_stock_name — 处理股票,至少填一项
  • donor_stock_code / donor_stock_name — 供体池股票,强烈建议提供
    • 提供 → 全量使用,SCM 算法自动分配权重,结果最可靠
    • 留空 → 取决于是否配置了 DeepSeek API Key:
      • 有 API Key → AI 按行业规则自动推荐供体(结果仅供参考)
      • 无 API Key → 系统自动从其他政策股票中选取(结果不可靠,仅供学习

已有示例文件可直接使用:

cp examples/sample_input.csv data/user_input.csv

运行

命令行 (CLI):

# 使用默认数据文件
scm-analysis

# 指定文件和分析参数
scm-analysis --user-file data/my_policy.csv --pre-months 18 --post-months 12

# 强制刷新缓存
scm-analysis --force-refresh --no-cache

桌面应用 (GUI):

python -m src.gui
#
python run_gui.py

查看结果

结果保存在 output/ 目录:

  • output/report.html — 完整分析报告
  • output/result/ — 政策效应汇总 CSV
  • output/charts/ — Matplotlib / Plotly 图表
  • output/placebo/ — 安慰剂检验结果

核心流程

用户 CSV  →  数据校验  →  提取/补充供体池
                              ↓
                       baostock 行情
                              ↓
                       月度综合指标
                              ↓
                        SCM 权重求解
                              ↓
                   空间安慰剂检验 + 时间安慰剂检验
                              ↓
                         HTML 报告

合成控制法

src/sc_optimizer.py 基于 scipy.optimize.minimize 求解权重:

  • 约束:权重非负、求和为 1、每只股票权重 ≤ 0.5
  • 政策效应:处理单元实际值 − 合成控制值
  • MSPE:政策前均方预测误差,衡量拟合质量

双重安慰剂检验

类型 方法 目的
空间安慰剂 将每只供体股票假想为处理单元,重新跑 SCM 真实效应是否显著大于随机效应
时间安慰剂 将政策日期向前平移 3/6 个月,重新跑 SCM 效应是否确实由该政策事件导致

详见 架构文档


目录结构

├── src/                  # 源代码
│   ├── config.py         # 全局配置(环境变量驱动)
│   ├── sc_optimizer.py   # SCM 核心优化(SLSQP + NNLS 备选)
│   ├── synthetic_control.py  # 高层调度 + 留一法检验
│   ├── data_fetcher.py   # baostock 行情获取(带缓存)
│   ├── data_processor.py # 日度→月度指标计算
│   ├── weight_calculator.py  # 4 指标等权 → composite_indicator
│   ├── data_validator.py # 数据校验 + AI 补全
│   ├── policy_generator.py  # 政策-股票映射表生成
│   ├── donor_pool_cleaner.py  # 供体池清洗
│   ├── post_treatment_placebo.py  # 时间安慰剂检验
│   ├── visualization.py  # 报告与图表
│   ├── placebo_visualization.py  # Nature 期刊风格图表
│   └── gui/              # PyQt6 桌面应用
├── tests/                # 62 个 pytest 测试
├── docs/                 # 文档
├── main.py               # CLI 入口
├── run_gui.py            # GUI 入口
├── pyproject.toml        # 包配置
└── data/                 # 数据与缓存

环境变量

变量 说明 默认值
DEEPSEEK_API_KEY DeepSeek API 密钥(可选,用于自动推荐供体池) 空(跳过 AI 功能)
DEEPSEEK_MODEL 模型名 deepseek-chat
LOG_LEVEL 日志级别 INFO

可复制 .env.example.env 填写。SCM 核心算法完全不需要 API Key。API Key 仅用于在你 CSV 未提供供体池时,由 AI 自动推荐供体股票(可选)。如果不配 Key 也不提供供体池,系统会用其他政策股票作为供体(结果仅限学习参考)。

开发

pip install -e ".[dev]"    # 安装开发依赖
pre-commit install         # 安装 pre-commit 钩子
pytest tests/ -v           # 运行 62 个测试
ruff check src/            # 代码检查
black src/                 # 自动格式化

技术栈

  • SCM 求解: scipy.optimize.minimize (SLSQP) + NNLS 备选
  • 行情数据: baostock (免费 A 股数据)
  • 可视化: Matplotlib / Plotly / Seaborn
  • AI 辅助: DeepSeek API(可选)
  • 桌面端: PyQt6
  • 质量工具: pytest / ruff / black / isort / mypy / pre-commit

许可证

MIT License

About

No description, website, or topics provided.

Resources

License

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages