[PYTHON] Ich habe versucht, GLM (Generalized Linear Model) für Aktienkursdaten zu verwenden

Einführung

Wenn wir die Beziehung zwischen den beiden Aktienkursdaten betrachten, beginnen wir die Analyse im Allgemeinen unter der Annahme, dass die logarithmischen Gewinnquoten der beiden eine Normalverteilung haben. Bei Betrachtung des tatsächlichen Aktienkurses ist es jedoch schwierig, eine saubere Normalverteilung zu erkennen. Daher ist es erforderlich, die statistischen Ausgabewerte bei der Durchführung einer Regressionsanalyse unter Verwendung eines linearen Modells sorgfältig zu berücksichtigen.

Es gibt GLM (= Generalized Linear Model) als Modell, das Beziehungen behandelt, die keine Normalverteilung haben. Um dies anzuwenden, ist es jedoch erforderlich, das Konzept der statistischen Modellierung zu erlernen, und es sind einige technische Lücken erforderlich. Ich fühle es. Da es jedoch von Python ** statsmodels ** unterstützt wird, habe ich beschlossen, es in "trial" zu verwenden, ohne zu viel über die Strenge nachzudenken.

Zunächst haben wir automobilbezogene Aktien (3 Unternehmen) aus dem ersten Abschnitt der Tokioter Börse als Analyseziele ausgewählt. Das Streudiagramm des logarithmischen Randes von 3 Kombinationen von 2 Unternehmen, ausgewählt aus 3 Unternehmen, ist in der folgenden Abbildung dargestellt.

scatter01.png

Es kann bestätigt werden, dass alle drei eine nicht so starke (schwache) positive Korrelation aufweisen. Wir haben uns entschlossen, die mittleren Daten (stock2 vs. stock3) aus diesen drei zu nehmen und eine Regressionsanalyse durchzuführen. Stock2 ist übrigens eine Aktie mit dem Lagercode 7203 und stock3 ist eine Aktie mit dem Lagercode 7267.

Anwenden eines linearen Modells

Zunächst wurde eine Regressionsanalyse unter Verwendung des linearen Modells durchgeführt. Der Code ist bis zum Lesen der Daten und der Regressionsanalyse des linearen Modells wie folgt.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import statsmodels.api as sm

    
def my_tof(s):
	f1 = float(s.replace(',', ''))
	return f1

# pandas read_csv()
my_colmn = ['Date', 'Open', 'High', 'Low', 'Close', 'Diff', 'Volume', 'cH', 'cI', 'cJ', 'cK', 'cL', 'cM', 'cN', 'cO']

index = pd.date_range(start='2014/1/1', end='2014/12/31', freq='B')
stock_raw = pd.DataFrame(index=index)
mydf = pd.DataFrame(index=index)

stock1 = pd.read_csv('./x7201-2014.csv', index_col=0, parse_dates=True, skiprows=1, names=my_colmn, header=None)
stock_raw['stock1'] = stock1[::-1].loc[:, 'Close']
stock2 = pd.read_csv('./x7203-2014.csv', index_col=0, parse_dates=True, skiprows=1, names=my_colmn, header=None)
stock_raw['stock2'] = stock2[::-1].loc[:, 'Close']
stock3 = pd.read_csv('./x7267-2014.csv', index_col=0, parse_dates=True, skiprows=1, names=my_colmn, header=None)
stock_raw['stock3'] = stock3[::-1].loc[:, 'Close']

stock_raw.dropna(inplace=True)
stock_base_label = ['stock1', 'stock2', 'stock3']

for st in stock_base_label:
	st_price = st + '_p'
	st_return = st + '_ret'
	st_log_return = st + '_lgret'
	
	mydf[st_price] = stock_raw[st].apply(my_tof)
	mydf[st_price].fillna(method='ffill', inplace=True)
	mydf[st_return] = mydf[st_price] / mydf[st_price].shift(1)
	mydf[st_log_return] = np.log(mydf[st_return])

# scatter plotting
(Weggelassen)

