当前位置: 首页 > news >正文

ML4T - 第8章第1节 蒙特卡洛估计夏普率 Monte Carlo Estimation of Sharpe Ratio

目录

一、Aim 目的

二、Analytical 解析法

三、Numerical 数值法

四、Compare 比对

五、Data Format 数据格式

六、All code 所有代码


原文:https://github.com/stefan-jansen/machine-learning-for-trading/blob/main/08_ml4t_workflow/01_multiple_testing/deflated_sharpe_ratio.py

一、Aim 目的

这个代码 用于计算和模拟在给定均值(mu)和标准差(sigma)的情况下,最大夏普比率(Sharpe Ratio)的解析解数值解

  1. 解析法(Analytical):基于极值理论,使用正态分布的分位数函数。

  2. 数值法(Numerical):通过蒙特卡洛模拟生成大量随机样本,取最大值并平均。

我们有两种方法,然后看能不能用蒙特卡洛的方法来代替解析法得到的结果。

二、Analytical 解析法

def get_analytical_max_sr(mu, sigma, num_trials):emc = 0.5772156649  # Euler-Mascheroni constantmaxZ = (1 - emc) * ss.norm.ppf(1 - 1. / num_trials) + emc * ss.norm.ppf(1 - 1 / (num_trials * np.e))return mu + sigma * maxZ
  • 目的:使用解析公式估计最大夏普比率的期望值。

  • 原理:基于极值理论,有对应的数学公式。

  • 返回值:最大夏普比率的解析估计值。

三、Numerical 数值法

def get_numerical_max_sr(mu, sigma, num_trials, n_iter):max_sr, count = [], 0while count < n_iter:count += 1series = np.random.normal(mu, sigma, num_trials)max_sr.append(max(series))return np.mean(max_sr), np.std(max_sr)
  • 目的:通过蒙特卡洛模拟估计最大夏普比率的期望值和标准差。

  • 过程

    • 每次模拟生成 num_trials 个正态分布随机数。

    • 取最大值并记录。

    • 重复 n_iter 次,计算这些最大值的均值和标准差。

  • 返回值:最大值的均值和标准差。

四、Compare 比对

def simulate(mu, sigma, num_trials, n_iter):"""Get analytical and numerical solutions"""expected_max_sr = get_analytical_max_sr(mu, sigma, num_trials)mean_max_sr, stdmean_max_sr = get_numerical_max_sr(mu, sigma, num_trials, n_iter)return expected_max_sr, mean_max_sr, stdmean_max_srdef main():n_iter, sigma, output, count = 1e4, 1, [], 0for i, prod_ in enumerate(product(np.linspace(-100, 100, 101), range(10, 1001, 10)), 1):if i % 10 == 0:print(i, end=' ', flush=True)mu, num_trials = prod_[0], prod_[1]expected_max_sr, mean_max_sr, std_max_sr = simulate(mu, sigma, num_trials, n_iter)err = expected_max_sr - mean_max_sroutput.append([mu, sigma, num_trials, n_iter,expected_max_sr, mean_max_sr,std_max_sr, err])output = pd.DataFrame(output,columns=['mu', 'sigma', 'num_trials', 'n_iter','expected_max_sr', 'mean_max_sr','std_max_sr', 'err'])

同时运行解析和数值方法,返回两者的结果。

  • 参数范围

    • mu:从 -100 到 100,共 101 个点。

    • num_trials:从 10 到 1000,步长为 10。

    • 总共组合数:101 × 100 = 10100 组。

  • 过程

    • 对每组参数运行模拟。

    • 记录解析解、数值解、误差等信息。

注意:这里计算比较慢,所以改成了if i % 10 == 0:打印,否则很久没有输出,以为出问题了。

