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.
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.
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
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.))
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) ** (log --log) ** (konvertierter y-Wert)
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.
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.
--statsmodels Dokumentation http://statsmodels.sourceforge.net/stable/glm.html
Einführung in die Statistik (Institut für Statistik, Fakultät für Geisteswissenschaften, Universität Tokio) http://www.utp.or.jp/bd/978-4-13-042065-5.html
Einführung in die statistische Modellierung zur Datenanalyse (Kubo, Iwanami Shoten) https://www.iwanami.co.jp/cgi-bin/isearch?isbn=ISBN978-4-00-006973-1
Recommended Posts