# apply OLS model 
mydf.dropna(inplace=True)

x1 = mydf['stock2_lgret'].values    # stock2 log-return
x1a = sm.add_constant(x1)
y1 = mydf['stock3_lgret'].values    # stock3 log-return

# OLS (linear model)
md0 = sm.OLS(y1, x1a)
res0 = md0.fit()
print res0.summary()

plt.figure(figsize=(5,4))
plt.scatter(mydf['stock2_lgret'], mydf['stock3_lgret'], c='b', alpha=0.6)
plt.plot(x1, res0.fittedvalues, 'r-', label='Linear Model')
plt.grid(True)

Wie oben wird statsmodels.api.OLS () verwendet. Als Ergebnis wurde das folgende Diagramm erhalten.

Fig. stock2 vs. stock3 (Log Return) Linear Model scatter_md0.png

GLM (Gaussian distribution) Als nächstes wird eine GLM-Regressionsanalyse durchgeführt. Das GLM (generalisiertes lineares Modell) von Statistikmodellen unterstützt die folgenden als verwendbare Wahrscheinlichkeitsverteilungen (als Familie bezeichnet). (Auszug aus dem Dokument)

Families for GLM(Generalized Linear Model)

Family The parent class for one-parameter exponential families. Remark
Binomial Binomial exponential family distribution. Binäre Verteilung
Gamma Gamma exponential family distribution. Gammaverteilung
Gaussian Gaussian exponential family distribution. Gaußsche Verteilung
InverseGaussian InverseGaussian exponential family. Inverse Gaußsche Verteilung
NegativeBinomial Negative Binomial exponential family. Negative Binomialverteilung
Poisson Poisson exponential family. Poisson-Verteilung

Zusätzlich wird für jede Familie die Verknüpfungsfunktion bestimmt, die verwendet werden kann (wird zu einer Kombination). (Auszug aus dem Dokument) Die Verknüpfungsfunktion kann als Option angegeben werden. Wenn sie jedoch nicht angegeben wird, scheint die Standardfunktion verwendet zu werden.

ident log logit probit cloglog pow opow nbinom loglog logc
Gaussian x x x
inv Gaussian x x x
binomial x x x x x x x x x
Poission x x x
neg binomial x x x x
gamma x x x

Zunächst wurde die Berechnung mit der Gaußschen Funktion durchgeführt. Der Code lautet wie folgt.


# apply GLM(Gaussian) model
md1 = sm.GLM(y1, x1a, family=sm.families.Gaussian())    # Gaussian()
res1 = md1.fit()
print res1.summary()

plt.figure(figsize=(5,4))
plt.scatter(mydf['stock2_lgret'], mydf['stock3_lgret'], c='g', alpha=0.6)
plt.plot(x1, res1.fittedvalues, 'r-', label='GLM(Gaussian)')
plt.grid(True)

Fig. stock2 vs. stock3 (GLM(gaussian dist.)) scatter_md1.png

Die von GLM angepasste Linie scheint sich gegenüber der obigen Abbildung überhaupt nicht zu ändern. Vergleichen Sie die Zusammenfassung der Berechnungsergebnisse ().

** OLS Zusammenfassung **

In [71]: print res0.summary()
                            OLS Regression Results
==============================================================================
Dep. Variable:                      y   R-squared:                       0.486
Model:                            OLS   Adj. R-squared:                  0.484
Method:                 Least Squares   F-statistic:                     241.1
Date:                Sun, 26 Jul 2015   Prob (F-statistic):           1.02e-38
Time:                        16:18:16   Log-Likelihood:                 803.92
No. Observations:                 257   AIC:                            -1604.
Df Residuals:                     255   BIC:                            -1597.
Df Model:                           1
Covariance Type:            nonrobust
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const         -0.0013      0.001     -1.930      0.055        -0.003  2.64e-05
x1             0.7523      0.048     15.526      0.000         0.657     0.848
==============================================================================
Omnibus:                       10.243   Durbin-Watson:                   1.997
Prob(Omnibus):                  0.006   Jarque-Bera (JB):               16.017
Skew:                          -0.235   Prob(JB):                     0.000333
Kurtosis:                       4.129   Cond. No.                         73.0
==============================================================================

