从 Point-in-Time 股票筛选到统一 Web 前端的完整链路: 筛选 → 画像 → 策略 → 回测 → Walk-forward → 绩效分析 → 报告/前端。 架构 - 数据层与策略层分离;策略代码不写 SQL,只经 data/repo.py 取数 - 所有业务阈值集中在 config/*.yml,代码零硬编码(字段写错直接报错) - 报告只做「run_id → SQL → 渲染」,不做任何计算,数字可追溯 - 前后端分离:output/ 静态站点 + hdiv web 提供的 REST API 数据安全 - 只增不删:SQL 钩子拦截 DELETE/DROP/TRUNCATE,并有源码扫描测试守护 - qlib 原有表只读,本项目数据写入 hd_ 前缀表 - 回补使用 INSERT IGNORE,保证既有行零改动 - .env 存密钥且已 gitignore;output/、logs/、.venv/ 不入库 交付物 - 30 张 hd_* 表、7 个 YAML 配置、283 项自动化测试 - 统一 Web 前端(hash 路由 SPA)+ nginx 部署配置与 launchd 托管脚本 如实声明的限制 - 策略缺少稳定的样本外超额收益(Walk-forward 7 窗口均值 -0.95%, 基准 +2.29%);其价值体现在回撤控制,而非超额收益 - 涨跌停/停牌约束仅覆盖 2019 年起;index_weight 尚未填充 - AI Agent 层(plan.md 第四版 P8)未实现 详见 docs/user-guide.md 与 docs/implementation-status.md。
84 lines
4.3 KiB
HTML
84 lines
4.3 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block content %}
|
||
|
||
<div class="kpi-grid">
|
||
<div class="kpi"><div class="label">报告总数</div><div class="value">{{ total }}</div>
|
||
<div class="note">{{ groups|length }} 个类型</div></div>
|
||
<div class="kpi"><div class="label">最新报告</div><div class="value">{{ latest_count }}</div>
|
||
<div class="note">每个类型的首份</div></div>
|
||
<div class="kpi"><div class="label">离线资源</div>
|
||
<div class="value" style="font-size:15px" class="mono">{{ asset_hint }}</div>
|
||
<div class="note">图表库必须与本页同级目录一起部署</div></div>
|
||
</div>
|
||
|
||
{% if hidden %}
|
||
<div class="callout">
|
||
另有 <strong>{{ hidden }}</strong> 份 Walk-forward 子运行报告(各窗口的训练/测试段)
|
||
未在此列出 —— 它们是可下钻的原始证据而非独立交付物,文件仍在
|
||
<code class="mono">output/</code> 下,可在 <code class="mono">hd_report</code> 表中按 run_id 找到。
|
||
</div>
|
||
{% endif %}
|
||
|
||
{% if missing %}
|
||
<div class="callout fail">
|
||
<strong>有 {{ missing }} 份登记的报告文件在磁盘上不存在</strong> ——
|
||
索引中的链接会失效。请重新生成对应报告,或整体重新部署 <code class="mono">output/</code> 目录。
|
||
</div>
|
||
{% endif %}
|
||
|
||
<div class="callout warn">
|
||
<strong>部署须知:图表依赖本地资源。</strong>
|
||
报告通过相对路径引用 <code class="mono">assets/echarts.min.js</code>。
|
||
若你把报告发布到 <code class="mono">/ggx/</code> 这样的路径下,
|
||
<strong>必须同时部署 <code class="mono">output/assets/</code> 目录</strong>,
|
||
使其可通过 <code class="mono">/ggx/assets/echarts.min.js</code> 访问;
|
||
否则页面能打开但<strong>所有图表都不会显示</strong>。
|
||
如无法部署该目录,可把 <code class="mono">config/report.yml</code> 的
|
||
<code class="mono">asset_mode</code> 改为 <code class="mono">inline</code>
|
||
重新生成,让每份 HTML 自带图表库(体积由约 10MB 增至约 79MB)。
|
||
</div>
|
||
|
||
{% for g in groups %}
|
||
<div class="card">
|
||
<h2>{{ g.label }} <span class="badge info">{{ g.reports|length }}</span></h2>
|
||
<div class="report-list">
|
||
{% for it in g.reports %}
|
||
<a class="report-item" href="{{ it.path }}" {% if not it.exists %}style="opacity:.5"{% endif %}>
|
||
<div class="t">
|
||
{% if it.is_latest %}<span class="badge OK">最新</span> {% endif %}
|
||
{{ it.title }}
|
||
</div>
|
||
<div class="m mono">{{ it.path }}</div>
|
||
<div class="m">{{ it.size }} · {{ it.generated_at }}
|
||
{% if not it.exists %} · <span style="color:#DC2626">文件缺失</span>{% endif %}
|
||
</div>
|
||
</a>
|
||
{% endfor %}
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
|
||
<div class="card">
|
||
<h2>系统说明</h2>
|
||
<div class="table-scroll">
|
||
<table class="data">
|
||
<thead><tr><th style="text-align:left">项</th><th style="text-align:left">说明</th></tr></thead>
|
||
<tbody>
|
||
<tr><td style="text-align:left">数据源</td><td style="text-align:left">本机 MariaDB <code class="mono">127.0.0.1:3306/qlib</code>(与 qlib 平台共用)+ Tushare Pro</td></tr>
|
||
<tr><td style="text-align:left">配置</td><td style="text-align:left">全部阈值来自 <code class="mono">config/*.yml</code>,代码零硬编码</td></tr>
|
||
<tr><td style="text-align:left">结果</td><td style="text-align:left">优先写入数据库 <code class="mono">hd_*</code> 表;HTML 仅作呈现</td></tr>
|
||
<tr><td style="text-align:left">数据安全</td><td style="text-align:left">只增不删:所有 SQL 经安全钩子拦截 <code class="mono">DELETE/DROP/TRUNCATE</code></td></tr>
|
||
<tr><td style="text-align:left">离线</td><td style="text-align:left">不依赖任何 CDN;图表库本地提供</td></tr>
|
||
<tr><td style="text-align:left">报告时效</td><td style="text-align:left">同一类型的多份报告是<strong>历史运行</strong>,请以标注「最新」的为准</td></tr>
|
||
<tr><td style="text-align:left">使用文档</td><td style="text-align:left">
|
||
<code class="mono">docs/user-guide.md</code> 使用手册(安装/配置/命令/报告解读/故障排查)<br>
|
||
<code class="mono">docs/implementation-status.md</code> 实施状态(含<strong>实测结论与已知限制</strong>)
|
||
</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
{% endblock %}
|