Python金融系列第二篇:簡單線性迴歸
作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai
第三篇:多元線性迴歸和殘差分析
第四篇:現代投資組合理論
第五篇:市場風險
第六篇:Fama-French 多因子模型
介紹
在金融和經濟領域,大多數模型都是線性模型。從投資組合理論的基礎到現在流行的 Fama-French 資產定價模型,我們可以看到到處都在使用線性迴歸。理解線性迴歸如何工作對理解這些理論是非常重要的。
如果我們持有股票,我們就必須對股票收益與市場回報之間的關係感到好奇。假設我們在今年的第一天購買了亞馬遜股票。為了直接看到這種關係,我們在 y 軸上繪製我們的股票的每日回報,並且在 x 軸上繪製標普 500 的每日回報。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import datetime
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf
spy_table = pdr.get_data_yahoo("SPY")
amzn_table = pdr.get_data_yahoo("AMZN")
spy = spy_table.loc['2017':'2017-6',['Close']]
amzn = amzn_table. loc['2017':'2017-6',['Close']]
#calculate log return
spy_log = np.log(spy.Close).diff().dropna()
amzn_log = np.log(amzn.Close).diff().dropna()
df = pd.concat([spy_log,amzn_log],axis = 1).dropna()
df.columns = ['spy','amzn']
print(df.tail())
程式輸出結果為:
spy amzn
Date
2017 -06-26 0.000658 -0.009771
2017-06-27 -0.008089 -0.017456
2017-06-28 0.008911 0.013777
2017-06-29 -0.008828 -0.014647
2017-06-30 0.001863 -0.008159
我們成功的建立了一個 DataFrame,其中包含亞馬遜股票和標普 500 的每日對數回報,現在讓我們來繪製這個圖:
import matplotlib.pyplot as plt
plt.figure(figsize = (15,10))
plt.scatter(df.spy,df.amzn)
plt.show()
這是一個散點圖,但是我們可以大致看到他們的相關性:通常 SPY 的每日回報越高,亞馬遜股票的回報就越高。這被稱為正相關。我們將在以下內容中介紹它。
斜率和截距
我們想要去模擬這兩種收益之間的關係是非常自然的一件事。直觀來說,我們可以使用直線來對其進行建模,這稱為線性迴歸。為了找到最佳直線,我們很自然的認為資料集中的點和擬合線之間的垂直距離應該是最小的,那麼這些垂直距離就稱為殘差。我們的目標是使殘差平方和儘可能小。此方法稱為普通最小二乘法或者 OLS 方法。我們使用 x 和 y 來表示兩個變數,標普 500 每日回報和亞馬遜股票每日回報。他們的線性關係如下:
其中, 稱為截距, 稱為斜率。更一般的來說,如果一個散點圖可以表示成 ,那麼截距跟斜率可以如下計算:
其中, 是 X 的均值, 是 Y 的均值
在 Python 中,我們不需要手動執行上述計算,因為我們可以利用很多的開源包。但是如何理解 的過程還是非常重要的,因為深入理解 可以幫助我們很好的理解現代投資組合理論和CAPM,這些我們在後面的章節中都會用到。
Python 實現
在 Python 中,我們可以利用一個非常強大的數學模型包,名為 statsmodels 。
import statsmodels.formula.api as sm
model = sm.ols(formula = 'amzn~spy',data = df).fit()
print(model.summary())
程式輸出結果為:
OLS Regression Results
==============================================================================
Dep. Variable: amzn R-squared: 0.149
Model: OLS Adj. R-squared: 0.142
Method: Least Squares F-statistic: 21.43
Date: Sat, 29 Sep 2018 Prob (F-statistic): 9.24e-06
Time: 11:00:34 Log-Likelihood: 403.39
No. Observations: 124 AIC: -802.8
Df Residuals: 122 BIC: -797.1
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 0.0015 0.001 1.782 0.077 -0.000 0.003
spy 0.8699 0.188 4.629 0.000 0.498 1.242
==============================================================================
Omnibus: 24.014 Durbin-Watson: 1.960
Prob(Omnibus): 0.000 Jarque-Bera (JB): 104.250
Skew: -0.472 Prob(JB): 2.30e-23
Kurtosis: 7.392 Cond. No. 222.
==============================================================================
我們使用 statsmodels 中的 OLS() 函式構造了一個簡單的線性迴歸模型。model 例項有非常多的屬性。最常用的是引數,斜率和截距。我們可以通過以下方式訪問他們:
print("parameters: ", model.params)
[out]:
parameters: Intercept 0.001521
spy 0.869893
dtype: float64
print("residual: ", model.resid.tail())
[out]:
residual: Date
2017-06-26 -0.011864
2017-06-27 -0.011940
2017-06-28 0.004505
2017-06-29 -0.008489
2017-06-30 -0.011300
dtype: float64
print("fitted values: ", model.predict())
[out]:
fitted values: [ 6.68050054e-03 8.29306401e-04 4.62741717e-03 -1.35551546e-03
1.52067302e-03 3.97561282e-03 -6.65450265e-04 3.51524155e-03
-1.54977769e-03 3.44096707e-03 -1.70783245e-03 4.71083520e-03
-7.45869239e-04 7.08038453e-03 9.01766774e-03 6.10762024e-04
1.54048450e-04 -3.89092003e-03 1.44419603e-03 1.86467905e-03
2.09377255e-03 7.49617233e-03 -3.58738146e-05 1.55870750e-03
2.65983467e-03 6.66619420e-03 4.94666869e-03 6.24229007e-03
4.98925643e-03 6.05002623e-03 7.79782437e-04 2.89082766e-03
6.68569923e-03 7.47851776e-04 2.10954612e-03 2.62372277e-03
2.87914582e-03 -8.30487212e-04 1.36125978e-02 -3.97472616e-03
2.06810897e-03 -1.07364762e-03 -1.08146394e-03 -9.58279135e-05
2.62316360e-03 4.56361219e-03 1.95971780e-03 -1.81444385e-03
9.01586717e-03 -1.92042314e-04 -3.78456096e-03 5.65977433e-04
-9.72063837e-03 3.56526159e-03 5.91915424e-04 8.88557784e-04
6.27462258e-04 7.82781226e-03 2.33350159e-03 4.28616147e-03
-5.06446730e-04 6.42104156e-06 2.07494597e-03 -1.06905521e-03
3.96264845e-03 6.33459517e-04 2.03831009e-03 4.85090670e-04
-2.29944688e-03 -4.14763216e-03 9.19388548e-03 -1.07917356e-03
-8.01815000e-05 8.57216909e-03 -1.25599671e-03 1.10354583e-02
6.56759032e-03 9.73479825e-04 2.25018748e-03 -3.77238249e-04
3.71015212e-03 1.84866735e-03 4.63464465e-04 2.54141298e-03
4.93873293e-03 1.37552168e-03 7.21768822e-04 3.08144854e-03
-2.58102781e-04 6.58474249e-05 6.31230982e-03 7.23897547e-04
-1.40533454e-02 5.01798209e-03 7.16028672e-03 5.92633377e-03
3.44340518e-03 3.54762800e-03 5.66841594e-03 1.34078999e-03
7.64548981e-04 1.30453252e-03 8.41094284e-03 4.41120996e-03
8.79185196e-04 -1.26469613e-03 3.12869665e-03 1.94896326e-03
1.99397262e-04 1.34195495e-03 5.76398290e-03 4.17276093e-04
-1.54910762e-04 -2.52112272e-03 8.73264647e-03 -4.36583488e-03
1.30587572e-03 1.12672194e-03 2.55891155e-03 2.09290596e-03
-5.51573435e-03 9.27193803e-03 -6.15848801e-03 3.14107759e-03]
現在讓我們來看看我們的擬合線:
紅線是擬合的線性迴歸直線。我們可以看到彙總表中有很多統計結果。現在讓我們談談一些重要的統計引數。
模型意義
平方誤差之和(SSE)用於測量擬合值與實際值之間的差異,具體公式如下:
如果線性模型完全符合樣本,那麼 SSE 的值將是零。我們在這裡使用平方誤差的原因是,如果我們簡單的將他們相加,則正負誤差將互相抵消。對樣本的另一種測量稱為總平方和,或者 SS,它的公式如下:
如果你熟悉方差,那麼我們可以看到 SS 除以樣本數 n 就是樣本方差。從 SSE 和 SS,我們可以計算確定係數,或者稱為 r 平方。r 平方是指由 X 和 Y 之間的線性關係的變化比例,它的計算公式如下: