1. 程式人生 > >Python金融系列第二篇:簡單線性迴歸

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 每日回報和亞馬遜股票每日回報。他們的線性關係如下:

Y=α+βX+εY = \alpha + \beta * X + \varepsilon

其中,α\alpha 稱為截距,β\beta 稱為斜率。更一般的來說,如果一個散點圖可以表示成 (x1,y1),(x2,y2),(x3,y3)...(xn,yn){ (x_1,y_1),(x_2, y_2),(x_3,y_3)...(x_n,y_n) },那麼截距跟斜率可以如下計算:

β=i=1n(xxˉ)(yyˉ)i=1n(xxˉ)2\beta = \frac{\sum_{i=1}^{n}(x-\bar{x})(y-\bar{y})}{\sum_{i=1}^{n}(x-\bar{x})^2}

α=yˉβ^xˉ\alpha = \bar{y}-\hat{\beta}\bar{x}

其中,xˉ\bar{x} 是 X 的均值,yˉ\bar{y} 是 Y 的均值

在 Python 中,我們不需要手動執行上述計算,因為我們可以利用很多的開源包。但是如何理解 β\beta 的過程還是非常重要的,因為深入理解 β\beta 可以幫助我們很好的理解現代投資組合理論和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=i=1n(yiyi^)2=i=1nϵi2^SSE=\sum_{i=1}^{n}(y_i-\hat{y_i})^2=\sum_{i=1}^{n}\hat{\epsilon _{i} ^{2} }

如果線性模型完全符合樣本,那麼 SSE 的值將是零。我們在這裡使用平方誤差的原因是,如果我們簡單的將他們相加,則正負誤差將互相抵消。對樣本的另一種測量稱為總平方和,或者 SS,它的公式如下:

SS=i=1n(yiyiˉ)2SS=\sum_{i=1}^{n}(y_i-\bar{y_i})^2

如果你熟悉方差,那麼我們可以看到 SS 除以樣本數 n 就是樣本方差。從 SSE 和 SS,我們可以計算確定係數,或者稱為 r 平方。r 平方是指由 X 和 Y 之間的線性關係的變化比例,它的計算公式如下:

r2=1SSESS=1i=1n(yiyi^)2i=1n(yiyiˉ)2r^2=1-\frac{SSE}{SS}=1-\frac{\sum_{i=1}^{n}(y_i-\hat{y_i})^2}{\sum_{i=1}^{n}(y_i-\bar{y_i})^2}

相關推薦

Python金融系列第二簡單線性迴歸

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第三篇:多元線性迴歸和殘差分析 第四篇:現代投資組合理論 第五篇:市場風險 第六篇:Fama-French 多因子模型 介紹 在金融和經濟領域,大多數模型都是

Python金融系列第五多元線性迴歸和殘差分析

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第一篇:計算股票回報率,均值和方差 第二篇:簡單線性迴歸 第三篇:隨機變數和分佈 第四篇:置信區間和假設檢驗 第五篇:多元線性迴歸和殘差分析 第六篇:現代投資組合

Python 語言學習 第二數據類型(字符串)

拼接 查找字符 保留 upper gis 原始的 一次 \n 處的 字符串是一個有序的字符的不可變序列,用於存儲基於文本的信息。字符串所包含的字符存在從左至右的位置順序,不可以在原處(in-place)修改。Python沒有C語言的字符和字符串之分,只有字符串。從嚴格意義上

EnjoyingSoft之Mule ESB基礎系列第二Mule ESB基本概念

目錄 1. 使用Anypoint Studio開發 2. Mule ESB Application Structure - Mule ESB應用程式結構 3. Mule ESB Application整體構造 4. Mule ESB構造元素 - Flow 5. Mule ESB構造元素

python 學習筆記 第二python如何連線mysql資料庫

         任何一個程式都必然用到資料庫,不然資料沒法處理,之前我只是把python的開發環境部署了一下,但是隻是獨立的,沒法連線到資料庫,今天學習了一下python的步驟 連線資料庫要首先映入模組pymysql;(以一個簡短的查詢來演示一下資料庫的連線) 1.下載地

python爬蟲入門---第二獲取2019年中國大學排名

time 中國 form htm sts odin 代碼 網站 stat 我們需要爬取的網站:最好大學網 我們需要爬取的內容即為該網頁中的表格部分: 該部分的html關鍵代碼為: 其中整個表的標簽為<tbody>標簽,每行的標簽為<tr&

chromium瀏覽器開發系列第二如何編譯最新chromium原始碼

