研究打板破产的概率,以及破解之道
道观小生
+关注
博主要求身份验证
登录用户ID:
我不是打板的模式,但是经常听到有人一下子挣了很多,又有人打板归零,所以想模拟一下
使用蒙特卡法,写程序代码模拟打板模式破产的概率。假设打板模式是正数学期望的:年化收益率200%,而最大回撤是-100%(这里的年化收益率和最大回撤,都指的是单利统计,即每天操作1次,按次计算收益率。即10年的收益率求和除以10,是200%,而最大回撤是指每隔3年,连续一段时间的收益率之和为-100%)。如果满仓操作(这里是模拟复利了,但是收益率的分布服从之前单利的情况),统计其净值低于30%的概率。然后对比每次操作采用总资金的20%进行操作,再统计其净值低于30%的概率。时间长度为10年。并画出每次模拟的净值曲线。
参数设置:即收益率的均值0.8%,250个交易日就是200%,标准差是20%,即打板失败吃面可能是几个板,所以很多时候收益>30%,但是也有很都时候亏损大于-30%
mu = 0.008 # 日收益率均值(年化200%)sigma = 0.2 # 日收益率标准差(可调整)
=== 蒙特卡洛模拟结果 ===模拟次数: 10000
满仓操作 - 最终净值低于10%的概率: 0.9986
满仓操作 - 路径中曾低于10%的概率: 0.9998
20%仓位 - 最终净值低于10%的概率: 0.0151
20%仓位 - 路径中曾低于10%的概率: 0.0558
意思就是说,满仓打板破产的概率几乎是100%,而分仓打板,或每次采用20%的仓位打板,而破产的概率只有1~2%,附上代码和结果图:欢迎批评指正
import numpy as npimport matplotlib.pyplot as plt
# 设置中文字体(确保系统有SimHei或Microsoft YaHei)plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘, ‘Microsoft YaHei‘] # 用于正常显示中文plt.rcParams[‘axes.unicode_minus‘] = False # 用于正常显示负号
# 参数设置np.random.seed(42) # 固定随机种子,结果可复现n_days = 2500 # 10年,假设每年250个交易日n_simulations = 10000 # 蒙特卡洛模拟次数mu = 0.008 # 日收益率均值(年化400%)sigma = 0.2 # 日收益率标准差(可调整)threshold = 0.1 # 破产阈值(净值低于30%)
# 生成收益率序列(形状:n_simulations × n_days)returns = np.random.normal(mu, sigma, size=(n_simulations, n_days))
# 满仓操作:净值 = 初始1 * 累积乘积(1+r)nav_full = np.cumprod(1 + returns, axis=1)
# 20%仓位操作:每日收益率 = 0.2 * rnav_partial = np.cumprod(1 + 0.2 * returns, axis=1)
# 统计破产概率(最终净值低于阈值)bankrupt_full_final = nav_full[:, -1] < thresholdbankrupt_partial_final = nav_partial[:, -1] < thresholdprob_full_final = np.mean(bankrupt_full_final)prob_partial_final = np.mean(bankrupt_partial_final)
# 统计破产概率(路径中曾低于阈值)bankrupt_full_path = np.any(nav_full < threshold, axis=1)bankrupt_partial_path = np.any(nav_partial < threshold, axis=1)prob_full_path = np.mean(bankrupt_full_path)prob_partial_path = np.mean(bankrupt_partial_path)
print("=== 蒙特卡洛模拟结果 ===")print(f"模拟次数: {n_simulations}")print(f"满仓操作 - 最终净值低于{threshold*100:.0f}%的概率: {prob_full_final:.4f}")print(f"满仓操作 - 路径中曾低于{threshold*100:.0f}%的概率: {prob_full_path:.4f}")print(f"20%仓位 - 最终净值低于{threshold*100:.0f}%的概率: {prob_partial_final:.4f}")print(f"20%仓位 - 路径中曾低于{threshold*100:.0f}%的概率: {prob_partial_path:.4f}")
# 绘制部分模拟路径(前10条)fig, axes = plt.subplots(1, 2, figsize=(12, 5))for i in range(min(10, n_simulations)): axes[0].plot(nav_full, alpha=0.7) axes[1].plot(nav_partial, alpha=0.7)axes[0].axhline(y=threshold, color=‘r‘, linestyle=‘--‘, label=f‘阈值 {threshold*100:.0f}%‘)axes[1].axhline(y=threshold, color=‘r‘, linestyle=‘--‘)axes[0].set_title(‘满仓操作净值曲线(前10条)‘)axes[1].set_title(‘20%仓位操作净值曲线(前10条)‘)axes[0].set_xlabel(‘交易日‘)axes[1].set_xlabel(‘交易日‘)axes[0].set_ylabel(‘净值‘)axes[1].set_ylabel(‘净值‘)axes[0].legend()plt.tight_layout()plt.show()