Skip to main content

FinDiff: diffusion-based, teacher-aligned augmentation for time-series finance

Project description

FinDiff

Diffusion-based, teacher-aligned data augmentation for time-series finance 面向策略稳定性的“生成 → 打分筛选 → 门控/回退 → 时序评估”流水线。

目录 • 特点 • 安装 • 快速开始 • 用你的 CSV 直接产出报告(本地) • Docker 运行 • 没有数据?先跑演示 • 用代码调用 • 接入你自己的模型 • 配置速览 • 报告与可视化 • 项目结构 • 开发与测试 • 常见问题 • 许可与数据合规 • 联系方式

特点 • 可控生成:轻量扩散(DDPM 风格),按时间/统计条件生成“近似真实”的样本 • Teacher 对齐:打分后仅保留“对策略有益”的子集(k-top/阈值) • 安全门控:Auto Gate(先验)+ Eval Gate(CV/Test);不满足就自动回退 baseline • 客观评估:Purged Rolling CV + 留出 Test(embargo 防泄露),提供 Sharpe/Calmar/Vol/Var 的均值 • 模型开放:支持 sklearn / PyTorch / 任意框架(最小接口 fit/predict 或 fit_with_df) • 即开即用:一行命令读取你的 CSV → 产出 report.html(含 Baseline vs Augmented 对比与 Δ)

安装

需要 Python ≥ 3.9(如需 GPU,请先按 PyTorch 官网上的指引安装匹配版本)

pip install -e ".[dev]"

可选:设置日志等级

export FINDIFF_LOGLEVEL=INFO # or DEBUG/WARN/ERROR

快速开始

用你的 CSV 直接产出报告(本地)

python scripts/run_demo.py
--csv your.csv
--date-col date
--label-col y
--features-cols auto
--out artifacts/csv_run

macOS 快捷打开

open artifacts/csv_run/report.html

说明: • --features-cols auto:自动将所有数值列(排除时间/标签)当作特征 • 也可手动指定:--features-cols "f1,f2,f3"

Docker 运行

docker build -t findiff:dev . mkdir -p artifacts docker run --rm
-e FINDIFF_LOGLEVEL=INFO
-v "$(pwd)/artifacts:/app/artifacts"
findiff:dev
python scripts/run_demo.py
--csv /app/path/to/your.csv
--date-col date --label-col y
--features-cols auto
--out artifacts/csv_run

容器内路径以 /app/... 为根(Dockerfile 的 WORKDIR /app)。

没有数据?先跑演示

python scripts/run_demo.py --out artifacts/demo_run open artifacts/demo_run/report.html

产出目录包含: • metrics.json:最终(已门控/可能回退后)的指标 • logs.json:CV 折详情、门控/回退、baseline 与 augmented 两套指标 • report.html:CV 柱状、Test NAV、PSI 热图、Baseline vs Augmented 对比表(含 Δ)

用代码调用

from findiff import default_cfg, deep_update from findiff.pipeline import FinDiff from findiff.train import TorchTimeSeriesRegressor from findiff.dataio import load_timeseries_csv

df = load_timeseries_csv("your.csv", time_col="date", feature_cols=["f1","f2","f3"], label_col="y")

cfg = deep_update(default_cfg(), { "data": {"freq": "B"}, "generator": {"epochs": 2, "steps": 200, "sample_ratio": {"normal": 0.3}}, "mix": {"real_to_synth": "1.0:0.4"}, "train": { "eval_metrics": ["sharpe","calmar","sharpe_p5","vol","var"], "ann_factor": 252, "cv": {"enable": True, "n_folds": 5, "embargo": 63, "train_window": 504} }, "security": {"eval_gate": True, "accept_if": {"cv_sharpe_mean_min": 0.0}} })

model = TorchTimeSeriesRegressor(in_dim=3, window=64, hidden=128, epochs=4, batch_size=256)

res = FinDiff(model, df, "date", ["f1","f2","f3"], "y").run() print(res.metrics) # 按选择(augmented/baseline)输出的最终指标 print(res.logs["selected_variant"]) # "augmented" | "baseline"

接入你自己的模型

方式 1:数组接口(最小)

class MyModel: def fit(self, X, y, **kwargs): ... def predict(self, X): ...

X: [N, n_features], y: [N]

方式 2:DataFrame 接口(更灵活)

class MyModel: def fit_with_df(self, train_df, feature_cols, label_col, **kwargs): ... def predict(self, X): ...

你可以在 fit_with_df 里自己做滑窗/归一化/DataLoader 等

sklearn 示例

from sklearn.linear_model import Ridge class SKRidge: def init(self, alpha=1.0): self.m = Ridge(alpha=alpha) def fit(self, X, y, **kwargs): self.m.fit(X, y) def predict(self, X): return self.m.predict(X)

