🏠
AI量化交易 · 第6章
目录
Chapter 06

风险管理是第一堂课

先学会不亏钱,再考虑怎么赚钱——这是华尔街最古老的生存法则

本章学习目标

  1. 理解为什么风险管理比策略本身更重要
  2. 掌握单笔交易风险的量化计算方法
  3. 学会用凯利公式和固定比例法管理仓位
  4. 设计一套适合自己的风险控制规则
  5. 用蒙特卡洛模拟评估策略的稳健性

一个天才团队的陨落

1998年,华尔街发生了一场地震。一支由两位诺贝尔经济学奖得主、一位美联储前副主席和一群数学博士组成的梦幻团队,在几个月内亏掉了46亿美元,几乎拖垮整个美国金融体系。这支团队叫长期资本管理公司(LTCM)

他们的策略在数学上近乎完美。根据历史数据,某些价格偏离"几乎不可能"同时发生。但问题是,他们用了60倍的杠杆。当俄罗斯债务危机这个黑天鹅事件来临时,市场不再讲道理,流动性瞬间蒸发。完美的模型,配上失控的仓位,结果是一场灾难。

LTCM的教训告诉我们一个残酷的事实:好的策略配上差的风险管理,比差的策略配上好的风险管理死得更快。你可以连续赢99次,但第100次爆仓会让你归零。在量化交易的世界里,活得久比赚得快重要一万倍。

思考题:如果你有一枚硬币,正面赢100元,反面亏100元,你愿意押上全部身家吗?如果正面赢100元,反面亏90元呢?这个简单的思想实验,是理解风险管理的起点。

为什么风险管理是第一堂课

很多新手进入量化交易时,满脑子想的都是"如何找到那个能翻倍的策略"。他们花几个月时间优化参数,回测曲线漂亮得让人想哭,然后迫不及待地把全部资金投入实盘。三个月后,账户腰斩,策略被丢弃,重新开始寻找"圣杯"。

这个循环我看过太多次了。说实话,挺让人心疼的。因为问题的根源往往不是策略不好,而是风险管理缺失。一条平缓向上、偶尔回撤的收益曲线,和一条暴涨暴跌、最终归零的收益曲线,差别往往不在策略本身,而在仓位管理和止损纪律。

巴菲特说过一句被引用烂的话:"投资的第一原则是永远不要亏损,第二原则是记住第一原则。"很多人觉得这是鸡汤,但在量化领域,这其实是严肃的数学问题。因为亏损和盈利在数学上是不对称的——亏50%需要赚100%才能回本,亏80%需要赚400%才能回本。越亏,回本的难度呈指数级增长。

风险管理的三大核心问题

在实际操作中,风险管理要回答三个问题:每一笔交易最多亏多少?总共能亏多少?亏了之后怎么办?这三个问题分别对应单笔风险控制、总体风险控制和止损纪律。听起来很简单,但90%的交易员在实盘时都无法严格执行。

为什么会这样?因为人性。当你看到浮亏时,内心会冒出各种声音:"再等等,应该会反弹""现在止损就亏了,不如扛一扛""我的策略长期是正期望的,短期波动不用管"。这些声音如此自然,以至于你意识不到它们正在把你推向深渊。

量化交易的一个巨大优势,就是可以把风险管理规则写死在代码里。一旦触发条件,系统自动执行,不需要你临场做决策。这是AI和程序化交易送给普通交易者最好的礼物——帮你克服人性的弱点。

单笔交易的风险计算

让我们从最简单的场景开始。假设你有10万元本金,准备买入某只股票。你应该买多少?这个问题看似简单,实际上绝大多数人凭感觉操作——"我觉得能涨,多买点""最近行情不好,少买点"。这种模糊的判断,是风险失控的开始。

专业的做法是把问题量化。单笔风险 = 仓位大小 × 止损幅度。比如你有10万本金,决定单笔最多亏1%(即1000元),如果这只股票的止损幅度设为5%,那么你的仓位就是1000 ÷ 5% = 20000元,即总资金的20%。

这个公式的核心思想是:先确定你能承受多少损失,再倒推出该买多少。而不是先看股票"值不值得买",然后拍脑袋决定仓位。顺序很重要。前者是风险管理思维,后者是赌博思维。

止损的艺术与科学

止损是交易中最令人痛苦的话题之一。设得太紧,会被正常波动洗出去;设得太松,亏损会扩大到难以承受。那么止损到底应该怎么设?

