feat(portfolio): max_pool 字段透传(model+handler+前端,解除30硬编码)
model 加 max_pool 字段(默认30,0=全市场不限);handler 用 req.max_pool 替换硬编码30; 前端加选股池上限 input + onSubmit 透传。下游 submit_portfolio→spec→argv--max-pool 链路异步化时已存在,本次只补入口。全周期验收可传 max_pool=0 对比 docker exec 旁证
This commit is contained in:
@@ -3,6 +3,7 @@ import { apiClient } from './client'
|
|||||||
export interface PortfolioBacktestReq {
|
export interface PortfolioBacktestReq {
|
||||||
pool: string
|
pool: string
|
||||||
strategy?: string
|
strategy?: string
|
||||||
|
max_pool?: number
|
||||||
start_date: string
|
start_date: string
|
||||||
end_date: string
|
end_date: string
|
||||||
initial_cash: number
|
initial_cash: number
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ let pollTimer: ReturnType<typeof setInterval> | null = null
|
|||||||
const form = reactive({
|
const form = reactive({
|
||||||
pool: 'hs300_subset',
|
pool: 'hs300_subset',
|
||||||
strategy: 'all_weather',
|
strategy: 'all_weather',
|
||||||
|
max_pool: 30,
|
||||||
start: '2024-01-01',
|
start: '2024-01-01',
|
||||||
end: '2024-02-29',
|
end: '2024-02-29',
|
||||||
cash: 1_000_000,
|
cash: 1_000_000,
|
||||||
@@ -108,6 +109,7 @@ async function onSubmit(): Promise<void> {
|
|||||||
const tid = await postPortfolioBacktest({
|
const tid = await postPortfolioBacktest({
|
||||||
pool: form.pool,
|
pool: form.pool,
|
||||||
strategy: form.strategy,
|
strategy: form.strategy,
|
||||||
|
max_pool: form.max_pool,
|
||||||
start_date: form.start,
|
start_date: form.start,
|
||||||
end_date: form.end,
|
end_date: form.end,
|
||||||
initial_cash: form.cash,
|
initial_cash: form.cash,
|
||||||
@@ -193,6 +195,16 @@ async function onSubmit(): Promise<void> {
|
|||||||
</el-select>
|
</el-select>
|
||||||
<span class="muted form-hint">选择回测策略</span>
|
<span class="muted form-hint">选择回测策略</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="选股池上限">
|
||||||
|
<el-input-number
|
||||||
|
v-model="form.max_pool"
|
||||||
|
:min="0"
|
||||||
|
:step="10"
|
||||||
|
:controls="false"
|
||||||
|
style="width: 220px"
|
||||||
|
/>
|
||||||
|
<span class="muted form-hint">0=全市场不限, N=前N只(MVP验证用, 默认30)</span>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="开始日期">
|
<el-form-item label="开始日期">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="form.start"
|
v-model="form.start"
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ class PortfolioBacktestRequest(BaseModel):
|
|||||||
default="all_weather",
|
default="all_weather",
|
||||||
description="策略: all_weather/momentum_timing/value_selection/small_cap",
|
description="策略: all_weather/momentum_timing/value_selection/small_cap",
|
||||||
)
|
)
|
||||||
|
max_pool: int = Field(default=30, description="选股池上限: 0=全市场不限, N=前N只(MVP验证用)")
|
||||||
|
|
||||||
|
|
||||||
@router.post("/portfolio/backtest", dependencies=[Depends(verify_token)])
|
@router.post("/portfolio/backtest", dependencies=[Depends(verify_token)])
|
||||||
@@ -48,7 +49,7 @@ async def run_portfolio_backtest(req: PortfolioBacktestRequest):
|
|||||||
cash=req.initial_cash,
|
cash=req.initial_cash,
|
||||||
benchmark=req.benchmark,
|
benchmark=req.benchmark,
|
||||||
strategy=req.strategy,
|
strategy=req.strategy,
|
||||||
max_pool=30,
|
max_pool=req.max_pool,
|
||||||
provider_config=None,
|
provider_config=None,
|
||||||
)
|
)
|
||||||
return {"task_id": tid}
|
return {"task_id": tid}
|
||||||
|
|||||||
Reference in New Issue
Block a user