96b1924fd5
[live] 实盘模拟 vnpy+miniQMT 直连(supervisor 轮询, 前后端): - sanguo_live: LiveTradingEngine + AShareCtaTemplate(定寸/禁做空) + runner_supervisor(DB驱动) + persistence(4表WAL) - sanguo_api/routes_live: 9路由(create/start/stop/positions/trades/account/status) - frontend live: New/List/Monitor + api/live.ts; config/live.yaml [portfolio] 组合回测 MVP(BulletTrade, 链路代码完成待验证): - runner_backtest 加 JSON 入口(--json, BacktestEngine 顶层 import) - sanguo_api/routes_portfolio: POST /portfolio/backtest SSH 触发 VPS 跑 - frontend PortfolioBacktest.vue + api/portfolio.ts: 表单+结果+净值曲线 - 路由/菜单注册(/backtest/portfolio 组合回测) - 已知: MVP 链路未端到端验证, agent 改至中途被停; 待 Mac 起服务联调
69 lines
1.4 KiB
TypeScript
69 lines
1.4 KiB
TypeScript
import { apiClient } from './client'
|
|
|
|
export interface PortfolioBacktestReq {
|
|
pool: string
|
|
start_date: string
|
|
end_date: string
|
|
initial_cash: number
|
|
benchmark?: string
|
|
}
|
|
|
|
export interface EquityPoint {
|
|
date: string
|
|
equity: number
|
|
}
|
|
|
|
export interface StockPicked {
|
|
code: string
|
|
name: string
|
|
amount: number
|
|
avg_cost: number
|
|
price: number
|
|
value: number
|
|
}
|
|
|
|
export interface PortfolioTrade {
|
|
datetime?: string
|
|
date?: string
|
|
code?: string
|
|
side?: string
|
|
action?: string
|
|
amount?: number
|
|
filled_amount?: number
|
|
price?: number
|
|
filled_price?: number
|
|
commission?: number
|
|
status?: string
|
|
}
|
|
|
|
export interface PortfolioMetrics {
|
|
total_return: number | null
|
|
annual_return: number | null
|
|
max_drawdown: number | null
|
|
sharpe: number | null
|
|
win_rate_daily: number | null
|
|
win_rate_trade: number | null
|
|
trading_days: number | null
|
|
}
|
|
|
|
export interface PortfolioBacktestResult {
|
|
strategy: string
|
|
period: { start: string; end: string; trading_days: number }
|
|
stocks_selected: StockPicked[]
|
|
trades: PortfolioTrade[]
|
|
equity_curve: EquityPoint[]
|
|
metrics: PortfolioMetrics
|
|
raw_summary?: Record<string, unknown>
|
|
}
|
|
|
|
export async function postPortfolioBacktest(
|
|
req: PortfolioBacktestReq,
|
|
): Promise<PortfolioBacktestResult> {
|
|
const { data } = await apiClient.post<PortfolioBacktestResult>(
|
|
'/portfolio/backtest',
|
|
req,
|
|
{ timeout: 600000 },
|
|
)
|
|
return data
|
|
}
|