常见的止损方法有几种。固定金额止损最简单:每笔最多亏X元,到了就砍。这种方法适合新手,因为心理负担最小——你知道最坏结果是什么。百分比止损稍复杂一点:根据入场价格设一个百分比,比如跌5%就止损。这种方法考虑了价格波动,但没有考虑不同股票的波动特性。

更高级的方法是ATR止损。ATR(Average True Range)是平均真实波幅,衡量股票近期的波动程度。一只日均波动2%的股票和一只日均波动8%的股票,用同样的百分比止损显然不合理。ATR止损会根据股票的"脾气"动态调整止损距离,给了高波动股票更多呼吸空间,同时不给低波动股票不必要的宽松。

风险管理计算器
1%
5%
单笔最大亏损: 1000元 | 建议仓位: 20000元 (20.0%)

上面的计算器展示了核心逻辑。试着调整参数,你会发现一个反直觉的现象:止损幅度越小,建议仓位反而越大。这是因为单笔风险固定的情况下,止损越紧,你能承受的仓位就越重。但这也意味着你被"洗出去"的概率更高——这就是风险管理的权衡艺术

仓位管理的数学:凯利公式

说到仓位管理,就不得不提凯利公式(Kelly Criterion)。这个由贝尔实验室科学家约翰·凯利在1956年提出的公式,被巴菲特、爱德华·索普等投资大师所推崇。它的核心思想是:给定一个具有正期望值的投资机会,存在一个最优的仓位比例,可以最大化长期财富增长率。

凯利公式的表达式是:f* = (bp - q) / b。其中f*是最优仓位比例,b是赔率(盈利金额/亏损金额),p是胜率,q是败率(1-p)。

举个例子,如果你的策略胜率是55%,平均盈利是平均亏损的1.5倍,那么f* = (1.5 × 0.55 - 0.45) / 1.5 = 0.275 / 1.5 ≈ 0.183。也就是说,最优仓位是总资金的18.3%。

但等等——凯利公式有一个致命的假设:你知道真实的胜率和赔率。而在实际交易中,这两个数字都是估计值,有很大的不确定性。如果用过于乐观的估计代入凯利公式,结果会非常激进,一旦实际情况不及预期,回撤会大得惊人。

因此,实战中更常用的是"半凯利"或"四分之一凯利"——把凯利公式算出的结果除以2或4。这样做牺牲了一部分理论上的最优增长率,但大幅降低了回撤和爆仓风险。毕竟,活得久比跑得快重要。

固定比例法:简单即美德

如果你觉得凯利公式太复杂,还有一种更简单的方法:固定比例法。每笔交易只承担总资金的固定比例(比如1%或2%),然后根据止损距离倒推仓位。这种方法的数学基础不如凯利公式严谨,但执行起来简单明了,而且天然限制了最大回撤——连续亏损10次,总亏损也就10%左右。

对于初学者,我的建议是:先用固定比例法建立纪律,等积累了足够的交易记录后,再用凯利公式优化。不要本末倒置,在没有足够数据支撑的情况下追求"理论最优"。

graph TD A[总资金] --> B[单笔风险比例] B --> C[单笔最大亏损金额] C --> D[止损距离] D --> E[建议仓位大小] E --> F{仓位是否合理?} F -->|是| G[执行交易] F -->|否| H[调整止损或放弃] style A fill:#1e3a5f,stroke:#f97316,color:#e8ecf4 style G fill:#10b981,stroke:#06b6d4,color:#e8ecf4

回撤与心理承受力

在纸面上讨论风险管理很容易,但实盘时最大的敌人不是市场,而是你自己。当账户浮亏20%时,你还能坚持既定策略吗?浮亏30%呢?50%呢?

每个人的心理承受力不同。有些人看着账户每天波动几万块毫无感觉,有些人亏5%就睡不着觉。没有哪种承受力更好或更坏,重要的是诚实面对自己。如果你知道自己亏10%就会恐慌性平仓,那就把单笔风险设得更低,让最大回撤控制在你能安心睡觉的范围内。

这里有一个实用的建议:在启动任何策略之前,先问自己一个问题——"如果这个策略在接下来的三个月里亏了20%,我会怎么做?"如果你的答案是"立刻停止并反思",那很好,说明你的风险控制是认真的。如果你的答案是"不太可能吧,我的回测结果很好",那你需要更谨慎一些。

