Оценка плотности ядра, выбор пропускной способности посредством перекрестной проверкиPython

Программы на Python
Anonymous
Оценка плотности ядра, выбор пропускной способности посредством перекрестной проверки

Сообщение Anonymous »

Я пытаюсь использовать оценку плотности ядра для непараметрического сглаживания подразумеваемой плотности опциона. Форма распределения сильно зависит от полосы пропускания. В своих исследовательских целях я хотел бы использовать перекрестную проверку (у меня были проблемы с паразитными колебаниями при использовании глобальных полос пропускания) в диапазоне полос пропускания.
Я считаю, что у меня есть рабочая модель, однако я заметил, что поиск по сетке всегда выбирает самую большую пропускную способность из моего массива кандидатов на пропускную способность, что явно неверно. Я испробовал ряд специальных техник, но безрезультатно. Вот мой код.
Постройте график с использованием пропускной способности №1
Постройте график с использованием пропускной способности №2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV

##Option data hard coded.
strike_prices = np.array([20000, 25000, 26000, 28000, 30000, 31000, 32000, 33000, 34000, 35000, 36000,
37000, 38000, 39000, 40000, 41000, 42000, 44000, 45000, 46000, 48000, 50000,
52000, 54000, 55000, 56000, 58000, 60000, 65000, 70000, 75000, 80000, 85000])

option_prices=np.array([
17703, 12679.6, 11684.7, 9694.98, 7705.26, 6710.4, 5724.03, 4749.47,
3774.91, 2814.05, 1928.94, 1064.75, 489.491, 188.266, 85.9672, 63.398,
40.8287, 22.4558, 13.2693, 9.41329, 9.41329, 9.41329, 9.41329, 9.41329,
9.41329, 9.41329, 9.41329, 9.41329, 9.41329, 9.41329, 9.41329, 9.41329, 9.41329])

##Obtaining option_implied density by numerically differentiating twice with respect to strike
first_derivative=np.gradient(option_prices,strike_prices)
option_pdf=np.gradient(first_derivative,strike_prices)
option_pdf = np.clip(option_pdf, a_min=0, a_max=None) #Tiny negative values are shifted to be zero.

#plotting prelimary distribution
plt.figure(figsize=(10, 6))
plt.scatter(strike_prices, option_pdf, color='blue', s=100, alpha=0.6, edgecolor='k', label='Option PDF')
plt.xlabel("Strike Prices", fontsize=14)
plt.ylabel("Probability", fontsize=14)
plt.title("Option implied density", fontsize=16)

########################################Kernel Density Help###############################
###Trying to smooth this distribution using kernel density estimation, with bandwidth selection done via Cross validation.

x = strike_prices.reshape(-1,1) # x values must be 2D for sklearn
bandwidths = np.linspace(10, 1000, 250) # We explore bandwiths from 10 to 1000.
#bandwidths = np.linspace(10, 5000, 250) # We explore bandwiths from 10 to 5000.

# Perform cross-validation to select the best bandwidth
grid = GridSearchCV(KernelDensity(kernel="gaussian"), {'bandwidth': bandwidths}, cv=5)
grid.fit(x, sample_weight=option_pdf) #Since we already have the distribution,I weigh each observation by its probability of occuring.

best_bandwidth = grid.best_params_['bandwidth']
print(f"Optimal bandwidth: {best_bandwidth}")

kde = KernelDensity(bandwidth=best_bandwidth)
kde.fit(x, sample_weight=option_pdf)

x_fine = np.linspace(strike_prices[0], strike_prices[-1], 1000).reshape(-1,1) # Creates a 2D array of more denser x values

# Evaluate the KDE on the finer grid
log_density = kde.score_samples(x_fine)
smooth_pdf = np.exp(log_density)

plt.figure(figsize=(10, 6))
plt.plot(x_fine, smooth_pdf, label='KDE Smoothed PDF', color='green', lw=2)
plt.scatter(strike_prices, option_pdf, color='blue', s=100, alpha=0.6, edgecolor='k', label='Raw Data')

# Display the best bandwidth in the title (formatted)
plt.title(f"KDE with Best Bandwidth {best_bandwidth:.2f}", fontsize=16)
plt.xlabel("Strike Prices", fontsize=14)
plt.ylabel("Probability", fontsize=14)
plt.legend()


Подробнее здесь: https://stackoverflow.com/questions/790 ... validation

Вернуться в «Python»