說一下為什麼這麼晚才發第二篇,上週和這周department的工作太多了,晚上都是十點半從公司出發,回家以後實在沒有多餘的精力去摸鍵盤了。所以請大家包涵! 上期回顧: chromium原始碼下載: 找個靠譜的vpn(我試過了,網上說的不用vpn拿程式碼的都不靠譜)

江西偉人系列第二愛國詩人(文天祥)

民族 nbsp 文學 class 技術分享 圖片 文學家 src ima 文天祥,南宋末政治家、文學家,愛國詩人,抗元名臣、民族英雄,與陸秀夫、張世傑並稱為“宋末三傑”。18歲獲廬陵鄉校考試第一名,20歲中選吉州貢士,在殿試中,他被主考官譽為&ldq

機器學習入坑指南(三)簡單線性迴歸

學習了「資料預處理」之後,讓我們一起來實現第一個預測模型——簡單線性迴歸模型。 一、理解原理 簡單線性迴歸是我們接觸最早,最常見的統計學分析模型之一。 假定自變數 xxx與因變數 yyy 線性相關,我們可以根據一系列已知的 (x,y)(x,y)(x,y) 資料

機器學習(2)簡單線性迴歸 | 一元迴歸 | 損失計算 | MSE

前文再續書接上一回,機器學習的主要目的,是根據特徵進行預測。預測到的資訊,叫標籤。 從特徵映射出標籤的諸多演算法中,有一個簡單的演算法,叫簡單線性迴歸。本文介紹簡單線性迴歸的概念。 (1)什麼是簡單線性迴歸 “迴歸(regression)”是什麼?如之前所講,預測模型可區分為“分類器”跟“迴歸器”,迴歸器,就

Python金融系列第六現代投資組合理論

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第一篇:計算股票回報率,均值和方差 第二篇:簡單線性迴歸 第三篇:隨機變數和分佈 第四篇:置信區間和假設檢驗 第五篇:多元線性迴歸和殘差分析 第六篇:現代投資組合

Python金融系列第八Fama-French 多因子模型

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第一篇:計算股票回報率,均值和方差 第二篇:簡單線性迴歸 第三篇:隨機變數和分佈 第四篇:置信區間和假設檢驗 第五篇:多元線性迴歸和殘差分析 第六篇:現代投資組合

Python金融系列第七市場風險

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第一篇:計算股票回報率,均值和方差 第二篇:簡單線性迴歸 第三篇:隨機變數和分佈 第四篇:置信區間和假設檢驗 第五篇:多元線性迴歸和殘差分析 第六篇:現代投資組合

Python金融系列第四置信區間和假設檢驗

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第五篇:多元線性迴歸和殘差分析 第六篇:現代投資組合理論 第七篇:市場風險 第八篇:Fama-French 多因子模型 介紹 在上一章中,我們討論了隨機變

RabbitMQ第二java簡單的實現RabbitMQ

ech pre cer wait clas comm amqp cti 一次 前言:在這裏我將用java來簡單的實現rabbitMQ。下面我們帶著下面問題來一步步的了解和學習rabbitMQ。 1:如果消費者連接中斷,這期間我們應該怎麽辦 2:如何做到負載均衡 3:如何有效

python開發(第二初始python

登陸 文件 windows == del pwd keyword 入門 用c語言實現 erPython的種類: Cpython python的官方版本,使用C語言實現,使用最為廣泛,Cpython實現會將源文件()(py文件)轉換成字節碼文件(pyc文件)然後運行再p

史上最簡單的SpringCloud教程 | 第二 服務消費者(rest+ribbon)

image tree 開啟 then rom cat learn 替代 官網 最新Finchley版本:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/或者http://blog.csdn.n

第二Python安裝及環境變量的操作

系統變量 執行 第二篇 解釋 參數 配置 環境 配置環境 usr 1.配置環境變量方法在計算機-屬性-高級系統設置-高級-環境變量-系統變量-path中追加Python軟件包的路徑補充:各個變量值是用;分隔的 2.環境變量配置後,在cmd中可直接輸入python來運行Pyt

小白第二jQuery外掛的使用和簡單介紹

嘿嘿,小白又來了。今天我們來學習jQuery外掛的簡單使用。 要會使用jQuery外掛,首先我們需要了解什麼是 json ? 1.JSON是JavaScript Object Notation的簡寫,它是一種JavaScript Object Notation的簡寫,它是一種輕

JVM基礎系列教程|第二Java記憶體模型

推薦視訊連結 所有的Java開發人員可能會遇到這樣的困惑?我該為堆記憶體設定多大空間呢?OutOfMemoryError的異常到底涉及到執行時資料的哪塊區域?該怎麼解決呢?其實如果你經常解決伺服器效能問題,那麼這些問題就會變的非常常見,瞭解JVM記憶體也是為了