財務計量 with 開源 gretl | 2021年版教科書

財務計量 開源 gretl | 2021年版

即日~2023年2月28日止



登入7-11賣場

輸入折扣碼:
88881688

本站網友獨享折扣:9 折

2023年 2/1~2/28 運費再享優惠35元

小7可訂書喔…: 7-11 賣場《蹲亞蹲個人書店

好消息!!(2024/05/01)前成立之訂單,運費仍維持35元喔。

常用計量套件

acorr_ljungbox(x[, lags, boxpierce, …])跑 OLS

statsmodels.api

分開應變數、自變數 (常數項要外加)

https://www.statsmodels.org/stable/api.html#statsmodels-api

import statsmodels.api as sm
y = df1
x = df2
# 在 x 這個 pd 中加入一行常數 1
x['const']=1
#fit regression model
model = sm.OLS(y, x).fit()

statsmodels.formula.api

用字串設定迴歸式
應變數、自變數放在一個 dataframe (常數項自動加)

https://www.statsmodels.org/stable/api.html#statsmodels-formula-api

import statsmodels.formula.api as smf
# 設定迴歸方程式:t = b1 + b2*x
# 以字串形式放在 eq 文字變數中
eq = 'y~x'

model1=smf.ols(eq,df)
result1=model1.fit()

# 印出迴歸估計結果
print(result1.summary())

有關時間序列

自我相關函數、偏自我相關函數 acf, pacf

smt: statsmodels.tsa.api

(https://www.statsmodels.org/stable/api.html)

import statsmodels.tsa.api as smt
acf, q, pval = smt.acf(_Y, nlags=20, qstat=True,fft=False)
pacf=smt.acf(_Y,nlags=20)

轉成 dataframe

nlag=20
ts_correl=pd.DataFrame({'LAG':range(1,nlag+1),'acf':acf[1:],'pacf':pacf[1:],'Q':q,'p-val':pval},index=range(1,nlag+1))

有關殘差檢定

ssd: statsmodels.stats.diagnostic

ssd.het_white()
ssd.acorr_ljungbox(model.resid)
ssd.jarque_bera(model.resid])
import statsmodels.stats.diagnostic as <strong>ssd</strong>

# 定義White's test 輸出欄名稱 
rname = ['Test Statistic', 'Test Statistic p-value', 'F-Statistic', 'F-Test p-value']

# 進行 White's test
White = pd.DataFrame(<strong>ssd</strong>.het_white(model.resid,  model.model.exog), index=rname)
White.columns = ['White-Test']
print(White[:2].round(4)) #只印前兩個 row

sms: statsmodels.stats.api

sms.jarque_bera(model.resid)
sms.acorr_ljungbox(x[, lags, boxpierce, …])
sms.breaks_hansen(olsresults)
sms.het_arch(resid[, nlags, autolag, store, ddof])
sms.het_white(resid, exog)
sms.linear_lm(resid, exog[, func])
sms.linear_reset(res[, power, test_type, use_f, …])

有關 pandas 套件的 DataFrame

DataFrame 是 Pandas 套件的一個非常重要的資料結構,常見於各種資料分析方法,特別是時間序列分析方法。若用 pandas_datareader 或 yfinance 抓股市日資料,抓回來的資料,也是存放於 dataframe 的資料結構之中。例如,結合 pandas 和 pandas datareader 套件,抓 yahoo finance 資料,datareader 回傳的就是 DataFrame 的資料 (見以下程式碼)。

我們可以將 dataframe 視為是像 excel 的「表格式資料」,包今有列、欄… 的多維資料集。

定義 dataframe

用 pd.DataFrame(資料, 欄位標題),例如,用 np.random.normal(size=(500,3)) 產生 3欄 500 筆「隨機常態分配」資料,然後分別命名為 time、X、Y 為欄位名稱。

import pandas as pd
df=pd.DataFrame(np.random.normal(size=(500,3)),columns=['time','X','Y'])

取出 df 的部份欄位,不改欄位名

用雙中括號 [[‘欄位名1’,’欄位名1’…]]

df2 = df[['a','b1','b2']]