** GLM (Gaußsche dist.) Zusammenfassung **

In [72]: print res1.summary()

                 Generalized Linear Model Regression Results
==============================================================================
Dep. Variable:                      y   No. Observations:                  257
Model:                            GLM   Df Residuals:                      255
Model Family:                Gaussian   Df Model:                            1
Link Function:               identity   Scale:                0.00011321157031
Method:                          IRLS   Log-Likelihood:                 803.92
Date:                Sun, 26 Jul 2015   Deviance:                     0.028869
Time:                        16:12:11   Pearson chi2:                   0.0289
No. Iterations:                     4
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const         -0.0013      0.001     -1.930      0.054        -0.003  2.02e-05
x1             0.7523      0.048     15.526      0.000         0.657     0.847
==============================================================================

Es ist ersichtlich, dass der Inhalt der beiden Ausgänge sehr unterschiedlich ist.

In OLS werden die numerischen Werte von R-Quadrat, AIC und BIC ausgegeben, in GLM werden diese jedoch nicht ausgegeben, und stattdessen werden Abweichung (Abweichungsgrad), Pearson-Chi2-Statistiken usw. ausgegeben. Für beide wird der numerische Wert der Log-Wahrscheinlichkeit (Log-Wahrscheinlichkeit) ausgegeben.

Aus der Ausgabe von GLM ist ersichtlich, dass die Verbindungsfunktion auf "Identität" (Gleichheitsverbindungsfunktion) gesetzt ist. Da die partiellen Regressionskoeffizienten von OLS und GLM gleich sind (-0,0013, 0,7523), wurde außerdem bestätigt, dass die Ergebnisse (Inhalte) der Regressionsanalyse gleich sind.

GLM (Gamma distribution)

Als nächstes habe ich versucht, GLM unter Verwendung der Gamma-Verteilung als Verteilung zu berechnen. Ich dachte, es sei fraglich, ob die Gammaverteilung die Aktiengewinnrate gut ausdrücken könnte, aber ich habe es versucht, um eine GLM-ähnliche Berechnung durchzuführen.

Das Problem bei der Durchführung der Berechnung besteht darin, dass die logarithmische Aktiengewinnquote einen negativen Wert annimmt, wenn der Aktienkurs fällt, dies jedoch außerhalb des Bereichs der Gammaverteilung liegt. Daher wurde die Berechnung mit der Aktienkursrendite durchgeführt, bevor der Logarithmus als y-Wert verwendet wurde. (Ich kann nicht leugnen, dass ich mich ein wenig gezwungen fühle ...)

# apply GLM(gamma) model

x2 = x1 ; x2a = x1a
y2 = mydf['stock3_ret'].values    # replaced

md2 = sm.GLM(y2, x2a, family=sm.families.Gamma())
res2 = md2.fit()

# print summary and plot fitting curve
print res2.summary()
plt.figure(figsize=(5,4))
plt.scatter(mydf['stock2_lgret'], mydf['stock3_ret'], c='c', alpha=0.6)
plt.plot(x2, res2.fittedvalues, 'r-', label='GLM(Gamma)')
plt.grid(True)

y2_fit_log = np.log(res2.fittedvalues)
plt.figure(figsize=(5,4))
plt.scatter(mydf['stock2_lgret'], mydf['stock3_lgret'], c='c', alpha=0.6)
plt.plot(x2, y2_fit_log, 'r-', label='GLM(Gamma)')

Fig. stock2 vs. stock3 (GLM(gamma dist.)) (log - ident) scatter_md2(log-ident).png ** (log --log) ** (konvertierter y-Wert) scatter_md2(log-log).png

Als Grafik wurde das gleiche Ergebnis erhalten. Schauen wir uns die Zusammenfassung () an.

In [73]: print res2.summary()

                 Generalized Linear Model Regression Results
