合成控制法政策效应分析系统 — 评估宏观经济政策对A股市场影响的自动化因果推断工具
Project description
合成控制法政策效应分析系统
评估宏观经济政策对 A 股市场影响的自动化因果推断工具——基于合成控制法(Synthetic Control Method)。
pip install . && scm-analysis --user-file data/user_input.csv
快速上手
安装
git clone https://github.com/Z7X2C7/scm-policy-analysis && cd scm-policy-analysis
# 基础安装(CLI)
pip install .
# 带 GUI 桌面端
pip install .[gui]
# 开发模式(含测试/格式化工具)
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 按同行业规则自动补充
已有示例文件可直接使用:
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 填写。核心分析功能完全不需要 API Key,仅可选的数据补全和供体推荐依赖 AI。
开发
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scm_policy_analysis-1.0.0.tar.gz.
File metadata
- Download URL: scm_policy_analysis-1.0.0.tar.gz
- Upload date:
- Size: 85.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c599bc917f800c263e15242d04db0e03eaf2e04bf9d240ce7913ce1f61d5520
|
|
| MD5 |
5cc315c1f8ab730c56b36b9ed7cb75d3
|
|
| BLAKE2b-256 |
3817b5625b763e716dfc3d635bce952bcff335cccf483a278a17cebb0452e873
|
File details
Details for the file scm_policy_analysis-1.0.0-py3-none-any.whl.
File metadata
- Download URL: scm_policy_analysis-1.0.0-py3-none-any.whl
- Upload date:
- Size: 94.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84714a0aecab8e737e80531a5648d83207dfd106dcb46ac7a6f4a6ad69162e6a
|
|
| MD5 |
264d5eaa88d13eed8f7e5baade131677
|
|
| BLAKE2b-256 |
66cd399de88094e9e38cb3474e0ab127e3706bdc76e5eb06f75f17f001d4b821
|