评估宏观经济政策对 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/— 政策效应汇总 CSVoutput/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