從另一個 df 取資料,放進另一個 df,並更欄位名

從 data 取出部份欄位資料 data[[‘A1′,’A2’]],放進另一個 df2,並將新欄位名稱重新命名為 r1、r2,語法,注意要用大括號 {} 包覆:

df2= pd.DataFrame({‘r1’: data[‘A1’]), ‘r2’: data[‘A2’]})

df = pd.DataFrame({'r_aapl': ldiff(data['Close']['AAPL']),
                   'r_tsla': ldiff(data['Close']['TSLA'])})

一階差分 .diff()

DataFrame.diff(periods=1, axis=0),例如

# X 是 dataframe
dX = X.diff()

敘述統計 .describe()

會輸出樣本數、平均數、標準差、最大最小值等敘述統計。

DataFrame.describe()

          r_aapl    r_sp500
count  47.000000  47.000000
mean    3.074668   1.113741
std     9.010071   4.976879
min   -20.339557 -13.366772
25%    -2.567104  -0.978388
50%     5.490090   2.022584
75%     9.340332   3.750472
max    19.423344  11.942084

以下會用到另一個 pasdas_DataReader() 套件函數

參數說明如下:

名稱.DataReader(‘股票代碼’, data_source=’資料來源’, start=’開始日字串’, end=’結束日字串’)

股票代碼可以是字串、陣列 (array-like object, 含 listtuple, Series, or DataFrame) 可查:https://gretlcycu.wordpress.com/2013/08/07/yahoo-finance-%e7%9a%84-ticker-symbol/

其它參數 see原始文件:https://pandas-datareader.readthedocs.io/en/latest/readers/yahoo.html

程式範例

import pandas_datareader.data as web
import pandas as pd
# 用字串定義開始、截止日
sStart='2021-12-01'
sEnd='2021-12-31'
df1 = web.DataReader('TSLA', data_source='yahoo', start=sStart, end=sEnd)
df1.head(5)

或者抓多種股價

# 抓多個股票資料
stocks = ['AAPL','TSLA']
df2 = web.DataReader(stocks, data_source='yahoo', start=sStart, end=sEnd)
df2.head(5)

參考網頁

Python # trick 1.1: 小數點後兩位

想要在 python 中顯示數據時,指定數字的小數位數,例如,小數點後兩位,在套件 pandas 中的類別 dataframe 可以使用 .round(N) 來指定;N 為小數點後 N 位。

# !pip install yfinance
import pandas as pd
import yfinance as yf
# --- 讀Tesla 股市資料
TSLA = yf.download("TSLA", interval = "1mo", start="2021-07-01", end="2021-12-31")
# --- 不指定 小數點位數
print(TSLA)
# --- 指定 小數點後 2 位數
print('---> 以下指定 小數點後 2 位數')
print(TSLA.round(2))

在 colab 中,按 ctrl+enter 看執行結果:

執行結果

Python # Code 1.3: 計算係數之 t 值

在跑完 OLS 之後,我們常會抓出係數的標準誤 (standard error),以及計算其對應之 t 值。在 statsmodels 套件中的標準誤函數是 .bse(),它也是向量,其讀取的語法和 .params() 是一樣的。而計算第 i 個迴歸係數的 t 值的公式是:

t_i = {b_i}/{se(b_i)}                                                                                                                           (1.3-1)

其中 se(b_i)b_i 的標準誤。我們可以將 .params() 和 .bse() 此兩個函數配合起來計算係數的 t 值。

跑 OLS 後進行預測

步驟

  1. 先跑迴歸方程式
    C_t = b_1+b_2Y_t
  2. 抓估計係數
  3. 以 Y0 值代入 C_0 = b_1+b_2Y_0 預測 C0

