聚宽模拟盘策略一旦启动,初始资金就锁定了。想中途加仓或减仓?传统做法是重建策略、从头回测、丢失实盘数据——这在实盘跟踪场景下几乎是不可接受的。
今天介绍 QuantLink 新增的资金管理功能:在不重启策略的前提下,直接调整虚拟账户的总资产。
问题:模拟盘的"启动即锁定"
想象一个典型场景:
- 你在聚宽创建了一个 ETF 轮动策略,初始资金 100 万
- 跑了两个月,虚拟账户涨到 152 万
- 这个月你想再加 50 万,让策略帮你管 200 万
- 传统做法:复制策略 → 新建一个 200 万初始资金的实例 → 重新跑回测 → 切换实盘跟踪
问题:
- 丢失历史:新策略没有旧策略的两个月回测数据,偏差对比断了
- 重复维护:同一套逻辑跑两份,以后改代码要同步
- 切换风险:从旧策略切到新策略的那一秒,可能正好错过关键信号
解决方案:Wallet 按钮 + 聚宽 inout_cash()
QuantLink 在每个策略行新增了 Wallet 按钮(钱包图标),点击后弹出资金管理对话框。你只需要输入目标总资产,剩下的交给系统:
用户操作 系统响应
─────────────────────────────────────────────────────────
点 Wallet 按钮 显示当前总资产(¥152,340)
输入目标(¥200,000) 实时显示预计入金 +¥47,660
点提交 提示"将于 2026-08-11 (周二) 生效"
↓
服务端创建 pending 记录
↓
[次日 盘前 9:00 北京] 聚宽策略 run_daily 触发
_ql_apply_cash_adjustments()
↓
GET 拉取 pending → inout_cash(+47,660)
↓
POST ack → 状态变 applied
↓
用户在 UI 看到"已应用"整个过程不需要修改策略代码、不需要重启策略、不会丢失历史数据。
三个典型场景
场景一:追加投资(入金)
当前虚拟账户 152 万,想加到 200 万
输入目标 ¥2,000,000,系统显示预计入金 +¥476,600。聚宽侧执行:
delta = target_total - current_total # 2000000 - 1523400 = +476600
inout_cash(delta) # 直接 +47.66 万入金零风险——入金不涉及现有持仓。
场景二:提取盈利(小额出金)
当前 152 万(其中现金 30 万 + 持仓 122 万),想取 20 万现金出来
输入目标 ¥1,323,400,系统显示预计出金 -¥200,000。聚宽侧:
delta = target_total - current_total # 1323400 - 1523400 = -200000
# 可用现金 300000 > 出金 200000,直接提取
inout_cash(-200000)安全——只要出金额不超过当前可用现金,直接提取,不动持仓。
场景三:大幅减资(大额出金)
当前 152 万(现金 30 万 + 持仓 122 万),想减到 80 万
需要出金 72 万,但可用现金只有 30 万,差额 42 万必须先卖出持仓。这时:
- 不勾选"按比例卖仓":系统截断到可用现金,只出 30 万,目标达不到
- 勾选"按比例卖仓"(用户授权):聚宽按比例缩放所有持仓,自动卖出 42 万 + 提取 72 万
按比例缩放算法:
scale = target_total / current_total # 800000 / 1523400 ≈ 0.525
for stock, pos in context.portfolio.positions.items():
target_qty = int(pos.total_amount * scale / 100) * 100 # 100 股整数倍
if target_qty < pos.total_amount:
order_target(stock, target_qty) # 减仓
# 卖出后现金增加,再 inout_cash 把总资产降到 target
inout_cash(target_total - new_total)按比例卖仓会直接修改策略持仓。如果你的策略使用 order_value / order / buy / sell 这类绝对数量下单函数,它可能在下一轮调仓时"买回"被缩放的仓位。系统会自动检测你的策略使用的下单函数类型并提示:
- ✅
order_target_percent/order_target:自适应,缩放安全 - ⚠
order_value/order/buy/sell:固定数量,可能买回
关键细节
1. T+1 生效,不是实时
北京时间 09:00 是 cutoff:
- 09:00 之前提交 → 当天生效(聚宽 盘前 9:00 应用)
- 09:00 之后提交 → 次工作日生效(跳过周末)
这个设计的考虑:
- 给用户明确的"提交即确认"窗口,避免盘中临时调整引发混乱
- 盘前 9:00 在开盘竞价(09:15-09:25)之前,调整完资金再开始交易,逻辑干净
- 符合基金申赎的 T+1 心智
2. 重复提交会替换,不会堆积
如果你今天提交了"目标 200 万",明天又改成"目标 180 万":
- 服务端用事务原子替换:删掉昨天那条 pending,插入今天的新记录
- 最终生效的是最后一次提交的目标
- 不会出现"两个 pending 都被聚宽执行"导致重复调整
3. 幂等保证,不会重复执行
四层防御防止"同一笔调整被聚宽执行两次":
- 服务端四态状态机:
pending → dispatched → applied / expired - JQ GET 端点用
SELECT FOR UPDATE SKIP LOCKED:多个 JQ 进程并发拉取不会重复 - JQ 侧
context._ql_dispatched_ids集合:进程重启时跳过已应用 - 每小时 cron 把 24 小时未确认的
dispatched标记为expired
4. 时区以服务端为准
所有时间逻辑都在 QuantLink 服务端(UTC)计算,JQ 和转发器不参与时间判断。JQ 本地时钟漂移几分钟不影响业务正确性。
真实用例
用例 A:每月定投入金
每月发工资后,登录 QuantLink,把当月追加金额加到目标里。下个月聚宽策略自动用更大的资金量调仓,无需任何代码改动。
用例 B:止盈减仓
某只 ETF 涨了 30%,你想锁定一半利润:
- 看一眼当前总资产
- 输入"目标 = 当前 × 0.85"(提取 15%)
- 勾选"按比例卖仓"授权
- 次日 盘前 9:00,聚宽自动按比例缩仓 + 提取现金
用例 C:风险控制,逐步降低杠杆
如果市场进入高波动期,你想把策略规模从 200 万逐步降到 100 万:
- 不要一次降到 100 万(策略可能剧烈调仓)
- 分 4 周,每周降 25 万(200 → 175 → 150 → 125 → 100)
- 每周提交一次,让策略平滑过渡
用例 D:多策略账户的资金再分配
你有两个策略 A 和 B,初始各 100 万。一个月后 A 涨到 130 万,B 跌到 90 万。你想把资金重新平衡:
- 把 A 减到 110 万(提取 20 万盈利)
- 把 B 加到 110 万(注入 20 万)
- 两个策略各自独立提交,互不影响
重要边界
资金管理调整的是聚宽虚拟账户,不直接操作你的 QMT 实盘账户。如果你希望实盘也同步变化,需要手动:
- 入金后:在 QMT 券商账户里也存入对应金额的真实资金
- 出金后:可以从 QMT 提取对应资金到银行卡
- 缩仓后:实盘 QMT 持仓可能跟聚宽虚拟不一致,需要手动校准或运行校准代码
这是 deliberate 的设计选择——平台不碰用户实盘资金,所有真实资金操作由用户自己掌控。
共享策略的限制
如果你是被分享策略的接收方,打开资金管理对话框时是只读模式:
- 能看到历史调整记录
- 不能创建新调整(JQ 策略代码归 owner 控制)
- 顶部显示"资金调整由分享者管理"
如果接收方想调整自己的执行规模,应该用执行配置里的 orderRatio(下单比例),而不是直接调整虚拟账户资金。
总结
QuantLink 的资金管理功能解决了"模拟盘启动即锁定"的老问题:
- 不重启策略:运行中的模拟盘可以直接调整
- 不丢失历史:策略 ID 不变,所有历史数据延续
- T+1 自动应用:聚宽 盘前 9:00 自动调用
inout_cash() - 三种场景覆盖:入金、小额出金、大额出金 + 按比例缩放
- 幂等保证:跨进程、跨重启都不会重复执行
这个功能跟 持仓漂移监控、智能代码注入 一起,构成了 QuantLink 的"策略运行时管理三件套":注入代码 → 监控偏差 → 调整资金。
想试试?登录 QuantLink,在策略列表点 Wallet 按钮,提交你的第一次资金调整。