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:
+60
-19
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user