fix: show expiry-filter sample stats so ops map filter effect is visible

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-02 10:48:40 +08:00
parent 3e492eb46c
commit 56f58a12bd
6 changed files with 143 additions and 27 deletions
+60 -19
View File
@@ -56,13 +56,13 @@ def leverage_stats(
info = _range_info(range, date)
repo = Repository(s.db_path)
try:
rows = repo.fetch_option_quotes(
raw = repo.fetch_option_quotes(
start_ms=info["start_ms"],
end_ms=info["end_ms"],
side=side,
underlying=s.underlying,
)
rows = filter_rows_min_hours_to_expiry(rows, min_hours=mh)
rows, filt = filter_rows_min_hours_to_expiry(raw, min_hours=mh)
payload = leverage_stats_payload(
rows,
range_info=info,
@@ -71,6 +71,7 @@ def leverage_stats(
side=side,
)
payload["min_hours"] = mh
payload["expiry_filter"] = filt
return payload
finally:
repo.close()
@@ -94,13 +95,13 @@ def move_points_stats(
info = _range_info(range, date)
repo = Repository(s.db_path)
try:
rows = repo.fetch_option_quotes(
raw = repo.fetch_option_quotes(
start_ms=info["start_ms"],
end_ms=info["end_ms"],
side=side,
underlying=s.underlying,
)
rows = filter_rows_min_hours_to_expiry(rows, min_hours=mh)
rows, filt = filter_rows_min_hours_to_expiry(raw, min_hours=mh)
ymds = sorted({str(r.get("expiry_ymd")) for r in rows if r.get("expiry_ymd")})
# 懒回填:已到期但缺锚点时尽量补齐(本地指数优先,失败则跳过)
try:
@@ -121,6 +122,7 @@ def move_points_stats(
side=side,
)
payload["min_hours"] = mh
payload["expiry_filter"] = filt
return payload
finally:
repo.close()
@@ -134,19 +136,58 @@ def ops_map(
bucket_minutes: int = Query(default=60, ge=15, le=120),
min_hours: float = Query(default=12, ge=8, le=48),
) -> dict:
# 直接算一遍,避免路由函数互相调用时 Query 默认值问题
s = get_settings()
mh = _validate_min_hours(min_hours)
lev = leverage_stats(
range=range, date=date, side=side, bucket_minutes=bucket_minutes, min_hours=mh
)
mov = move_points_stats(
range=range, date=date, side=side, bucket_minutes=bucket_minutes, min_hours=mh
)
return {
"range": range,
"date": lev.get("date"),
"side": side,
"bucket_minutes": bucket_minutes,
"min_hours": mh,
"leverage": lev,
"move_points": mov,
}
info = _range_info(range, date)
repo = Repository(s.db_path)
try:
raw = repo.fetch_option_quotes(
start_ms=info["start_ms"],
end_ms=info["end_ms"],
side=side,
underlying=s.underlying,
)
rows, filt = filter_rows_min_hours_to_expiry(raw, min_hours=mh)
lev = leverage_stats_payload(
rows,
range_info=info,
bucket_minutes=bucket_minutes,
min_leverage=float(s.min_option_leverage),
side=side,
)
lev["min_hours"] = mh
lev["expiry_filter"] = filt
ymds = sorted({str(r.get("expiry_ymd")) for r in rows if r.get("expiry_ymd")})
try:
ensure_settlements_for_ymds(
repo,
ymds,
underlying=s.underlying,
index_inst_id=s.index_inst_id,
)
except Exception: # noqa: BLE001
pass
settlements = repo.list_settlements(ymds)
mov = move_points_stats_payload(
rows,
settlements,
range_info=info,
bucket_minutes=bucket_minutes,
side=side,
)
mov["min_hours"] = mh
mov["expiry_filter"] = filt
return {
"range": range,
"date": lev.get("date"),
"side": side,
"bucket_minutes": bucket_minutes,
"min_hours": mh,
"expiry_filter": filt,
"leverage": lev,
"move_points": mov,
}
finally:
repo.close()