Da ich der Meinung bin, dass die zum Erstellen des Modells verwendeten Daten eine Stichprobe von Ereignissen waren, die in der Vergangenheit aufgetreten sein könnten, war es auch möglich, dass die einzige Stichprobe, die in der Vergangenheit auftrat, ein leicht verschwommenes Ereignis war. Dinge, die Sie interessieren möchten. Wenn Sie sagen "Denken Sie daran, dass die Probe ein wenig unscharf wird" = "Fügen Sie der sichtbaren Probe Rauschen hinzu", können Sie damit die Robustheit (Abhängigkeit von Daten) Ihres Modells überprüfen. Ich dachte, es könnte sein und schuf es
Grob gesagt Dies ist nicht in Testdaten und Trainingsdaten unterteilt! !! Ich habe ein Modell namens erstellt, und in Wirklichkeit können die Daten leicht abweichen. Wie stark sich die Genauigkeit des Modells zu diesem Zeitpunkt verschlechtert Das Motiv war, dass ich das Phänomen bestätigen wollte
Wenn das Modell einfach und das Rauschen einfach ist, denke ich, dass die Verschlechterung der Vorhersagegenauigkeit unter Verwendung mathematischer Formeln berechnet werden kann, aber wenn es auf Simulation basiert, kann es möglich sein, mit verschiedenen Modellen umzugehen, Rauschen, das weder iid noch Normalverteilung ist. Ich weiß es nicht
Import etc.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# import statsmodels.api as sm
# from statsmodels.tsa.arima_model import ARIMA
import pandas_datareader.data as web
import yfinance as yf
from numpy.random import *
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import seaborn as sns
import warnings
import sys
warnings.filterwarnings('ignore')
plt.style.use('seaborn-darkgrid')
plt.rcParams['axes.xmargin'] = 0.01
plt.rcParams['axes.ymargin'] = 0.01
Holen Sie sich'USDJPY' von yfinance und erstellen Sie wöchentliche Renditen
ReadDF = yf.download('JPY=X', start="1995-01-01", end="2019-10-30")
ReadDF.index = pd.to_datetime(ReadDF.index)
IndexValueReadDF_rsmpl = ReadDF.resample('W').last()['Adj Close']
ReadDF = IndexValueReadDF_rsmpl / IndexValueReadDF_rsmpl.shift(1) - 1
Erklärende Variable (X), erklärte Variable (y) Datenerstellung
ret_df = pd.DataFrame()
ret_df[mkt] = ReadDF
test = pd.DataFrame(ret_df[mkt])
for i in range(1, 5):
test['i_' + str(i)] = test['USDJPY'].shift(1 * i)
test = test.dropna(axis=0)
X = test.ix[:, 1:]
y = test[mkt]
Erstellen eines Modells (tatsächliche Stichprobe und Rauschen)
m_ = 3 # 0.Ein Haken, der die dreifache Volatilität hat
output_degree = {}
for k in range(1, 7):
polynomial_features = PolynomialFeatures(degree=k, include_bias=False)
linear_regression = LinearRegression()
pipeline = Pipeline([("polynomial_features", polynomial_features),
("linear_regression", linear_regression)])
pipeline.fit(X, y)
k_sample = pd.DataFrame()
for l in range(0, 300):
#Normale Zufallszahlengenerierung
eps_0 = pd.DataFrame(randn(X.shape[0], X.shape[1]))
eps_1 = eps_0.apply(lambda x: x * list(X.std()), axis=1)
eps_1.columns = X.columns
eps_1.index = X.index
#Zu den Originaldaten hinzufügen
X_r = X + m_/10 * eps_1
signal = pd.DataFrame()
signal[mkt] = np.sign(pd.DataFrame(pipeline.predict(X_r)))[0]
signal.index = y.index
k_sample['s_' + str(l)] = (pd.DataFrame(signal[mkt]) * pd.DataFrame(y)).ix[:, 0]
signal_IS = pd.DataFrame()
# signal_IS[mkt] = np.sign(pd.DataFrame(pipeline.predict(X.ix[:, 0][:, np.newaxis])))[0]
signal_IS[mkt] = np.sign(pd.DataFrame(pipeline.predict(X)))[0]
signal_IS.index = y.index
k_sample['IS'] = (pd.DataFrame(signal_IS[mkt])*pd.DataFrame(y)).ix[:, 0]
k_sample[mkt] = pd.DataFrame(y).ix[:, 0]
output_degree['degree_' + str(k)] = k_sample
Ausgabehistogramm (jeder Grad N)
Performance_sim = pd.DataFrame()
fig = plt.figure(figsize=(15, 7), dpi=80)
for k in range(1, 7):
ax = fig.add_subplot(2, 3, k)
for_stats = output_degree['degree_' + str(k)]
Performance = pd.DataFrame(for_stats.mean()*50 / (for_stats.std()*np.sqrt(50))).T
Performance_tmp = Performance.ix[:, 1:].T
ax.hist(Performance.drop(['IS', mkt], axis=1), bins=30, color="dodgerblue", alpha=0.8)
ax.axvline(x=float(Performance.drop(['IS', mkt], axis=1).mean(axis=1)), color="b")
ax.axvline(x=float(Performance['IS']), color="tomato")
ax.axvline(x=float(Performance[mkt]), color="gray")
ax.set_ylim([0, 40])
ax.set_xlim([-0.3, 2.5])
ax.set_title('degree-N polynomial: ' + str(m_))
fig.show()
Es ist ein natürliches Ergebnis, wenn es sich um einfache Daten handelt, aber es scheint für die Überprüfung nützlich zu sein, wenn ich ein Modell erstellt habe
Oben ist die Komplexität des Modells auf Grad = k von PolynomialFeatures festgelegt, aber der Grad = 3, das Modell ist RandomForestRegressor und die Komplexität des Modells ist max_depth = k.
pipeline = Pipeline([("polynomial_features", polynomial_features),
("rf_regression", RandomForestRegressor(max_depth=k))])
Wiederum wird in dem Beispiel, in dem die Komplexität des Modells auf Grad = k von PolynomialFeatures festgelegt ist, eine erklärende Variable hinzugefügt, und die erklärende Variable wird im Regressionsteil in dem Sinne verwendet, dass sie systematisch den Wunsch steuert, ein Modell zu erstellen. Eine Auswahl treffen
pipeline = Pipeline([("polynomial_features", polynomial_features),
("linear_regression", LassoCV(cv=5))])
Recommended Posts