feat(web): 因子工作台接线——eval API 客户端+3路由+投研组菜单/面包屑 [nas]

This commit is contained in:
2026-08-25 00:33:46 +08:00
parent f0e9860316
commit fa87135a44
3 changed files with 96 additions and 0 deletions
+86
View File
@@ -33,3 +33,89 @@ export function reportUrl(taskId: string, factor: string): string {
const auth = useAuthStore()
return `/api/v1/task/${taskId}/report/${factor}?token=${encodeURIComponent(auth.token ?? '')}`
}
// —— Factor Evaluation API ——
export interface EvalRun {
run_id: string
label: string
universe: string
symbols_count: number
factors_total: number
factors_done: number
start: string
end: string
status: string
created_at: string
}
export interface MonthlyIcPoint { month: string; ic: number }
export interface LeaderboardRow {
rank: number
factor: string
category: string
expression: string
ic_mean: number | null
icir: number | null
t_stat: number | null
win_rate: number | null
ls_annual: number | null
turnover: number | null
conclusion: string
monthly_ic: MonthlyIcPoint[]
error?: string
}
export interface LeaderboardTiles {
factors_total: number
effective: number
watch: number
top_ls_annual: number | null
top_ls_factor: string | null
}
export interface EvalDetail {
factor: string
category: string
expression: string
metrics: Record<string, unknown>
}
export interface BatchEvalSubmit {
categories: string[]
factors: string[]
symbols: string[]
start: string
end: string
label: string
}
export async function getEvalRuns(): Promise<EvalRun[]> {
const { data } = await apiClient.get<{ runs: EvalRun[] }>('/factor/eval/runs')
return data.runs
}
export async function getLeaderboard(params: {
run_id?: string
period?: string
category?: string
search?: string
sort?: string
order?: string
}): Promise<{ tiles: LeaderboardTiles; rows: LeaderboardRow[] }> {
const { data } = await apiClient.get('/factor/eval/leaderboard', { params })
return data
}
export async function getEvalDetail(factor: string, runId?: string): Promise<EvalDetail> {
const { data } = await apiClient.get<EvalDetail>('/factor/eval/detail', {
params: { factor, ...(runId ? { run_id: runId } : {}) },
})
return data
}
export async function submitBatchEval(req: BatchEvalSubmit): Promise<string> {
const { data } = await apiClient.post<{ task_id: string }>('/factor/eval/submit', req)
return data.task_id
}