数据分析- 布林带
數(shù)據(jù)分析- 布林帶
布林帶
布林帶由3條線組成:
中軌線: 5日加權(quán)移動平均線
上軌線: 中軌 + 2*5日標準差 (這支股票頂部的壓力)
下軌線: 中軌 - 2*5日標準差 (這支股票底部的支撐力)
布林帶收窄代表趨于穩(wěn)定, 如果布林帶張開代表有較大的波動空間.
sma53 = np.convolve(closing_prices, core, 'valid') mp.plot(dates[4:], sma53, color='violet',linewidth=2, label='SMA-5(3)')# 繪制5日均線的布林帶 stds = np.zeros(sma53.size) for i in range(stds.size):stds[i] = closing_prices[i:i + 5].std() # 底部支撐線 和 頂部壓力線 lowers = sma53 - 2 * stds uppers = sma53 + 2 * stds # 繪制布林帶 mp.plot(dates[4:], lowers,color='limegreen', label='Lower') mp.plot(dates[4:], uppers,color='orangered', label='Upper') mp.fill_between(dates[4:], lowers, uppers,uppers > lowers,color='dodgerblue', alpha=0.3)線性預(yù)測與線性擬合
線性預(yù)測
在二維世界(x,y),線性方程表示為一條直線; 在三維世界(x,y,z),線性方程表示為一個平面.再高的維度常人無法感受.但是線性方程依然存在.
假設(shè)一組數(shù)據(jù)符合一種線性規(guī)律, 那么就可以預(yù)測未來將會出現(xiàn)的數(shù)據(jù).
a b c d e f ?ax + by + cz = d bx + cy + dz = e cx + dy + ez = f 預(yù)測: dx + ey + fz = ?計算機如何解三元一次方程組?
$$
\left[ \begin{array}{ccc}
a & b & c \
b & c & d \
c & d & e \
\end{array}
\right]
\times
\left[ \begin{array}{ccc}
x\
y\
z\
\end{array}
\right]
\left[ \begin{array}{ccc}
d\
e\
f\
\end{array}
\right]
$$
案例: 預(yù)測AAPL下一天的股價
# 整理五元一次方程組, 最終預(yù)測一組股票的走勢 N = 3 pred_prices = np.zeros(closing_prices.size - 2 * N + 1) # 為預(yù)測值的每一個元素賦值 for i in range(pred_prices.size):a = np.zeros((N, N))# 整理5行5列的矩陣for j in range(N):a[j, ] = closing_prices[i + j:i + j + N]b = closing_prices[i + N:i + N * 2]# 根據(jù)a矩陣與b矩陣求解x = np.linalg.lstsq(a, b)[0]# b.dot(x) b與x執(zhí)行矩陣相乘pred_prices[i] = b.dot(x)# 把預(yù)測的結(jié)果繪制出來 # 向dates數(shù)組末尾在加一天 (工作日) dates = np.append(dates, dates[-1] +pd.tseries.offsets.BDay())mp.plot(dates[2 * N:], pred_prices,'o-', color='orangered',linewidth=2, label='Predict Price')線性擬合
線性擬合可以尋求與一組數(shù)據(jù)的走勢規(guī)律相適應(yīng)的線性表達式方程.
例如: 一組散點:[x1, y1][x2, y2][x3, y3] ... [xn, yn]假設(shè)這組散點數(shù)據(jù)符合同一個線性方程, 那么: kx1 + b = y1 kx2 + b = y2 kx3 + b = y3 ... kxn + b = yn$$
\left[ \begin{array}{ccc}
x_1 & 1 \
x_2 & 1 \
x_3 & 1 \
x_n & 1 \
\end{array}
\right]
\times
\left[ \begin{array}{ccc}
k\
b\
\end{array}
\right]
\left[ \begin{array}{ccc}
y_1\
y_2\
y_3\
y_4\
\end{array}
\right]
$$
由于樣本數(shù)量非常多,沒兩組方程即可求得一組解.
np.linalg.lstsq(a, b)可以通過最小二乘法求出擬合誤差最小的k與b的值返回.
案例:利用線性擬合畫出股價的趨勢線.
(股價趨勢簡單可以認為: 最高價/最低價/收盤價的均值)
''' 1. 繪制每天的趨勢點 2. 針對每天的趨勢點去做線性擬合,得到直線方程. 3. 繪制趨勢線 ''' # 通過 最高價最低價收盤價取得每天的趨勢點 trend_points = (highest_prices + closing_prices +lowest_prices) / 3 # 繪制趨勢點 mp.scatter(dates, trend_points,color='dodgerblue', alpha=0.8,zorder=4) # 通過線性擬合,獲取一條與趨勢點匹配的擬合直線 days = dates.astype('M8[D]').astype('int32') a = np.column_stack((days, np.ones(days.size))) # 求取擬合結(jié)果 x = np.linalg.lstsq(a, trend_points)[0] # 獲取趨勢線 y=kx+b trend_line = days * x[0] + x[1] # 繪制趨勢線 mp.plot(dates, trend_line,color='dodgerblue', linewidth=3,label='Trend Line')spreads = highest_prices - lowest_prices # 繪制頂部壓力線 (trend+(highest-lowest)) resistance_points = trend_points + spreads mp.scatter(dates, resistance_points,color='orangered', alpha=0.8,zorder=4) a = np.column_stack((days, np.ones(days.size))) # 求取擬合結(jié)果 x = np.linalg.lstsq(a, resistance_points)[0] # 獲取趨勢線 y=kx+b resistance_line = days * x[0] + x[1] # 繪制趨勢線 mp.plot(dates, resistance_line,color='orangered', linewidth=3,label='resistance Line')# 繪制底部支撐線 (trend-(highest-lowest)) support_points = trend_points - spreads mp.scatter(dates, support_points,color='limegreen', alpha=0.8,zorder=4) a = np.column_stack((days, np.ones(days.size))) # 求取擬合結(jié)果 x = np.linalg.lstsq(a, support_points)[0] # 獲取趨勢線 y=kx+b support_line = days * x[0] + x[1] # 繪制趨勢線 mp.plot(dates, support_line,color='limegreen', linewidth=3,label='support Line')數(shù)組的裁剪壓縮和累乘
數(shù)組的裁剪
# 將調(diào)用數(shù)組中小于min的元素賦值為最小值 # 將調(diào)用數(shù)組中大于max的元素賦值為最大值 d = ndarray.clip(min=1, max=5)數(shù)組的壓縮
# 返回調(diào)用數(shù)組中滿足條件的元素組成的新數(shù)組 d = ndarray.compress(條件)數(shù)組的累乘
# 返回數(shù)組中所有元素的乘積 d = ndarray.prod() # 返回調(diào)用數(shù)組中所有元素執(zhí)行累乘的過程數(shù)組 d = ndarray.cumprod()測試案例:
import numpy as np # 測試素組的裁剪 a = np.arange(1, 10) b = a.clip(min=3, max=7) print(a, b)# 測試數(shù)組的壓縮 c = a.compress((a > 5) & (a < 8)) print(a, c)# 測試數(shù)組的累乘 d = a.prod() print(a, d) e = a.cumprod() print(e)協(xié)方差/相關(guān)矩陣/相關(guān)系數(shù)
通過兩組統(tǒng)計數(shù)據(jù)計算而得的協(xié)方差可以評估這兩組統(tǒng)計數(shù)據(jù)的相似程度.
樣本:
A = [a1, a2, a3, ..., an] B = [b1, b2, b3, ..., bn]平均值:
ave_a = (a1 + a2 +...+ an) / n ave_b = (b1 + b2 +...+ bn) / n離差:
dev_a = [a1, a2, a3, ..., an] - ave_a dev_b = [b1, b2, b3, ..., bn] - ave_b協(xié)方差:
cov_ab = ave(dev_a * dev_b) (ave即是取平均值) cov_ba = ave(dev_b * dev_a) (ave即是取平均值)案例: 評估bhp與vale兩支股票的相似程度
# 計算兩只股票收盤價的相關(guān)程度(協(xié)方差) # 兩組樣本的均值 ave_bhp = bhp_closing_prices.mean() ave_vale = vale_closing_prices.mean() # 兩組樣本的離差 dev_bhp = bhp_closing_prices - ave_bhp dev_vale = vale_closing_prices - ave_vale # 兩組樣本的協(xié)方差 cov_ab = np.mean(dev_bhp * dev_vale) print(cov_ab)協(xié)方差可以簡單的反應(yīng)出兩組樣本的相關(guān)性. 值為正,則為正相關(guān);若值為負則為負相關(guān). 絕對值越大相關(guān)性越強.
相關(guān)系數(shù)
相關(guān)系數(shù)也體現(xiàn)了兩組樣本的相關(guān)性.
相關(guān)系數(shù)=協(xié)方差 / 兩組樣本標準差的乘積. 這個結(jié)果處于[-1, 1]
# 求出兩組樣本的相關(guān)系數(shù) print(':', (cov_ab / (bhp_closing_prices.std() *vale_closing_prices.std())))相關(guān)矩陣
numpy提供了相關(guān)矩陣的API, 可以方便的輸出兩組樣本的相關(guān)系數(shù).
# d即為兩組樣本的相關(guān)矩陣 d = np.corrcoef(a, b) print(d) # 調(diào)用corrcoef方法求得相關(guān)矩陣 d = np.corrcoef(bhp_closing_prices,vale_closing_prices) print(d)多項式運算與多項式擬合
多項式方程的一般形式
y=p0xn+p1xn?1+p2xn?2+...+pny = p_0x^n + p_1x^{n-1} + p_2x^{n-2}+ ...+ p_n y=p0?xn+p1?xn?1+p2?xn?2+...+pn?
多項式運算相關(guān)API:
# 已知一組多項式系數(shù)數(shù)組: P = [4, 3, 0, 1] # 則多項式為: y = 4x^3 + 3x^2 + 1 # 根據(jù)多項式系數(shù)與自變量x的值,求出多項式的結(jié)果 y = np.polyval(P, x) # 根據(jù)多項式的系數(shù),求得該多項式導(dǎo)函數(shù)的系數(shù) Q = np.polyder(P) #-> [12, 6, 0] # 根據(jù)多項式的系數(shù),求多項式的根 (一般針對二次函數(shù)) # 返回x的值 xs = np.roots(Q)案例: 求多項式y(tǒng)=4x3 + 3x2 -1000x + 1曲線拐點坐標.
''' 1. 對多項式求導(dǎo)函數(shù) Q = [] 2. 求導(dǎo)函數(shù)的根 --> 得到y(tǒng)為0時x的坐標值 3. 把x帶入原函數(shù)求得y坐標 4. 繪制多項式曲線, 并且標注拐點 ''' import numpy as np import matplotlib.pyplot as mpx = np.linspace(-20, 20, 1000) y = 4 * x**3 + 3 * x**2 - 1000 * x + 1 # 多項式求導(dǎo) Q = np.polyder([4, 3, -1000, 1]) # 導(dǎo)函數(shù)求根 xs = np.roots(Q) # x帶入原函數(shù)求y ys = np.polyval([4, 3, -1000, 1], xs) print(xs, ys) mp.figure('PolyLine', facecolor='lightgray') mp.title('PlyLine', fontsize=18) mp.xlabel('X', fontsize=14) mp.ylabel('Y', fontsize=14) mp.tick_params(labelsize=10) mp.grid(linestyle=":") mp.plot(x, y, color='dodgerblue',linewidth=3, label='Poly Line') # 繪制拐點 mp.scatter(xs, ys, color='red', marker='D',zorder=3, label='Points') mp.legend() mp.show()多項式擬合
假設(shè)得到的多項式如下:
f(x)=p0xn+p1xn?1+p2xn?2+...+pnf(x) = p_0x^n + p_1x^{n-1} + p_2x^{n-2}+ ...+ p_n f(x)=p0?xn+p1?xn?1+p2?xn?2+...+pn?
那么擬合的多項式與原函數(shù)的差方:
loss=(y1?f(x1))2+(y2?f(x2))2+...+(yn?f(xn))2loss = (y_1-f(x_1))^2 + (y_2-f(x_2))^2 + ... + (y_n-f(x_n))^2 loss=(y1??f(x1?))2+(y2??f(x2?))2+...+(yn??f(xn?))2
多項式擬合的意義在于求取一組p0-pn,使得loss的值最小.
numpy提供的多項式擬合的API:
# x, y 樣本數(shù)組的xy坐標 (告訴numpy原函數(shù)的數(shù)據(jù)) # n 最高次冪 (告訴numpy擬合結(jié)果的多項式的最高次冪)# 返回 P :擬合結(jié)果多項式的系數(shù)數(shù)組 P = np.polyfit(x, y, n)案例: 使用多項式擬合兩只股票(bhp, vale)收盤價的差價函數(shù):
''' 1. 讀取文件,求得bhp與vale的收盤價的差價 2. 繪制差價的散點圖 3. 基于多項式擬合,擬合得到一個多項式方程(系數(shù)) 4. 繪制多項式方程的曲線 '''總結(jié)
- 上一篇: 百度seo快排点击系统源码[易语言]拨号
- 下一篇: IOS 发布被拒 PLA 1.2问题 整