此程式會用到的模組和函數

  • pandas
    • .read_csv(‘檔名’, [指標欄=n])
      用來讀 csv 檔
  • statsmodels.formula.api
    • .ols(eq, df)
      定義 OLS 迴歸和資料來源
    • .ols(eq, df).fit()
      執行 OLS 和回傳結果到 result1
    • .params[n]
      置放 OLS 估計參數的向量,向量指標編號從 0 開始,.params[0] 是常數項
    • .bse[n]
      置放 OLS 估計參數的標準誤之向量,同樣向量指標編號從 0 開始,.bse[0] 是常數項的標準誤
    • .tvalues[n]
      置放 OLS 估計參數的標準誤之 t 值,一樣向量指標編號從 0 開始,.tvalues[0] 是常數項的標準誤
  • print()
    • 這是 Python 的列印輸出函數。這裡的語法先簡要說明:
    • 它可以像以下的範例程式 Code 1.3 的第12、15行,直接將要輸出的字串放在小括號內。
    • 而另一個的語法,如14、16行所示,print(‘%f, %f’ % (x1,x2)),小括號內的第 1 個參數是字串 ‘%f, %f’,% 符號是必要的,後面跟著 f 代表輸出的是「浮點數」格式 (就是有小數點的數);此字串中有兩個 %f,表示後面有兩個以小括號「框住」的數字 x1, x2 會被以「浮點數」格式列印輸出;。print() 還有更多詳細的語法,可參考另外一篇 Python:輸出格式化 print()

程式說明

  • 第2-4行,將 data3-6.csv 資料檔讀進別名為 data 的資料結構
  • 第5行,匯入 statsmodels.formula.api 並命別名為 smf
  • 第7行,定義迴歸模型字串 eq = 'Ct~Yt'
  • 第8行,依迴歸模型和資料執行 OLS ,並將結果回傳到 result1
    (註:此次我們示範也可以不用像 code 1.3 使用 model1,直接將結果像 result1=smf.ols(eq,data).fit() 這樣,回傳到 result1)
  • 第10行,將 result1.params[n] (n = 1, 2) 中的數據,分別放在 b1, b2 當中
  • 第11行,將 result1.tvalues[n] (n = 1, 2) 中的數據,分別放在 stderr1, stderr2 當中
  • 第12、15行,列印註解說明的文字
  • 第13行,依 t 值公式,計算出估計的常數項和係數的 t 值
  • 第14、16行,以 ‘t1=%f, t2=%f" 的格式,輸出常數項和係數的 t 值
  • 第16行,用 result1.tvalues[0] 和 result1.tvalues[1] 取出 statsmodels 所提供的 t 值

Colab Python 程式碼

# Code 1.3: 計算係數之 t 值
import pandas as pd
path='https://github.com/powebe/p4econ/raw/main/'
data=pd.read_csv(path+'data3-6.csv',index_col=0)
import statsmodels.formula.api as smf
# ols: Ct = b1 +b2*Yt
eq = 'Ct~Yt'
result1=smf.ols(eq,data).fit()
# --- 抓係數,將 result1.params[0],result1.params[1] 中的數據,分別放在 b1, b2 當中
b1, b2 = result1.params[0],result1.params[1]
stderr1, stderr2 = result1.bse[0],result1.bse[1]
print('---自行計算係數之 t 值---')
t_b1, t_b2 = b1/stderr1,b2/stderr2
print('t_b1=%f, t_b2=%f'% (t_b1, t_b2))
print('---從 statsmodels 模組抓係數 t 值---')
print('t1=%f, t2=%f' % (result1.tvalues[0],result1.tvalues[1]))

Colab 操作

在用 google 帳號登入 colab 後,可以用 [/檔案/新增筆記本] 來創建 python 環境
將上面的程式碼複製後,用 [ctrl]+[v] 貼上,最後按播放鈕來執行。

Colab 執行結果

如圖最下方所示,我們自行計算的,和從模組抓的 t 值是一樣的。


Python # Code 1.2: OLS 模型之預測

以下介紹如何用程式抓取 OLS 模型所估計的參數,並利用它們來進行預測。先看以下的程式

跑 OLS 後進行預測

步驟

  1. 先跑迴歸方程式
    C_t = b_1+b_2Y_t
  2. 抓估計參數
  3. 以 Y0 值代入 C_0 = b_1+b_2Y_0 預測 C0