配置速览 • data.freq:时间频率(如 "B" 工作日 / "D" 自然日),影响窗口与禁距(embargo) • generator:epochs/steps/edit_last_steps/guidance_scale、n_samples 或 sample_ratio.normal • teacher.select_rule.k_top:保留前 k 比例的生成样本(0–1) • mix.real_to_synth:真实:合成比例(如 "1.0:0.4") • train.cv:enable、scheme(sliding/expanding)、train_window、n_folds、embargo、min_train_rows • security:auto_gate_synth/gate_if、eval_gate/accept_if、fallback_mix

内置 validate_cfg() 做强校验与合理回退(类型、范围、默认值),并通过 FINDIFF_LOGLEVEL 打印告警。

报告与可视化

report.html 包含: • Selected Summary:被选方案(Augmented/Baseline)的关键指标 • Baseline vs Augmented:两边指标与 Δ(Aug−Base)对比表 • CV per-fold:每折 Sharpe 柱状 • Test NAV:测试集净值曲线 • PSI Heatmap:真实 vs 合成的特征分布偏移(每特征一个 PSI)

若提供 test_returns,还会展示 Newey-West 与 MBB(移动区块自助法)估计的显著性信息。

项目结构

. ├── src/findiff/ │ ├── config.py # default_cfg / deep_update / get_splits │ ├── data.py # prepare_df / build_conditions │ ├── dataio.py # load_timeseries_csv │ ├── gen.py # DDPMGenerator(轻量) │ ├── guard.py # 泄露检查 │ ├── logging_util.py # 统一日志 │ ├── metrics.py # Sharpe/Calmar/Vol/Var... │ ├── mix.py # blend_real_synth │ ├── pipeline.py # 主流程(CV、门控、回退、评估) │ ├── plotting.py # 可视化 │ ├── reporting.py # report.html │ ├── score.py # teacher 打分示例(可替换) │ ├── stats.py # Newey-West & bootstrap │ ├── train.py # fit_and_eval / TorchTimeSeriesRegressor │ └── validators.py # 配置校验 ├── scripts/ │ ├── run_demo.py # CSV or Dummy → 报告 │ ├── make_dummy_data.py # 造演示数据 │ └── init.py ├── tests/ ├── artifacts/ ├── Dockerfile ├── .dockerignore ├── .gitignore ├── pyproject.toml ├── README.md └── LICENSE

开发与测试

代码规范

ruff check . black --check .

单测 & 覆盖率

pytest -q pytest --cov=findiff --cov-report=term-missing pytest --cov=findiff --cov-report=html && open htmlcov/index.html

可视化/示例模块的覆盖率不做强制,可在 pyproject.toml 的 coverage 配置里 omit。

常见问题 • ImportError: No module named scripts 重新构建镜像,或确保在项目根目录运行: docker build -t findiff:dev . → docker run ... python scripts/run_demo.py ... • Docker 无法连接 daemon 启动 Docker Desktop 或 Colima,再 docker ps 重试。 • GPU/内存不足 先用默认轻量配置;Docker Desktop → Settings → Resources 调到 ≥4GB。 • 报告不显示对比表 需要同时存在 logs["baseline"] 与 logs["augmented"];启用 security.eval_gate=True 会自动比较。

许可与数据合规 • 代码:Apache-2.0(见 LICENSE) • 数据:请仅使用你有权使用的数据。部分竞赛数据(如 Kaggle)可能限制“仅用于比赛/论坛”,不可用于产品或公开演示。

联系方式

维护者:yanllinc@berkeley.edu 或在 GitHub Issues 反馈问题/建议。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

findiff_finance-0.1.0.tar.gz (38.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

findiff_finance-0.1.0-py3-none-any.whl (36.5 kB view details)

Uploaded Python 3

File details

Details for the file findiff_finance-0.1.0.tar.gz.

File metadata

  • Download URL: findiff_finance-0.1.0.tar.gz
  • Upload date:
  • Size: 38.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.7

File hashes

Hashes for findiff_finance-0.1.0.tar.gz
Algorithm Hash digest
SHA256 354f4539e414332373cd1ddddd234db45e5aca88f055c6f93247246bcabe8978
MD5 d78cf8895e814c1de68416b0cd6b8c0f
BLAKE2b-256 54fc7b4d129711bb20b8c283300c8d349b8be86bd5fec3d16786ae431a08e8c4

See more details on using hashes here.

File details

Details for the file findiff_finance-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for findiff_finance-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0230593542d650520b08e108d6f34f2aaf7deb6496080fd98444a50ee9ad96ac
MD5 926dc2c27717ac56a71fb0b675580f03
BLAKE2b-256 c4796c90b62582eeccb22307a1e8d3fdf82497f15b87d0f190dc7e15104b7707

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page