从零开始:用Python实现凯利公式,科学控制仓位大小

那天有个客户问我:"老张啊,我每次该买多少才合适?全仓怕爆仓,轻仓又嫌赚得慢..."我给他倒了杯茶,打开Python说:"来,教你个华尔街赌场都在用的数学公式。"

凯利公式是什么?赌场老板最恨的数学

我第一次听说凯利公式是在拉斯维加斯。不是去赌博,是参加量化交易峰会。当时高盛的一个基金经理说:"我们用这个公式在21点牌桌上赢了赌场几百万,后来被永久禁入了。"

简单说,凯利公式就是告诉你:在已知胜率和赔率的情况下,下注多少能让资金增长最快。公式长这样:

f = (bp - q) / b

  • f:该投入的资金比例
  • b:赔率(赢了能赚多少倍)
  • p:胜率
  • q:败率(1-p)

举个例子:你发现个策略,60%概率赚20%,40%概率亏10%。该用多少仓位?

手把手用Python实现

打开你的Jupyter Notebook,我们先把公式变成代码:

def kelly_criterion(p, b):
    """
    p: 胜率
    b: 净赔率(赚的钱/亏的钱)
    """
    q = 1 - p
    return (b * p - q) / b

刚才那个例子套进去:

# 赔率b=20%/10%=2,胜率p=0.6
optimal_position = kelly_criterion(p=0.6, b=2)
print(f"最佳仓位比例:{optimal_position:.2%}")

输出显示35%,意味着每次应该用35%的资金。我有个客户之前总爱全仓干,用了这个之后说:"原来少下注反而赚得更多啊!"

真实交易中的花式变种

但实际交易哪有这么理想?我们得考虑这些:

  1. 连续亏损防护:原版凯利太激进,我一般用"半凯利"
def half_kelly(p, b):
    return kelly_criterion(p, b) * 0.5
  1. 多策略组合:就像不要把鸡蛋放一个篮子里
# 假设有三个策略的凯利值
kelly_values = [0.3, 0.2, 0.4]
total = sum(kelly_values)
adjusted = [v/total*0.5 for v in kelly_values]  # 总仓位控制在50%
  1. 动态调整:市场波动大时自动降仓位
def dynamic_kelly(p, b, volatility):
    base = kelly_criterion(p, b)
    return base * (1 - volatility)  # 简化处理

去年有个做期货的客户,用动态凯利躲过了三次暴跌,现在见我就说"数学真香"。

常见坑爹问题实录

新手最爱犯的几个错:

  1. 高估胜率:"我这个策略最近10把赢8把,p=80%!"——兄弟,回测过200次吗?样本太小就是赌博。

  2. 忽视滑点:算出来能赚1%,结果手续费加滑点倒亏0.5%。我一般建议:

def realistic_kelly(p, gross_b, cost):
    net_b = gross_b - cost  # 扣除交易成本
    return kelly_criterion(p, net_b)
  1. 死板执行:某天算出来仓位120%...难不成要去贷款炒股?我设了个上限:
def safe_kelly(p, b, max_position=0.5):
    return min(kelly_criterion(p, b), max_position)

进阶技巧:用机器学习预测胜率

现在最骚的操作是用LSTM预测胜率p。举个简化版例子:

from sklearn.ensemble import RandomForestClassifier

# 假设已经有特征矩阵X和标签y
model = RandomForestClassifier()
model.fit(X_train, y_train)
prob = model.predict_proba(X_test)[:, 1]  # 预测胜率

# 结合凯利公式
position_size = kelly_criterion(p=prob.mean(), b=2)

有个私募客户用这套方法,去年收益率跑赢沪深300四十多个点。不过要提醒:模型再牛也得定期回测,市场风格说变就变。

我的实战建议

  1. 先用模拟盘:我在营业部见过太多人一上来就实盘,三个月亏完的。现在开户都送模拟交易系统,不用白不用。

  2. 从日线开始:高频交易看着刺激,但滑点能吃光利润。新手建议先用日线数据:

# 获取日线数据示例
import akshare as ak
df = ak.stock_zh_a_daily(symbol="sh600519", adjust="hfq")
  1. 定期再平衡:我每周五下午都提醒客户检查仓位。自动化脚本长这样:
import schedule
import time

def rebalance():
    # 获取最新数据计算仓位
    pass

schedule.every().friday.at("14:50").do(rebalance)

while True:
    schedule.run_pending()
    time.sleep(1)

(开户找我还能领完整版代码模板,带异常处理和微信推送功能)

最后说两句掏心窝的

量化不是印钞机,但确实是散户少有的公平武器。去年帮个退休教师做了套凯利策略,年化16%他开心得请我吃饭。关键是要控制住手,很多人明明有好策略,结果一激动就满仓梭哈。

最近营业部在搞量化实盘大赛,用Python的组平均收益比手动交易组高27%。要是你也想试试,不妨找我开个户——现在开户送Level2行情,还能进我们的量化交流群,每周都有代码分享会。

记住,投资是长跑。用凯利公式的人,最后拼的不是谁赚得快,而是谁活得久。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