我见过太多回测年化收益50%的策略,在实盘里第一个月就回撤15%。不是策略错了,而是策略的波动特性与交易者的心理承受力不匹配。量化交易不只是数学,也是心理学。

—— 一位从业十年的量化基金经理

最大回撤的统计学意义

从统计角度看,最大回撤(Max Drawdown)是衡量策略风险最核心的指标之一。它表示从任意高点到低点的最大跌幅。一个策略的年化收益可能是30%,但如果最大回撤是40%,那这个策略对大多数人来说是不可接受的——你很可能在回撤最深的阶段放弃它,而错过之后的反弹。

一般来说,Calmar比率(年化收益 / 最大回撤)是评价策略风险收益特征的好指标。优秀的策略Calmar比率通常在1.0以上,即每承担1%的回撤风险,能获得1%以上的年化收益。如果你的策略Calmar比率低于0.5,说明风险收益比不够理想,需要优化。

用蒙特卡洛模拟评估策略

回测可以告诉你策略在过去表现如何,但不能告诉你未来可能怎样。蒙特卡洛模拟是一种强大的工具,它通过随机重排历史交易结果,生成成千上万种可能的未来路径,让你看到策略在各种情景下的表现。

想象一下:你的策略在过去5年里有100次交易,胜率60%,平均盈亏比1.5。这听起来不错。但如果你是那40%的亏损交易集中在开头呢?如果连续亏损10次呢?回测只展示了历史发生的一种顺序,而蒙特卡洛模拟展示了所有可能的顺序

# 蒙特卡洛模拟:评估策略的稳健性
import numpy as np
import matplotlib.pyplot as plt

# 策略参数
n_trades = 200
win_rate = 0.55
avg_win = 1500
avg_loss = -1000
initial_capital = 100000
n_simulations = 1000

results = []
max_drawdowns = []

for _ in range(n_simulations):
    capital = initial_capital
    peak = capital
    max_dd = 0
    capital_curve = [capital]
    
    for _ in range(n_trades):
        if np.random.random() < win_rate:
            pnl = np.random.normal(avg_win, avg_win * 0.3)
        else:
            pnl = np.random.normal(avg_loss, abs(avg_loss) * 0.3)
        
        capital += pnl
        capital_curve.append(capital)
        
        if capital > peak:
            peak = capital
        dd = (peak - capital) / peak
        if dd > max_dd:
            max_dd = dd
    
    results.append(capital)
    max_drawdowns.append(max_dd)

print(f"最终资金中位数: {np.median(results):,.0f}")
print(f"最终资金均值: {np.mean(results):,.0f}")
print(f"亏损概率: {(np.array(results) < initial_capital).mean()*100:.1f}%")
print(f"平均最大回撤: {np.mean(max_drawdowns)*100:.1f}%")
print(f"最差最大回撤: {np.max(max_drawdowns)*100:.1f}%")

运行这段代码,你可能会发现一个令人警醒的事实:即使策略有正期望值,在足够多的模拟中,仍然有一部分路径会导致亏损,甚至产生让人窒息的回撤。这不是策略的问题,这是概率的必然。蒙特卡洛模拟的价值,就是让你在投入资金之前,对这些可能性有清醒的认识。

蒙特卡洛模拟器
200
55%
1.5
模拟运行中...

巴菲特的仓位管理智慧

回到本章开头的故事,LTCM用60倍杠杆把自己玩死了。而巴菲特的伯克希尔·哈撒韦,在60多年的投资历程中,极少使用杠杆,却创造了年化约20%的奇迹。这两个极端案例的对比,揭示了风险管理的本质:永远不要做可能让你出局的事

巴菲特的"永不亏损"原则,在量化语境下可以理解为:确保任何单笔交易、任何极端事件都不会让账户遭受不可逆的损失。他 famously 说过,如果你给他一把只有六个弹仓的左轮手枪,里面只有一颗子弹,让他对着自己的脑袋扣动扳机,即使给他100万美元的报酬,他也不干。因为"没有什么是值得冒生命风险的"——在交易中,爆仓就等于投资生命的终结。

对于量化交易者来说,这意味着:杠杆是有毒的。回测显示加2倍杠杆能让收益翻倍?是的,但它也让回撤翻倍,让爆仓概率呈指数级上升。很多看起来"加杠杆就能飞"的策略,实际上是在刀尖上跳舞。AI可以帮助你计算最优仓位,但最终是否使用杠杆、使用多少杠杆,是人类必须独立做出的判断。

