詳解NumPy中的線性關(guān)系與數(shù)據(jù)修剪壓縮
摘要
總結(jié)股票均線計(jì)算原理--線性關(guān)系,也是以后大數(shù)據(jù)處理的基礎(chǔ)之一,NumPy的 linalg 包是專門(mén)用于線性代數(shù)計(jì)算的。作一個(gè)假設(shè),就是一個(gè)價(jià)格可以根據(jù)N個(gè)之前的價(jià)格利用線性模型計(jì)算得出。
前一篇,在計(jì)算均線,指數(shù)均線時(shí),分別計(jì)算了不同的權(quán)重,比如
和
都是按不同的計(jì)算方法來(lái)計(jì)算出相關(guān)的權(quán)重,一個(gè)股價(jià)可以用之前股價(jià)的線性組合表示出來(lái),也即,這個(gè)股價(jià)等于之前的股價(jià)與各自的系數(shù)相乘后再做加和的結(jié)果,但是,這些系數(shù)是需要我們來(lái)確定的,也即一個(gè)線性相關(guān)的權(quán)重。
一、用線性模型預(yù)測(cè)價(jià)格
創(chuàng)建步驟如下:
1)先獲取一個(gè)包含N個(gè)收盤(pán)價(jià)的向量(數(shù)組):
N=10 #N=len(close) new_close = close[-N:] new_closes= new_close[::-1] print (new_closes)
運(yùn)行結(jié)果:
[39.96 38.03 38.5 38.6 36.89 37.15 36.61 37.21 36.98 36.47]
2)初始化一個(gè)N×N的二維數(shù)組 A ,元素全部為 0
A = np.zeros((N, N), float) print ("Zeros N by N", A)
3)用數(shù)組new_closes的股價(jià)填充數(shù)組A
for i in range(N): A[i,] = close[-N-i-1: -1-i] print( "A", A)
試一下運(yùn)行結(jié)果,并觀察填充后的數(shù)組A
4)選取合適的權(quán)重
Weights [0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]和The weights : [0.2 0.2 0.2 0.2 0.2]哪一種權(quán)重更合理?用線性代數(shù)的術(shù)語(yǔ)來(lái)說(shuō),就是解一個(gè)最小二乘法的問(wèn)題。
要確定線性模型中的權(quán)重系數(shù),就是解決最小平方和的問(wèn)題,可以使用 linalg包中的 lstsq 函數(shù)來(lái)完成這個(gè)任務(wù)
(x, residuals, rank, s) = np.linalg.lstsq(A,new_closes)
其中,x是由A,new_closes通過(guò)np.linalg.lstsq()函數(shù),即生成的權(quán)重(向量),residuals為殘差數(shù)組、rank為A的秩、s為A的奇異值。
5)預(yù)測(cè)股價(jià),用NumPy中的 dot()函數(shù)計(jì)算系數(shù)向量與最近N個(gè)價(jià)格構(gòu)成的向量的點(diǎn)積(dot product),這個(gè)點(diǎn)積就是向量new_closes中價(jià)格的線性組合,系數(shù)由向量 x 提供
print( np.dot(new_closes, x))
完整代碼如下:
import numpy as np from datetime import datetime import matplotlib.pyplot as plt def datestr2num(s): #定義一個(gè)函數(shù) return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday() dates, opens, high, low, close,vol=np.loadtxt('data.csv',delimiter=',', usecols=(1,2,3,4,5,6), converters={1:datestr2num},unpack=True) N=10 #N=len(close) new_close = close[-N:] new_closes= new_close[::-1] A = np.zeros((N, N), float) for i in range(N): A[i,] = close[-N-i-1: -1-i] print( "A", A) (x, residuals, rank, s) = np.linalg.lstsq(A,new_closes) print(x) #權(quán)重系數(shù)向量 print('\n') print(residuals) #殘差數(shù)組 print('\n') print(rank) #A的秩 print(s) print('\n')#奇異值 print( np.dot(new_closes, x))
運(yùn)行結(jié)果如下:
二、趨勢(shì)線
趨勢(shì)線,是根據(jù)股價(jià)走勢(shì)圖上很多所謂的樞軸點(diǎn)繪成的曲線。描繪價(jià)格變化的趨勢(shì)。可以讓計(jì)算機(jī)來(lái)用非常簡(jiǎn)易的方法來(lái)繪制趨勢(shì)線
(1) 確定樞軸點(diǎn)的位置。假定樞軸點(diǎn)位置 為最高價(jià)、最低價(jià)和收盤(pán)價(jià)的算術(shù)平均值。pivots = (high + low + close ) / 3
從樞軸點(diǎn)出發(fā),可以推導(dǎo)出股價(jià)所謂的阻力位和支撐位。阻力位是指股價(jià)上升時(shí)遇到阻力,在轉(zhuǎn)跌前的最高價(jià)格;支撐位是指股價(jià)下跌時(shí)遇到支撐,在反彈前的最低價(jià)格(阻力位和支撐位并非客觀存在,它們只是一個(gè)估計(jì)量)。基于這些估計(jì)量,就可以繪制出阻力位和支撐位的趨勢(shì)線。我們定義當(dāng)日股價(jià)區(qū)間為最高價(jià)與最低價(jià)之差
(2) 定義一個(gè)函數(shù)用直線 y= at + b 來(lái)擬合數(shù)據(jù),該函數(shù)應(yīng)返回系數(shù) a 和 b,再次用到 linalg 包中的 lstsq 函數(shù)。將直線方程重寫(xiě)為 y = Ax 的形式,其中 A = [t 1] , x = [a b] 。使用 ones_like 和 vstack 函數(shù)來(lái)構(gòu)造數(shù)組 A
numpy.ones_like(a, dtype=None, order='K', subok=True) 返回與指定數(shù)組具有相同形狀和數(shù)據(jù)類型的數(shù)組,并且數(shù)組中的值都為1。
numpy.vstack(tup) [source] 垂直(行)按順序堆疊數(shù)組。 這等效于形狀(N,)的1-D數(shù)組已重塑為(1,N)后沿第一軸進(jìn)行concatenation。 重建除以vsplit的數(shù)組。如下兩小例:
>>> a = np.array([1, 2, 3]) >>> b = np.array([2, 3, 4]) >>> np.vstack((a,b)) array([[1, 2, 3], [2, 3, 4]])
>>> a = np.array([[1], [2], [3]]) >>> b = np.array([[2], [3], [4]]) >>> np.vstack((a,b)) array([[1], [2], [3], [2], [3], [4]])
完整代碼如下:
import numpy as np from datetime import datetime import matplotlib.pyplot as plt def datestr2num(s): #定義一個(gè)函數(shù) return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday() dates, opens, high, low, close,vol=np.loadtxt('data.csv',delimiter=',', usecols=(1,2,3,4,5,6), converters={1:datestr2num},unpack=True) """ N=10 #N=len(close) new_close = close[-N:] new_closes= new_close[::-1] A = np.zeros((N, N), float) for i in range(N): A[i,] = close[-N-i-1: -1-i] print( "A", A) (x, residuals, rank, s) = np.linalg.lstsq(A,new_closes) print(x) #權(quán)重系數(shù)向量 print(residuals) #殘差數(shù)組 print(rank) #A的秩 print(s) print( np.dot(new_closes, x)) """ pivots = (high + low + close ) / 3 def fit_line(t, y): A = np.vstack([t, np.ones_like(t)]).T # np.ones_like(t) 即定義一個(gè)像t一樣,有相同形狀和數(shù)據(jù)類型的數(shù)組,并且數(shù)組中的值都為1 return np.linalg.lstsq(A, y)[0] t = np.arange(len( close)) #按close數(shù)列創(chuàng)建一個(gè)數(shù)列t sa, sb = fit_line(t, pivots - (high - low)) #用直線y=at+b來(lái)擬合數(shù)據(jù),該函數(shù)應(yīng)返回系數(shù)a(sa) 和 b(sb) ra, rb = fit_line(t, pivots + (high - low)) support = sa * t + sb #計(jì)算支撐線數(shù)列 resistance = ra * t + rb #計(jì)算阻力線數(shù)列 condition = (close > support) & (close < resistance)#設(shè)置一個(gè)判斷數(shù)據(jù)點(diǎn)是否位于趨勢(shì)線之間的條件,作為 where 函數(shù)的參數(shù) between_bands = np.where(condition) plt.plot(t, close,color='r') plt.plot(t, support,color='g') plt.plot(t, resistance,color='y') plt.show()
運(yùn)行結(jié)果:
三、數(shù)組的修剪和壓縮
NumPy中的 ndarray 類定義了許多方法,可以對(duì)象上直接調(diào)用。通常情況下,這些方法會(huì)返回一個(gè)數(shù)組。
ndarray 對(duì)象的方法相當(dāng)多,像前面遇到的 var 、 sum 、 std 、 argmax 、argmin 以及 mean 函數(shù)也均為 ndarray 方法。下面介紹一下數(shù)組的修前與壓縮。
1、 clip 方法返回一個(gè)修剪過(guò)的數(shù)組:將所有比給定最大值還大的元素全部設(shè)為給定的最大值,而所有比給定最小值還小的元素全部設(shè)為給定的最小值
a = np.arange(10) print("a =", a) print("Clipped", a.clip(3, 7))
運(yùn)行結(jié)果:
a = [0 1 2 3 4 5 6 7 8 9]
Clipped [3 3 3 3 4 5 6 7 7 7]
很明顯,a.clip(3,7)將數(shù)組a中的小于3的設(shè)置為3,大于7的全部設(shè)置為7.
2、 compress 方法返回一個(gè)根據(jù)給定條件篩選后的數(shù)組
b = np.arange(10) print (a) print ("Compressed", a.compress(a >3))
運(yùn)行結(jié)果:
[0 1 2 3 4 5 6 7 8 9]
Compressed [4 5 6 7 8 9]
四、階乘
prod() 方法,可以計(jì)算數(shù)組中所有元素的乘積.
c = np.arange(1,5) print("b =", c) print("Factorial", c.prod())
運(yùn)行結(jié)果:
b = [1 2 3 4]
Factorial 24
如果想知道1~8的所有階乘值,調(diào)用 cumprod()方法,計(jì)算數(shù)組元素的累積乘積。
print( "Factorials", c.cumprod())
運(yùn)行結(jié)果:
Factorials [ 1 2 6 24 120]
本篇主要介紹了一個(gè)通過(guò)現(xiàn)在有數(shù)據(jù),用函數(shù) y= at + b 來(lái)擬合數(shù)據(jù)進(jìn)行線性擬合后,用 linalg包中的 lstsq 函數(shù)來(lái)完成最小二乘相關(guān)后,預(yù)測(cè)股價(jià)的實(shí)例,來(lái)了解了一些numpy的函數(shù)及作用;同時(shí)介紹了數(shù)據(jù)修剪及壓縮和階乘的計(jì)算。
以上就是詳解NumPy中的線性關(guān)系與數(shù)據(jù)修剪壓縮的詳細(xì)內(nèi)容,更多關(guān)于NumPy線性關(guān)系 數(shù)據(jù)修剪壓縮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python生成器next方法和send方法區(qū)別詳解
這篇文章主要介紹了Python生成器next方法和send方法區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python中常用的各種數(shù)據(jù)庫(kù)操作模塊和連接實(shí)例
這篇文章主要介紹了python中常用的各種數(shù)據(jù)庫(kù)操作模塊和連接實(shí)例,包括sqlite3、oracle、mysql、excel,需要的朋友可以參考下2014-05-05利用Python批量導(dǎo)出mysql數(shù)據(jù)庫(kù)表結(jié)構(gòu)的操作實(shí)例
這篇文章主要給大家介紹了關(guān)于利用Python批量導(dǎo)出mysql數(shù)據(jù)庫(kù)表結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-08-08Python時(shí)間戳使用和相互轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Python時(shí)間戳使用和相互轉(zhuǎn)換的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12R語(yǔ)言屬性知識(shí)點(diǎn)總結(jié)及實(shí)例
在本篇文章里小編給大家整理了一篇關(guān)于R語(yǔ)言屬性知識(shí)點(diǎn)總結(jié)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03