Python金融大資料分析-迴歸分析
阿新 • • 發佈:2019-01-09
1.pandas的線性迴歸
迴歸分析是金融中一個繞不過的話題,其實最好的工具應該是R語言,但是pandas其實也是能夠勝任絕大部分工作的。
這裡我們就簡單介紹一下。
import pandas as pd import numpy as np import matplotlib.pyplot as plt noise = np.random.normal(0,12,100) x= np.array(range(100)) y = 0.7*x + noise pp = pd.DataFrame({'xvalue':x,'yvalue':y}) model = pd.ols(y=pp['yvalue'],x=pp['xvalue']) print model plt.plot(x,y,'r.') plt.plot(x,model.beta[1]+model.beta[0]*x,'b')
程式碼很簡單,不用做過多的解釋
我們可以看一下程式的輸出,以及圖形上的表示。
這裡,pandas的迴歸給出了上圖的分析。決策係數是0.7621,調整後的是0.7597,不過筆者這裡有一個疑問,一元線性迴歸的調整係數有意義嗎?
p-value很小,越小越拒絕,所以,我們拒絕原假設,換句話說,這裡的水平是顯著的。我們可以看到,我們程式中x和y的關係是沒有intercept項的,但是在迴歸的時候卻產生了。但是我們可以看到,他的p-value是很大的,所以,講道理我們是可以拒絕原假設,換句話說,截距項是不顯著的,也就是說,我們不能承認這一截距項是對的。
然後繪製一個圖,直觀的看一下回歸的過程,總的來說,效果還是很好的。當然,如果我們用的是真實世界的資料,恐怕就不會那麼好了吧。
2.numpy的迴歸擬合
numpy中的擬合更加具有實用意義,其實我們可以改變deg來進行不同階的多項式的擬合。import numpy as np import pandas as pd import matplotlib.pyplot as plt #定義一個函式,用於迴歸 def f(x): return np.sin(x) + 0.5*x #對x抽樣 x = np.linspace(-2*np.pi,2*np.pi,50) #利用一階線性進行迴歸 reg = np.polyfit(x,f(x),deg = 1) #rg就是迴歸之後的y的取值 ry = np.polyval(reg,x) plt.plot(x,f(x),'b') plt.plot(x,ry,'r.')
既然我們可以進行多項式擬合,那麼也就可以給出不同的擬合基函式。
上面的例子中,我們的曲線實際上是由sin函式和x組合的,所以,假設我們知道了這樣的情況,然後,選好這樣的兩個基,然後進行迴歸擬合,應該會得到更加好的效果,而實際上也確實是這樣的。
matrix = np.zeros((2,len(x)))
matrix[1,:] = np.sin(x)
matrix[0,:] = x
reg = np.linalg.lstsq(matrix.T,f(x))[0]
print reg
ry = np.dot(reg,matrix)
plt.plot(x,f(x),'b')
plt.plot(x,ry,'r.')
在上面的程式碼中,我們首先初始化了一個matrix,這個matrix就是用來儲存我們的基的。一個是sin一個是x。然後用linalg,線性模擬函式,最小化平方和的方法獲取reg,然後用dot方法或者擬合後的y值,如果對矩陣或者線性代數很瞭解的話,這一過程應該是可以很容易就理解的。
我們繪製出來後是這樣的結果。
發現擬合的非常完美,然後擬合係數打印出來後時候0.5與1,這和我們設定的完全一樣。