分散投资:不把所有鸡蛋放在一个篮子里

另一个重要的风险管理原则是分散化。不要把全部资金押在一个策略、一个资产、一个市场上。即使你对某个策略再有信心,也要为它设定资金上限。市场会奖励谦虚的人,惩罚自负的人——这是为数不多的确定性之一。

分散化的数学基础很简单:如果你有两个不相关的策略,每个都有正期望值,把它们组合在一起,组合的夏普比率会高于任何一个单独的策略。这不是魔法,是大数定律在起作用。单个策略的运气成分被另一个策略对冲,长期来看,组合的稳定性更好。

与AI一起练习

练习1:让AI设计你的风险管理方案

Prompt模板:

我是一名量化交易初学者,总资金是[填写你的金额]元。
我的心理承受能力是:最大回撤不超过[填写百分比]%。
我计划交易的品种是[股票/期货/加密货币]。

请帮我设计一套完整的风险管理规则,包括:
1. 单笔交易的最大风险比例
2. 止损方法的选择和具体参数
3. 仓位计算公式
4. 每日/每周的最大亏损限制
5. 连续亏损后的应对措施

AI的预期输出:一份个性化的风险管理方案,包含具体的数字和可执行的操作规则。

你需要做的:把AI给出的方案打印出来,贴在显眼的位置,确保每次交易前都检查一遍。

练习2:用蒙特卡洛方法模拟你的策略

Prompt模板:

我有一个交易策略,历史表现如下:
- 总交易次数:[填写]
- 胜率:[填写]%
- 平均盈利:[填写]元
- 平均亏损:[填写]元

请用Python写一段蒙特卡洛模拟代码,模拟这个策略在1000种不同情景下的表现。
要求输出:盈利概率、平均最终资金、平均最大回撤、最差情景下的资金曲线图。

AI的预期输出:完整的Python代码和运行结果的可视化。

你需要做的:运行代码,观察最差情景下的回撤幅度。问自己:如果这种情况真的发生,我还能坚持这个策略吗?如果不能,降低仓位直到你能安心接受最差结果。

练习3:为什么好的策略配上差的资金管理也会亏钱

Prompt模板:

请用通俗易懂的语言解释:为什么一个长期期望值为正的交易策略,如果仓位管理不当,仍然可能导致账户亏损甚至爆仓?
请包含一个具体的数值例子,展示同样的策略在不同仓位下的最终结果差异。

AI的预期输出:生动的解释和数值对比,帮助你理解仓位管理的重要性。

你需要做的:把这个解释保存下来,作为未来 tempted 重仓时的"清醒剂"。

动手实践:写一个完整的仓位管理模块

下面是一个可以直接运行的Python模块,包含了本章介绍的核心风险管理功能。你可以把它集成到自己的策略中。

"""
风险管理模块 RiskManager
包含:仓位计算、止损设置、回撤监控
"""
import numpy as np

class RiskManager:
    def __init__(self, total_capital, risk_per_trade=0.01, max_drawdown=0.15):
        """
        total_capital: 总资金
        risk_per_trade: 单笔风险比例(默认1%)
        max_drawdown: 最大允许回撤(默认15%)
        """
        self.total_capital = total_capital
        self.initial_capital = total_capital
        self.risk_per_trade = risk_per_trade
        self.max_drawdown = max_drawdown
        self.peak = total_capital
        self.trades = []
        
    def calculate_position(self, entry_price, stop_price):
        """
        根据入场价和止损价计算建议仓位
        """
        risk_amount = self.total_capital * self.risk_per_trade
        stop_distance = abs(entry_price - stop_price) / entry_price
        
        if stop_distance == 0:
            return 0
            
        position_size = risk_amount / stop_distance
        max_position = self.total_capital * 0.5  # 单票不超过50%
        
        return min(position_size, max_position)
    
    def check_drawdown(self):
        """
        检查当前回撤是否超过阈值
        """
        if self.total_capital > self.peak:
            self.peak = self.total_capital
            
        current_dd = (self.peak - self.total_capital) / self.peak
        
        if current_dd >= self.max_drawdown:
            return False, f"回撤超限: {current_dd*100:.1f}% >= {self.max_drawdown*100:.1f}%"
        return True, f"当前回撤: {current_dd*100:.1f}%"
    
    def record_trade(self, pnl):
        """
        记录一笔交易的盈亏
        """
        self.trades.append(pnl)
        self.total_capital += pnl
        
    def get_stats(self):
        """
        获取风险统计信息
        """
        if not self.trades:
            return "暂无交易记录"
            
        returns = np.array(self.trades)
        total_return = (self.total_capital - self.initial_capital) / self.initial_capital
        
        # 计算最大回撤
        cumulative = np.cumsum(returns)
        peak = np.maximum.accumulate(cumulative)
        drawdown = (peak - cumulative) / self.initial_capital
        max_dd = np.max(drawdown) if len(drawdown) > 0 else 0
        
        return {
            '总收益率': f"{total_return*100:.2f}%",
            '交易次数': len(self.trades),
            '胜率': f"{(returns > 0).mean()*100:.1f}%",
            '平均盈亏': f"{returns.mean():.0f}元",
            '最大回撤': f"{max_dd*100:.2f}%",
            '当前资金': f"{self.total_capital:.0f}元"
        }