此程式會用到的模組和函數

  • pandas
    • .read_csv(‘檔名’, [指標欄=n])
      用來讀 csv 檔
  • statsmodels.formula.api
    • .ols(eq迴歸式字串, df資料結構名)
      定義 OLS 迴歸和資料來源
    • ols(eq, df).fit() 執行 OLS 和回傳結果到 result1
    • result1.params[n]
      置放 OLS 估計參數的向量,向量指標編號從 0 開始,.params[0] 是常數項

程式說明

  • 第2-4行,將 data3-6.csv 資料檔讀進別名為 data 的資料結構
  • 第5行,匯入 statsmodels.formula.api 並命別名為 smf
  • 第7行,定義迴歸模型字串 eq = 'Ct~Yt'
  • 第8行,將迴歸模型和資料回傳到 model1
  • 第9行,執行 OLS ,並將結果回傳到 result1
  • 第11行,將 result1.params[0],result1.params[1] 中的數據,分別放在 b1, b2 當中
  • 第13-14行,令 Y0=12000,再代入 C0 = b1 + b2*Y0,
  • 第15行,列印出所預測 C0 的值

Colab Python 程式碼

# Code 1.2: OLS 模型之預測
import pandas as pd
path='https://github.com/powebe/p4econ/raw/main/'
data=pd.read_csv(path+'data3-6.csv',index_col=0)
import statsmodels.formula.api as smf
# ols: Ct = b1 +b2*Yt
eq = 'Ct~Yt'
model1=smf.ols(eq,data)
result1=model1.fit()
# 將 result1.params[0],result1.params[1] 中的數據,分別放在 b1, b2 當中
b1, b2 =result1.params[0],result1.params[1]
# --- 進行預測
Y0 = 12000
C0 = b1 + b2*Y0
print(C0)

Colab 操作

在用 google 帳號登入 colab 後,可以用 [/檔案/新增筆記本] 來創建 python 環境
將上面的程式碼複製後,用 [ctrl]+[v] 貼上,最後按播放鈕來執行。

Colab 執行結果


 

Python # Code 1.1:跑 OLS

以下是我們介紹給初學者的第一支程式。這支程式的任務很單純,第1部份是開啟資料檔,而第2部份是執行 OLS 模型之估計。

跑 OLS | Colab

這個OLS模型叫做簡單迴歸,其迴歸方程式是:
C_t = b_0+b_1Y_t+u_t
其中 C_t 代表消費支出,Y_t 代表所得水準,u_t 代表殘差。一般我們看到的迴歸方程式,往往會省略「殘差」,所以也可以只寫成這樣:
C_t = b_0+b_1Y_t
這條迴歸方程式主要是估計總體經濟學創立者凱因斯提出的「消費方程式」1。以下則是示範在 Python 中跑此迴歸方程式的程式碼。

Colab 程式碼

# Code 1.1: 跑OLS (以 # 開頭的是註解行,不會被執行)
import pandas as pd
path='https://github.com/powebe/p4econ/raw/main/'
data=pd.read_csv(path+'data3-6.csv',index_col=0)
import statsmodels.formula.api as smf
# 2 ols Ct const Yt 
eq = 'Ct~Yt'
model1=smf.ols(eq,data)
result1=model1.fit()
print(result1.summary())

Colab 操作

在用 google 帳號登入 colab 後,可以用 [/檔案/新增筆記本] 來創建 python 環境

將上面的程式碼複製後,用 [ctrl]+[v] 貼上

最後按播放鈕來執行。

Colab 執行結果


  1. 意指消費支出和所得具有成正向變動的關係。 

Google Colab:python

什麼是 Colaboratory

Colaboratory (簡稱為 Colab),它可讓你在瀏覽器上撰寫及執行 Python,具有不必進行任何設定、免費使用 GPU、輕鬆共用的優點。只要你有 Google 帳號,連上網址立即可使用 Python 環境。

網友說 (Eric Lu):Colab 是一個由 Google 提供免費的Jupyter Notebook環境。目前只有50G儲存空間和12GB (可用於訓練約2GB) 的記憶體,使用時間僅可連續12小時 (待查證是否有變動…)。