Anonymous
Кривая на тепловой карте Seaborn
Сообщение
Anonymous » 24 дек 2024, 20:29
Я пытаюсь воспроизвести этот график:
Вот мой код:
Код: Выделить всё
#trials_per_sim_list = np.logspace(1, 6, 1000).astype(int)
trials_per_sim_list = np.logspace(1, 5, 100).astype(int)
trials_per_sim_list.sort()
sharpe_ratio_theoretical = pd.Series({num_trials:get_expected_max_SR(num_trials, mean_SR = 0, std_SR = 1)
for num_trials in trials_per_sim_list})
sharpe_ratio_theoretical = pd.DataFrame(sharpe_ratio_theoretical, columns = ['max{SR}'])
sharpe_ratio_theoretical.index.names = ['num_trials']
sharpe_ratio_sims = get_max_SR_distribution(
#num_sims = 1e3,
num_sims = 100,
trials_per_sim_list = trials_per_sim_list,
mean_SR = 0.0,
std_SR = 1.0)
heatmap_df = sharpe_ratio_sims.copy()
heatmap_df['count'] = 1
heatmap_df['max{SR}'] = heatmap_df['max{SR}'].round(3)
heatmap_df = heatmap_df.groupby(['num_trials', 'max{SR}']).count().reset_index()
heatmap_df = heatmap_df.pivot(index = 'max{SR}', columns = 'num_trials',
values = 'count')
heatmap_df = heatmap_df.fillna(0)
heatmap_df = heatmap_df.sort_index(ascending = False)
fig, ax = plt.subplots()
sns.heatmap(heatmap_df, cmap = 'Blues', ax = ax)
sns.lineplot(x = sharpe_ratio_theoretical.index,
y = sharpe_ratio_theoretical['max{SR}'],
linestyle = 'dashed', ax = ax)
plt.show()
Я думаю, проблема в том, что тепловая карта отображается в логарифмическом масштабе, потому что я ввел логарифмический масштаб, а мой линейный график не отображается на сохраненных значениях. На данный момент мой результат таков:
Если вы хотите увидеть код, который я использую для функций, перейдите сюда:
https://github.com/charlesrambo/ML_for_ ... apter_8.py
Изменить: Пока ответа нет. Если сбивает с толку часть, связанная с количественными финансами, вот более простой пример. Я хотел бы добавить в свой график график y = 1/sqrt{x}. Вот код:
Код: Выделить всё
import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import seaborn as sns
vals = np.logspace(1, 6, 100).astype(int)
theoretical_values = pd.Series(1/np.sqrt(vals), index = vals)
exprimental_values = pd.DataFrame(columns = ['num', 'std'])
num_runs = 1000
trials_per_run = 10
for n in vals:
for _ in range(num_runs):
dist = stats.norm.rvs(size = (trials_per_run, n)).mean(axis = 1)
temp = pd.DataFrame([[n, np.std(dist, ddof = 1)]],
columns = ['num', 'std'])
exprimental_values = pd.concat([exprimental_values, temp], axis = 0,
ignore_index = True)
heatmap_df = exprimental_values.copy()
heatmap_df['count'] = 1
heatmap_df['std'] = heatmap_df['std'].round(3)
heatmap_df = heatmap_df.groupby(['num', 'std'])['count'].sum().reset_index()
heatmap_df = heatmap_df.pivot(index = 'std', columns = 'num', values = 'count')
heatmap_df = heatmap_df.fillna(0)
heatmap_df = heatmap_df.div(heatmap_df.sum(axis = 1), axis = 0)
heatmap_df = heatmap_df.sort_index(ascending = False)
fig, ax = plt.subplots()
sns.heatmap(heatmap_df, cmap = 'Blues', ax = ax)
sns.lineplot(x = theoretical_values.index, y = theoretical_values, ax = ax)
plt.show()
Я получаю это:
Подробнее здесь:
https://stackoverflow.com/questions/793 ... ap-seaborn
1735061370
Anonymous
Я пытаюсь воспроизвести этот график: [img]https://i.sstatic.net/UmcdRHpE.png[/img] Вот мой код: [code]#trials_per_sim_list = np.logspace(1, 6, 1000).astype(int) trials_per_sim_list = np.logspace(1, 5, 100).astype(int) trials_per_sim_list.sort() sharpe_ratio_theoretical = pd.Series({num_trials:get_expected_max_SR(num_trials, mean_SR = 0, std_SR = 1) for num_trials in trials_per_sim_list}) sharpe_ratio_theoretical = pd.DataFrame(sharpe_ratio_theoretical, columns = ['max{SR}']) sharpe_ratio_theoretical.index.names = ['num_trials'] sharpe_ratio_sims = get_max_SR_distribution( #num_sims = 1e3, num_sims = 100, trials_per_sim_list = trials_per_sim_list, mean_SR = 0.0, std_SR = 1.0) heatmap_df = sharpe_ratio_sims.copy() heatmap_df['count'] = 1 heatmap_df['max{SR}'] = heatmap_df['max{SR}'].round(3) heatmap_df = heatmap_df.groupby(['num_trials', 'max{SR}']).count().reset_index() heatmap_df = heatmap_df.pivot(index = 'max{SR}', columns = 'num_trials', values = 'count') heatmap_df = heatmap_df.fillna(0) heatmap_df = heatmap_df.sort_index(ascending = False) fig, ax = plt.subplots() sns.heatmap(heatmap_df, cmap = 'Blues', ax = ax) sns.lineplot(x = sharpe_ratio_theoretical.index, y = sharpe_ratio_theoretical['max{SR}'], linestyle = 'dashed', ax = ax) plt.show() [/code] Я думаю, проблема в том, что тепловая карта отображается в логарифмическом масштабе, потому что я ввел логарифмический масштаб, а мой линейный график не отображается на сохраненных значениях. На данный момент мой результат таков: [img]https://i.sstatic.net/Hl3GhVsO.png[/img] Если вы хотите увидеть код, который я использую для функций, перейдите сюда: https://github.com/charlesrambo/ML_for_asset_managers/blob/main/Chapter_8.py [b]Изменить:[/b] Пока ответа нет. Если сбивает с толку часть, связанная с количественными финансами, вот более простой пример. Я хотел бы добавить в свой график график y = 1/sqrt{x}. Вот код: [code]import numpy as np import pandas as pd import scipy.stats as stats import matplotlib.pyplot as plt import seaborn as sns vals = np.logspace(1, 6, 100).astype(int) theoretical_values = pd.Series(1/np.sqrt(vals), index = vals) exprimental_values = pd.DataFrame(columns = ['num', 'std']) num_runs = 1000 trials_per_run = 10 for n in vals: for _ in range(num_runs): dist = stats.norm.rvs(size = (trials_per_run, n)).mean(axis = 1) temp = pd.DataFrame([[n, np.std(dist, ddof = 1)]], columns = ['num', 'std']) exprimental_values = pd.concat([exprimental_values, temp], axis = 0, ignore_index = True) heatmap_df = exprimental_values.copy() heatmap_df['count'] = 1 heatmap_df['std'] = heatmap_df['std'].round(3) heatmap_df = heatmap_df.groupby(['num', 'std'])['count'].sum().reset_index() heatmap_df = heatmap_df.pivot(index = 'std', columns = 'num', values = 'count') heatmap_df = heatmap_df.fillna(0) heatmap_df = heatmap_df.div(heatmap_df.sum(axis = 1), axis = 0) heatmap_df = heatmap_df.sort_index(ascending = False) fig, ax = plt.subplots() sns.heatmap(heatmap_df, cmap = 'Blues', ax = ax) sns.lineplot(x = theoretical_values.index, y = theoretical_values, ax = ax) plt.show() [/code] Я получаю это: [img]https://i.sstatic.net/Qs8Atpon.png[/img] Подробнее здесь: [url]https://stackoverflow.com/questions/79304262/curve-on-top-of-heatmap-seaborn[/url]