docs(examples): 示例脚本实测修正 — 演示值按字段语义 / 回测走纯 Polars 引擎 / hello 输出规整

四个示例以真实 Token 完整跑通: 01 行情 / 02 写入+读回 / 03 策略清单+回测 /
04 票据+事件流 (种告警实时收到 4 条 alert)。
- 02: 演示行不再把占位值写进 date/name, 按字段名给合理值
- 03: POST /api/backtest/run 依赖 vectorbt (可选 extra), 改走所有安装自带
  纯 Polars 引擎的 /api/backtest/strategy/run, 近 90 天单标的控制耗时
- 04: hello 帧打印规整
This commit is contained in:
shy3130
2026-09-26 11:42:22 +08:00
parent f20772d7b7
commit d3500b1e76
3 changed files with 32 additions and 14 deletions
+16 -2
View File
@@ -18,10 +18,24 @@ fields = [f["name"] for f in cfg["fields"]]
print(f"目标表: {cfg.get('label', cid)} ({cid}) | 模式: {cfg.get('mode')} | 字段: {fields}")
# 2. 写入一行 (date 不传按北京当天落盘; 时序表自动进当日分区)
# 示例按字段名给合理演示值 — 实际接入时换成你的数据
from datetime import date
today = date.today().isoformat()
row = {"symbol": "600519.SH"}
for f in fields:
if f not in row:
row[f] = 1 # 示例值 — 实际接入时换成你的数据
if f in row:
continue
if f == "date":
row[f] = today
elif f == "name":
row[f] = "演示标的"
elif f == "code":
row[f] = "600519"
elif f.startswith("rank") or f == "heat":
row[f] = 1
else:
row[f] = 0
resp = call("POST", f"/api/ext-data/{cid}/ingest", {"rows": [row]})
print("写入:", resp)
+15 -11
View File
@@ -1,9 +1,11 @@
"""示例 3 — 策略与回测 (scope: read:analysis + run:backtest)。
列出策略清单 → 对单标的跑一次信号回测 → 读关键指标。
可用信号名以面板「信号库」/ GET /api/strategies 为准;
策略全周期回测走 POST /api/backtest/strategy/run (body 详见契约)。
列出策略清单 → 用纯 Polars 引擎跑一次策略回测 (所有安装自带, 无需 vectorbt)
→ 读关键指标。GET /api/backtest/status 可查历史任务;
POST /api/backtest/run 是 vectorbt 信号回测, 需 `uv sync --extra backtest`。
"""
from datetime import date, timedelta
from common import call
# 1. 策略清单 (read:analysis)
@@ -11,14 +13,16 @@ strategies = call("GET", "/api/strategies")["strategies"]
for s in strategies[:5]:
print(f"策略: {s['id']} {s['name']} [{','.join(s.get('tags', []))}]")
if not strategies:
print("(无策略)")
raise SystemExit("(无策略)")
# 2. 信号回测 (run:backtest): 贵州茅台, 5/20 均线金叉入场
result = call("POST", "/api/backtest/run", {
# 2. 策略回测 (run:backtest): 第一个策略, 近 90 天, 限定单标的控制耗时
sid = strategies[0]["id"]
result = call("POST", "/api/backtest/strategy/run", {
"strategy_id": sid,
"symbols": ["600519.SH"],
"entries": ["signal_ma_golden_5_20"], # 内置信号; 更多见 信号库 页面
"exits": [],
"start": (date.today() - timedelta(days=90)).isoformat(),
"end": date.today().isoformat(),
})
for key in ("total_return", "win_rate", "trades", "max_drawdown"):
if key in result:
print(f"回测 {key}: {result[key]}")
print(f"回测完成 ({sid}):", {k: v for k, v in result.items() if k in (
"total_return", "annual_return", "max_drawdown", "trades", "win_rate", "sharpe",
)})
+1 -1
View File
@@ -18,7 +18,7 @@ print("票据已签发 (60s 内一次性)")
# 2. 订阅: hello 帧之后, 面板触发任意监控告警即可看到 alert 事件
for event in itertools.islice(sse(f"/api/events?ticket={ticket}"), 5):
if event.get("event") == "hello":
print("hello: scopes =", event.get("data", "").strip("{}"))
print("hello: 票据 scope =", event.get("data", ""))
continue
print(f"[{event.get('event')}] {event.get('data', '')[:120]}")
print("(收到 5 帧后退出; 生产环境保持连接持续接收)")