# 使用示例
if __name__ == "__main__":
    rm = RiskManager(total_capital=100000, risk_per_trade=0.01)
    
    # 模拟买入:价格100元,止损95元
    position = rm.calculate_position(entry_price=100, stop_price=95)
    print(f"建议仓位: {position:.0f}元")
    
    # 模拟一系列交易
    np.random.seed(42)
    for i in range(20):
        pnl = np.random.normal(500, 2000)  # 平均盈利500,标准差2000
        rm.record_trade(pnl)
        ok, msg = rm.check_drawdown()
        if not ok:
            print(f"警告!{msg},暂停交易!")
            break
    
    stats = rm.get_stats()
    for k, v in stats.items():
        print(f"{k}: {v}")
运行步骤
  1. 把上面的代码保存为 risk_manager.py
  2. 运行 python risk_manager.py 查看结果
  3. 修改 risk_per_trademax_drawdown 参数,观察对结果的影响
  4. 尝试把这段代码集成到你之前的策略中

本章思考题

知识测验
1. 如果你的账户亏损了50%,需要赚多少百分比才能回本?
  • A. 50%
  • B. 100%
  • C. 75%
  • D. 150%
答案是B。亏损和盈利是不对称的。亏50%后,本金只剩一半,需要赚100%(即翻一倍)才能回到原点。这也是风险管理如此重要的数学原因。
2. 凯利公式的主要作用是什么?
  • A. 预测市场走势
  • B. 计算最优仓位比例
  • C. 计算止损价格
  • D. 评估策略胜率
答案是B。凯利公式根据胜率和赔率计算最优仓位比例,目的是最大化长期财富增长率。它不预测市场,也不直接给出止损价格。
3. 以下哪种做法最符合风险管理原则?
  • A. 单笔交易风险不超过总资金的2%
  • B. 看好就满仓,不看好就空仓
  • C. 用2倍杠杆放大收益
  • D. 止损会让利润减少,尽量不设止损
答案是A。单笔风险控制是风险管理的基础。满仓操作、随意加杠杆、不设止损都是风险管理的反面教材。
深度思考题
  1. 回顾你自己的投资经历,有没有因为仓位过重或没有止损而遭受重大亏损?如果当时用了本章介绍的风险管理方法,结果会有什么不同?
  2. 有人说"量化交易不需要止损,因为策略长期是正期望的"。你怎么看这个说法?试着用蒙特卡洛模拟来验证你的观点。
  3. 巴菲特和LTCM代表了风险管理的两个极端。在你的交易生涯中,你更倾向哪一端?为什么?

下一章预告

学会了风险管理,你已经比80%的交易者更清醒了。但还有一个根本问题需要回答:量化交易和主观交易,到底哪个更适合你?

索罗斯凭直觉做空英镑赚了10亿美元,文艺复兴科技用数学模型管理着上千亿美元的资产。两种截然不同的路径,都能通向成功。关键在于——你更适合哪一条?

第7章将带你深入对比量化交易和主观交易的本质区别,还有一个有趣的自我评估问卷,帮你找到最适合自己的交易方式。准备好了?我们下一章见。

觉得有收获?分享给同样对量化交易感兴趣的朋友

上一章
趋势、震荡、突破——市场只有三种状态
掌握市场状态的分类和识别方法,判断当前市场处于哪种状态。
下一章
量化交易 vs 主观交易——本质区别是什么
理解两种交易方式的核心差异,找到最适合自己的路径。

如果这本书对你有所启发,欢迎支持我继续创作

赞赏二维码