新增合约全历史拉取与 K 线打分叠加功能
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,10 @@ class RunRangeRequest(BaseModel):
|
||||
end_date: str
|
||||
|
||||
|
||||
class RunFullRequest(BaseModel):
|
||||
ts_code: str
|
||||
|
||||
|
||||
class RunResponse(BaseModel):
|
||||
ts_code: str
|
||||
trade_date: str
|
||||
@@ -131,6 +135,37 @@ def run_range(req: RunRangeRequest):
|
||||
}
|
||||
|
||||
|
||||
@app.post("/api/v1/run/full")
|
||||
def run_full(req: RunFullRequest):
|
||||
"""拉取指定合约全部历史数据,保存 candles,对所有可打分日期逐日打分并保存。"""
|
||||
df = fetcher.fetch_contract(req.ts_code)
|
||||
storage.save_candles(df)
|
||||
|
||||
results, warnings, total_days, scored_count = scorer.score_all(df)
|
||||
|
||||
for r in results:
|
||||
storage.save_score(r)
|
||||
|
||||
skipped_count = total_days - scored_count
|
||||
|
||||
return {
|
||||
"ts_code": req.ts_code,
|
||||
"total_days": total_days,
|
||||
"scored_count": scored_count,
|
||||
"skipped_count": skipped_count,
|
||||
"warnings": warnings,
|
||||
"results": [
|
||||
{
|
||||
"trade_date": r.trade_date,
|
||||
"close": r.close,
|
||||
"composite": r.composite,
|
||||
"signal": r.signal,
|
||||
}
|
||||
for r in results
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@app.get("/api/v1/scores")
|
||||
def list_scores(
|
||||
ts_code: Optional[str] = Query(None),
|
||||
|
||||
@@ -254,3 +254,29 @@ def score_range(
|
||||
warnings.append(str(e))
|
||||
|
||||
return results, warnings
|
||||
|
||||
|
||||
def score_all(df: pd.DataFrame) -> tuple[list[ScoreResult], list[str], int, int]:
|
||||
"""对 DataFrame 中所有有足够前置数据的交易日逐日打分。
|
||||
|
||||
Returns:
|
||||
(results, warnings, total_days, scored_count)
|
||||
"""
|
||||
if len(df) < 31:
|
||||
raise ValueError(f"数据量不足(仅 {len(df)} 行),需要至少 31 行")
|
||||
|
||||
results: list[ScoreResult] = []
|
||||
warnings: list[str] = []
|
||||
|
||||
for idx in range(30, len(df)):
|
||||
subset = df.iloc[: idx + 1].copy()
|
||||
trade_date = str(df.iloc[idx]["trade_date"])
|
||||
try:
|
||||
result = score_daily(subset)
|
||||
results.append(result)
|
||||
except ValueError as e:
|
||||
warnings.append(f"{trade_date}: {e}")
|
||||
|
||||
total_days = len(df) - 30
|
||||
scored_count = len(results)
|
||||
return results, warnings, total_days, scored_count
|
||||
|
||||
Reference in New Issue
Block a user