接口 /logic_state 随状态回安全边际三情景(持仓页参考目标价用;算失败不拖垮状态查询)

This commit is contained in:
zlt 2026-09-07 16:35:29 +08:00
parent f913b84446
commit ab09154594
2 changed files with 23 additions and 0 deletions

11
api.py
View File

@ -20,6 +20,7 @@ import pandas as pd
from fastapi import FastAPI, HTTPException, Request from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import PlainTextResponse from fastapi.responses import PlainTextResponse
import card
import config import config
import db import db
import logic_state_daily import logic_state_daily
@ -185,4 +186,14 @@ def logic_state_lookup(codes: str | None = None, code: str | None = None,
out.append({"input": c, "code": k, "date": d, "source": "computed", out.append({"input": c, "code": k, "date": d, "source": "computed",
"verdict": None, "card_rank": None, "plan_version": None, "verdict": None, "card_rank": None, "plan_version": None,
**(plan._state_out(computed.get(k)) or {})}) # noqa: SLF001 **(plan._state_out(computed.get(k)) or {})}) # noqa: SLF001
# 安全边际三情景随状态一起回第四件2026-09-07 拍板持仓页显示中性情景作参考目标价,只显示不触发)。
# 逐票日频表里不存它,每次按此刻现算;算失败整批不带这两键,状态照回。
try:
vals = plan.valuations_for(list(keyed), d)
for item in out:
v = vals.get(item["code"])
item["valuation"] = v
item["valuation_text"] = card.valuation_view(v)
except Exception as e: # noqa: BLE001 —— 估值算不出不该拖垮状态查询
_access.warning("logic_state valuation failed date=%s err=%r", d, e)
return {"date": d, "count": len(out) + len(bad), "states": out + bad} return {"date": d, "count": len(out) + len(bad), "states": out + bad}

12
plan.py
View File

@ -259,6 +259,18 @@ def logic_states_for(codes: list, ds: str) -> dict:
return out return out
def valuations_for(codes: list, ds: str) -> dict:
"""给定几只票的安全边际三情景(第四件),按前缀码索引。给接口 /logic_state 用:持仓页要显示
参考目标价中性情景2026-09-07 拍板只显示不触发不替代用户手设的目标价而持仓票
不在计划里取数与计划装配同一处券商研报原始行前复权收盘价"""
codes = [str(c).strip() for c in (codes or []) if str(c).strip()]
if not codes:
return {}
rows = sources.broker_reports(codes, ds)
prices = sources.close_prices(ds)
return sources.valuation_scenarios(codes, ds, prices, rows=rows)
def _assemble_cards(ds: str, codes: list, ev: dict, upside: pd.Series, def _assemble_cards(ds: str, codes: list, ev: dict, upside: pd.Series,
mkt_days: set, risk: set | None = None) -> tuple[dict, list]: mkt_days: set, risk: set | None = None) -> tuple[dict, list]:
"""候选卡装配2026-09-02 方案第 2.2 节第三项):对档位表里的全部票(主榜与观察档, """候选卡装配2026-09-02 方案第 2.2 节第三项):对档位表里的全部票(主榜与观察档,