(我是电脑跑完大约要1~2小时

五、Data Format 数据格式

列名含义
mu均值
sigma标准差(固定为 1)
num_trials每次模拟的样本数量
n_iter蒙特卡洛模拟次数(固定为 1e4)
expected_max_sr解析法估计的最大值
mean_max_sr数值法估计的最大值
std_max_sr数值法估计的标准差
err解析解与数值解的误差

六、All code 所有代码

#!/usr/bin/env python
# On 20140607 by lopezdeprado@lbl.gov
__modified_author__ = 'MangoQuant'  # https://blog.csdn.net/2401_82851462from itertools import productimport numpy as np
import pandas as pd
import scipy.stats as ssdef get_analytical_max_sr(mu, sigma, num_trials):"""Compute the expected maximum Sharpe ratio (Analytically)"""# Euler-Mascheroni constantemc = 0.5772156649maxZ = (1 - emc) * ss.norm.ppf(1 - 1. / num_trials) + emc * ss.norm.ppf(1 - 1 / (num_trials * np.e))return mu + sigma * maxZdef get_numerical_max_sr(mu, sigma, num_trials, n_iter):"""Compute the expected maximum Sharpe ratio (Numerically)"""max_sr, count = [], 0while count < n_iter:count += 1series = np.random.normal(mu, sigma, num_trials)max_sr.append(max(series))return np.mean(max_sr), np.std(max_sr)def simulate(mu, sigma, num_trials, n_iter):"""Get analytical and numerical solutions"""expected_max_sr = get_analytical_max_sr(mu, sigma, num_trials)mean_max_sr, stdmean_max_sr = get_numerical_max_sr(mu, sigma, num_trials, n_iter)return expected_max_sr, mean_max_sr, stdmean_max_srdef main():n_iter, sigma, output, count = 1e4, 1, [], 0for i, prod_ in enumerate(product(np.linspace(-100, 100, 101), range(10, 1001, 10)), 1):if i % 10 == 0:print(i, end=' ', flush=True)mu, num_trials = prod_[0], prod_[1]expected_max_sr, mean_max_sr, std_max_sr = simulate(mu, sigma, num_trials, n_iter)err = expected_max_sr - mean_max_sroutput.append([mu, sigma, num_trials, n_iter,expected_max_sr, mean_max_sr,std_max_sr, err])output = pd.DataFrame(output,columns=['mu', 'sigma', 'num_trials', 'n_iter','expected_max_sr', 'mean_max_sr','std_max_sr', 'err'])print("info:")print(output.info())print("head:")print(output.head())output.to_csv('08_DSR.csv')print("DSR.csv saved")if __name__ == '__main__':main()

跑了很久,来之不易的结果。

http://www.dtcms.com/a/449395.html

相关文章:

  • 滨州企业网站建设WordPress的数据库在哪
  • K230基础-颜色识别
  • git 中常用的命令
  • 网络屏蔽工具,强制软件断网
  • 面试经典150题[049]:合并区间(LeetCode 56)
  • 取名字网站如何做wordpress程序员主题
  • 第7章 n步时序差分 n步时序差分预测
  • 【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
  • 网上服务平台官网入口潍坊百度搜索优化
  • 直播网站怎么做啊如何做php分页网站
  • 【IDE】Linux下使用openocd烧录bin文件
  • 【剑斩OFFER】算法的暴力美学——将 x 减到零的最小操作数
  • Docker(四)—— 使用 Docker 搭建 Nginx 并实现 HTTPS 访问
  • 浏览器中的隐藏IDE: Elements (元素) 面板
  • 【JVM】实战篇(一)
  • 住房城市建设部门户网站一件代发48个货源网站
  • 宣武深圳网站建设公司下关网站建设
  • 电商的网站有几个如何做高校的网站版面设计
  • 蚁群算法解决TSP问题
  • 数据库丢失但没备份过?救星:二进制日志
  • 【C++实战(74)】深入C++安全编程:密码学实战之旅
  • inbound 概念及题目
  • UNet改进(43):SaFA-MS-UNet如何提升图像分割精度?
  • 网站建设中的智能元素凡科建站代理商登录
  • Elasticsearch 之分页查询
  • apache hop 不能处理clickhouse 数组格式怎么办?
  • 网站建设 网站设计php语言网站开发公司北京
  • 代码审计
  • 制作网站需要钱吗天津网址
  • cursor使用之没有正常的编辑器中的运行箭头