账户维度风控:总资金、最大回撤、日亏损限额的设定逻辑
账户维度的风控,说白了就是给你的交易账户上三道保险。我做了这么多年量化,见过太多人把精力全花在策略优化上,结果账户风控一塌糊涂,一次黑天鹅就爆仓出局。今天咱们就聊聊这三道保险怎么设、为什么设、设多少。
第一道保险:总资金限额
总资金限额,不是说你账户里有多少钱就用多少钱。我个人的习惯是,永远只拿总资金的一部分来做交易。
举个例子,你账户里有100万,你会全仓干进去吗?
我建议你设一个「交易资金上限」。比如总资金的60%用于交易,剩下的40%作为安全垫。为什么?因为市场会波动,你总得留点余地补保证金、应对突发情况。
核心逻辑:总资金限额 = 账户净资产 × 资金使用率
资金使用率建议:趋势策略 50%-70%,高频策略 30%-50%,套利策略 60%-80%
我在项目中遇到过一件事。有个团队做股指期货,账户500万,他们觉得策略稳,直接用了90%的资金。结果遇到一次盘中急跌,保证金不够,被迫平仓。其实那波急跌后面反弹了,但他们已经出局了。这就是总资金限额没设好的代价。
第二道保险:最大回撤限额
最大回撤,这是所有量化交易者的噩梦。你辛辛苦苦赚了三个月,一周就亏回去了,那种感觉我太懂了。
最大回撤限额怎么设?我一般分三层:
| 层级 | 触发条件 | 操作 |
|---|---|---|
| 预警线 | 回撤达到10% | 减半仓位,暂停开新仓 |
| 止损线 | 回撤达到20% | 清仓所有头寸,进入复盘 |
| 熔断线 | 回撤达到30% | 冻结账户,修改策略参数 |
你想想看,为什么是10%、20%、30%?这不是拍脑袋定的。我统计过自己过去五年的交易数据,回撤超过20%之后,策略要恢复到前高平均需要3-6个月。如果回撤超过30%,那基本意味着策略逻辑出了问题,不是市场的问题。
注意:最大回撤限额一定要动态调整。账户规模变大后,回撤的绝对值也变大了,但比例要保持不变。我曾经见过有人账户从100万做到500万,回撤限额还是按100万设的,结果一次回撤就亏了50万,比例上才10%,但绝对值已经受不了了。
第三道保险:日亏损限额
日亏损限额,这是我最看重的一道防线。为什么?因为连续亏损会让人失去理智。
我自己的规则很简单:单日亏损超过账户净值的2%,当天停止交易。不管后面行情多好,都不做了。
为什么会这样?因为人在亏损的时候,判断力会下降。你越想扳回来,就越容易犯错。我见过太多人,上午亏了3%,下午想翻本,结果一天亏了10%。
我的经验:日亏损限额最好设成「硬止损」和「软止损」两种。
- 硬止损:系统自动触发,无法手动干预
- 软止损:人工判断,但需要双人确认才能继续交易
我个人习惯用硬止损。因为人总有侥幸心理,觉得「再等一下就能回来」。但市场不会给你面子。
三道保险的联动逻辑
这三道保险不是孤立的,它们要联动起来。我画了一张图,你看一下就明白了:
你看这个图,三层是递进关系。日亏损限额是最敏感的,天天都在用。最大回撤限额是中期指标,用来判断策略是否失效。总资金限额是最后的底线,保命用的。
实际配置示例
说了这么多理论,咱们直接上代码。这是我实际在用的风控模块:
class AccountRiskManager:
def __init__(self, total_capital, usage_rate=0.6):
self.total_capital = total_capital
self.trading_capital = total_capital * usage_rate
self.safety_capital = total_capital * (1 - usage_rate)
# 回撤限额
self.drawdown_warning = 0.10 # 10%
self.drawdown_stop = 0.20 # 20%
self.drawdown_freeze = 0.30 # 30%
# 日亏损限额
self.daily_loss_limit = 0.02 # 2%
# 状态追踪
self.peak_capital = total_capital
self.current_daily_loss = 0
def check_daily_loss(self, today_pnl):
"""检查日亏损是否超限"""
self.current_daily_loss += today_pnl
loss_ratio = abs(self.current_daily_loss) / self.trading_capital
if loss_ratio >= self.daily_loss_limit:
return "STOP_TRADING" # 硬止损
return "CONTINUE"
def check_drawdown(self, current_capital):
"""检查回撤是否超限"""
if current_capital > self.peak_capital:
self.peak_capital = current_capital
drawdown = (self.peak_capital - current_capital) / self.peak_capital
if drawdown >= self.drawdown_freeze:
return "FREEZE_ACCOUNT"
elif drawdown >= self.drawdown_stop:
return "CLEAR_POSITIONS"
elif drawdown >= self.drawdown_warning:
return "REDUCE_POSITIONS"
return "NORMAL"
避坑指南:我曾经犯过一个错误——把日亏损限额设成了固定金额。比如每天最多亏1万。结果账户从10万做到50万,还是每天亏1万,比例从10%降到了2%,太保守了。后来我改成按比例,账户越大,能承受的亏损绝对值也越大,这样才合理。
参数设定的底层逻辑
你可能会问,为什么是2%?为什么不是1%或者5%?
嗯,这里有个数学逻辑。假设你的策略胜率是60%,盈亏比是1.5:1。那么单次交易的风险敞口决定了你的资金曲线平滑度。我一般用凯利公式的改良版来算:
# 改良凯利公式计算单次风险
win_rate = 0.60
profit_loss_ratio = 1.5
kelly_f = (win_rate * profit_loss_ratio - (1 - win_rate)) / profit_loss_ratio
# 结果约等于 0.27
# 实际使用取1/4凯利
actual_risk = kelly_f * 0.25 # 约 6.75%
# 但日亏损限额要更保守
daily_risk_limit = actual_risk * 0.3 # 约 2%
你看,2%不是随便定的。它是从策略的数学期望推导出来的。当然,不同策略参数会变,但逻辑是一样的——先算理论值,再打折扣,留足安全边际。
总结一下:
- 总资金限额:保命用的,永远留40%安全垫
- 最大回撤限额:判断策略是否失效,三层递进
- 日亏损限额:防止情绪失控,硬止损自动执行
这三道防线缺一不可。我见过太多人只设了总资金限额,结果回撤来了硬扛,最后爆仓。也见过只设日亏损限额的,结果连续几天小亏,不知不觉回撤已经很大了。
记住,风控不是限制你赚钱,而是让你能活得更久。市场永远在,机会永远有,但你的账户只有一次爆仓的机会。