==============================================================================
Dep. Variable:                      y   No. Observations:                  257
Model:                            GLM   Df Residuals:                      255
Model Family:                   Gamma   Df Model:                            1
Link Function:          inverse_power   Scale:               0.000113369003649
Method:                          IRLS   Log-Likelihood:                 803.72
Date:                Sun, 26 Jul 2015   Deviance:                     0.028956
Time:                        16:12:16   Pearson chi2:                   0.0289
No. Iterations:                     5
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const          1.0013      0.001   1502.765      0.000         1.000     1.003
x1            -0.7491      0.048    -15.470      0.000        -0.844    -0.654
==============================================================================

Durch den Wechsel von GLM (Gauß-Dist.) Zu GLM (Gamma-Dist.) Hat sich der Wert von Log-Likelihood und Deviance geringfügig geändert. Es ist jedoch sicher, dass sich das Modell nicht so stark verändert hat, dass es verbessert werden könnte. Da der y-Wert konvertiert und berechnet wurde, ist der partielle Regressionskoeffizient unterschiedlich.

Vorher und nachher wurde zur Bestätigung der Normalität der Daten ein Histogramm der logarithmischen Rückgabe von Lager2 und Lager3 erstellt. Die Form war wie in der folgenden Abbildung gezeigt.

histogram2.png

Fazit vorerst

In dieser Datenanalyse konnten wir die Verbesserung der Modellgenauigkeit durch Anwendung von GLM nicht bestätigen. Es wird davon ausgegangen, dass dies daran liegt, dass der Aktienkurs derselben Branche (der Zeitraum beträgt ungefähr ein Jahr) nicht kompliziert (nicht linear) war. Es ist jedoch keine schlechte Sache, dass die Anzahl der Tools, mit denen verschiedene Daten analysiert werden können, in Zukunft zunehmen wird. Daher möchte ich mein Verständnis von GLM und anderen fortgeschrittenen Regressionsanalysemethoden vertiefen.

Dieses Mal (Automobilhersteller A Unternehmensbestand vs. B Unternehmensbestand) zeigte seine Kraft nicht, aber es besteht die Möglichkeit, dass es effektiv in einer Kombination mit einer etwas anderen Haarfarbe verwendet werden kann, zum Beispiel (maximale Temperatur vs. Bierherstellerbestand). Werden erwartet.

Verweise

--statsmodels Dokumentation http://statsmodels.sourceforge.net/stable/glm.html

Recommended Posts

Ich habe versucht, GLM (Generalized Linear Model) für Aktienkursdaten zu verwenden
Einführung in die statistische Modellierung für die Datenanalyse Generalized Linear Model (GLM)
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, Firebase für Djangos Cache-Server zu verwenden
Aktienkursprognose mit Deep Learning [Datenerfassung]
Ich habe DBM mit Pylearn 2 unter Verwendung künstlicher Daten ausprobiert
■ Kaggle-Übung für Anfänger - Hausverkaufspreis (ich habe versucht, PyCaret zu verwenden) - von Google Colaboratory
Ich habe versucht, verschiedene Methoden für maschinelles Lernen (Vorhersagemodell) mithilfe von Scicit-Learn zu implementieren
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, ein Beispielmodell von Pytorch mit TorchServe zu hosten
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, EKG-Daten mit der K-Shape-Methode zu gruppieren
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, Daten aus einer Datei mit Node.js zu lesen.
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Das verallgemeinerte lineare Modell (GLM) und das neuronale Netz sind gleich (1)
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, ein Deep-Learning-Modell von TensorFlow mit TensorFlow Serving zu hosten
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Das verallgemeinerte lineare Modell (GLM) und das neuronale Netz sind gleich (2)
Verschiedene Hinweise zur Verwendung von Python für Projekte
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe versucht, scRNA-seq-Daten mithilfe der topologischen Datenanalyse (TDA) zu analysieren.
Einführung in die statistische Modellierung für die Datenanalyse GLM-Modellauswahl
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Aktienkursprognose mit LSTM_1
Ich habe versucht, Magenta / TensorFlow zu verwenden