一种用于在多次重复投资或赌博中最佳资金分配比例的数学工具——凯利公式

📅 发布时间:2026/7/8 8:59:30
一种用于在多次重复投资或赌博中最佳资金分配比例的数学工具——凯利公式 一.背景凯利公式是一种用于确定在多次重复投资或赌博中最佳资金分配比例的数学工具由约翰·凯利于1956年提出。其核心目的是在已知成功概率和赔率的情况下最大化资金增长率同时避免破产风险‌。二.公式三.应用场景与局限性‌适用场景‌主要用于量化交易、投资组合管理或任何重复性决策以平衡风险与收益‌‌股票/期货交易‌通过计算胜率p和赔率b确定最佳仓位避免过度集中风险‌‌高频交易‌结合高胜率、低赔率的特点动态调整资金比例以稳定盈利‌‌价值投资‌长期持有高胜率资产时公式可辅助仓位管理‌赌场游戏‌如21点、赛马等公式可计算最优下注比例但需注意赌场规则通常设计为负期望收益‌四.例子投硬币1. 游戏规则设定‌假设有一个公平的投硬币游戏‌正面朝上‌你赢2元即盈亏比 b2。‌反面朝上‌你输1元即亏损全部下注本金。‌胜率p‌50%正反面概率均等。‌败率q‌50%q1−p。‌2. 凯利公式计算‌凯利公式的表达式为即每次应投入当前资金的 ‌25%‌ 作为最佳下注比例‌。‌3. 动态调整与收益‌‌初始资金100元‌首次下注25元。若赢资金增至125元下次下注31.25元125×25%。若输资金降至75元下次下注18.75元75×25%。‌长期复利效应‌理论上按此比例下注可实现资金指数增长‌。五.例子基金投资东方臻宝纯债债券A006210基金概况业绩表现‌‌近1年涨幅‌5.25%同类平均2.69%‌近3年涨幅‌15.17%同类平均9.94%‌成立以来涨幅‌396.13%年化收益率约56.02%‌同类排名‌长期稳居纯债债券型基金前10%如近3年排名33/939‌基金参数设定‌‌上涨概率p‌基于近3年历史表现假设上涨概率为 ‌60%‌年化收益15.17%同类平均9.94%‌‌下跌概率q‌40%q1−p‌盈亏比b‌假设上涨时收益5%年化5.25%下跌时亏损2%近1月最大回撤0.42%,则 b2.5则公式如下结论该基金适合采用 ‌半凯利策略‌16%仓位长期复利效果显著但需结合止损和动态调整‌原因如下1. 低波动性与风险控制需求‌该基金为纯债型产品近1月最大回撤仅0.42%年化波动率显著低于股票型基金‌半凯利策略如16%仓位可进一步降低单一资产集中风险符合其低风险定位。‌2. 参数敏感性修正‌凯利公式依赖概率p和盈亏比b的准确估计而债券市场受利率政策影响参数易波动‌半凯利策略通过减半仓位可对冲模型误差如高估 p或b导致的过度投资风险。‌3. 长期复利与稳定性平衡‌该基金近3年累计收益15.17%年化5.25%但需避免短期回撤对复利的冲击‌半凯利策略在保持增长潜力的同时通过仓位限制如16%减少极端市场下的净值波动更适配长期持有需求。‌4. 与其他资产的协同配置‌根据投研报告该基金在组合中常作为债券类核心配置占比73%需与股票、海外资产等形成互补半凯利策略的仓位控制可优化整体组合的夏普比率避免单一资产过度暴露。六.代码实现使用Python实现蒙特卡洛模拟验证凯利公式‌蒙特卡洛模拟‌是一种通过随机采样和统计分析来模拟复杂系统行为的数学方法。其核心在于处理输入参数的不确定性通过生成大量随机组合进行数值计算并统计结果从而评估系统风险或变化规律。import numpy as np import matplotlib.pyplot as plt from tqdm import tqdm # 进度条工具 class KellyMonteCarlo: def init(self, p0.6, b2, initial_capital100000, n_simulations1000, n_periods252): 初始化蒙特卡洛模拟参数 :param p: 胜率 (默认0.6) :param b: 赔率 (默认2) :param initial_capital: 初始本金 (默认10万) :param n_simulations: 模拟次数 (默认1000次) :param n_periods: 投资周期数 (默认252个交易日) self.p p self.b b self.initial_capital initial_capital self.n_simulations n_simulations self.n_periods n_periods self.kelly_fraction self.calculate_kelly() def calculate_kelly(self): 计算凯利最优投注比例 return (self.b * self.p - (1 - self.p)) / self.b def simulate_single_path(self, f): 模拟单次投资路径 capital self.initial_capital history [capital] for _ in range(self.n_periods): if np.random.random() self.p: capital * (1 f * self.b) else: capital * (1 - f) history.append(capital) return history def run_monte_carlo(self, test_fractionsNone): 运行蒙特卡洛模拟 if test_fractions is None: test_fractions [0.1, 0.2, self.kelly_fraction, 0.5, 0.8, 1.0] results {} for f in test_fractions: paths [] final_values [] for _ in tqdm(range(self.n_simulations), descf模拟{f*100:.0f}%仓位): path self.simulate_single_path(f) paths.append(path) final_values.append(path[-1]) results[f] { paths: paths, final_values: final_values, median: np.median(final_values), mean: np.mean(final_values), std: np.std(final_values), ruin_prob: sum(1 for x in final_values if x self.initial_capital*0.1) / self.n_simulations } return results def plot_results(self, results): 可视化模拟结果 plt.figure(figsize(15, 10)) # 绘制典型路径 plt.subplot(2, 2, 1) for f, data in results.items(): for i in range(min(5, self.n_simulations)): # 展示前5条路径 plt.plot(data[paths][i], alpha0.5, labelf{f*100:.0f}% if i 0 else ) plt.title(典型投资路径) plt.xlabel(交易周期) plt.ylabel(资金量) plt.legend() plt.grid(True) # 绘制最终资金分布 plt.subplot(2, 2, 2) for f, data in results.items(): plt.hist(data[final_values], bins30, alpha0.5, labelf{f*100:.0f}%) plt.axvline(self.initial_capital, colorblack, linestyle--) plt.title(最终资金分布) plt.xlabel(最终资金) plt.ylabel(频率) plt.legend() plt.xscale(log) plt.grid(True) # 绘制风险收益指标 plt.subplot(2, 2, 3) metrics [median, mean, std, ruin_prob] for metric in metrics: values [data[metric] for f, data in results.items()] plt.plot([f*100 for f in results.keys()], values, o-, labelmetric) plt.title(不同仓位的风险收益指标) plt.xlabel(投注比例(%)) plt.ylabel(指标值) plt.legend() plt.grid(True) # 标记凯利最优值 plt.subplot(2, 2, 4) kelly_data results[self.kelly_fraction] plt.boxplot([data[final_values] for f, data in results.items()], positions[f*100 for f in results.keys()], widths5) plt.axvline(self.kelly_fraction*100, colorred, linestyle--, label凯利最优) plt.title(不同仓位的资金分布比较) plt.xlabel(投注比例(%)) plt.ylabel(最终资金(对数)) plt.yscale(log) plt.legend() plt.grid(True) plt.tight_layout() plt.show() if name main: # 参数设置基于东方臻宝纯债债券A 006210的假设参数 simulator KellyMonteCarlo(p0.6, b2, initial_capital100000) print(f凯利最优投注比例: {simulator.kelly_fraction*100:.1f}%) # 运行蒙特卡洛模拟 results simulator.run_monte_carlo() # 输出关键统计量 for f, data in results.items(): print(f\n投注比例 {f*100:.0f}%:) print(f中位最终资金: ¥{data[median]:,.2f}) print(f平均最终资金: ¥{data[mean]:,.2f}) print(f标准差: ¥{data[std]:,.2f}) print(f破产概率: {data[ruin_prob]*100:.1f}%) # 可视化结果 simulator.plot_results(results)