日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据分析- 布林带

發布時間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据分析- 布林带 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據分析- 布林帶

布林帶

布林帶由3條線組成:

中軌線: 5日加權移動平均線

上軌線: 中軌 + 2*5日標準差 (這支股票頂部的壓力)

下軌線: 中軌 - 2*5日標準差 (這支股票底部的支撐力)

布林帶收窄代表趨于穩定, 如果布林帶張開代表有較大的波動空間.

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)

線性預測與線性擬合

線性預測

在二維世界(x,y),線性方程表示為一條直線; 在三維世界(x,y,z),線性方程表示為一個平面.再高的維度常人無法感受.但是線性方程依然存在.

假設一組數據符合一種線性規律, 那么就可以預測未來將會出現的數據.

a b c d e f ?ax + by + cz = d bx + cy + dz = e cx + dy + ez = f 預測: 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]
$$

# a矩陣為3*3的矩陣, b矩陣為等號右邊的矩陣 # c即是[xyz]矩陣 c = np.linalg.lstsq(a, b)[0]

案例: 預測AAPL下一天的股價

# 整理五元一次方程組, 最終預測一組股票的走勢 N = 3 pred_prices = np.zeros(closing_prices.size - 2 * N + 1) # 為預測值的每一個元素賦值 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]# 根據a矩陣與b矩陣求解x = np.linalg.lstsq(a, b)[0]# b.dot(x) b與x執行矩陣相乘pred_prices[i] = b.dot(x)# 把預測的結果繪制出來 # 向dates數組末尾在加一天 (工作日) 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')

線性擬合

線性擬合可以尋求與一組數據的走勢規律相適應的線性表達式方程.

例如: 一組散點:[x1, y1][x2, y2][x3, y3] ... [xn, yn]假設這組散點數據符合同一個線性方程, 那么: 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]
$$

由于樣本數量非常多,沒兩組方程即可求得一組解.

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))) # 求取擬合結果 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))) # 求取擬合結果 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))) # 求取擬合結果 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')

數組的裁剪壓縮和累乘

數組的裁剪

# 將調用數組中小于min的元素賦值為最小值 # 將調用數組中大于max的元素賦值為最大值 d = ndarray.clip(min=1, max=5)

數組的壓縮

# 返回調用數組中滿足條件的元素組成的新數組 d = ndarray.compress(條件)

數組的累乘

# 返回數組中所有元素的乘積 d = ndarray.prod() # 返回調用數組中所有元素執行累乘的過程數組 d = ndarray.cumprod()

測試案例:

import numpy as np # 測試素組的裁剪 a = np.arange(1, 10) b = a.clip(min=3, max=7) print(a, b)# 測試數組的壓縮 c = a.compress((a > 5) & (a < 8)) print(a, c)# 測試數組的累乘 d = a.prod() print(a, d) e = a.cumprod() print(e)

協方差/相關矩陣/相關系數

通過兩組統計數據計算而得的協方差可以評估這兩組統計數據的相似程度.

樣本:

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

協方差:

cov_ab = ave(dev_a * dev_b) (ave即是取平均值) cov_ba = ave(dev_b * dev_a) (ave即是取平均值)

案例: 評估bhp與vale兩支股票的相似程度

# 計算兩只股票收盤價的相關程度(協方差) # 兩組樣本的均值 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 # 兩組樣本的協方差 cov_ab = np.mean(dev_bhp * dev_vale) print(cov_ab)

協方差可以簡單的反應出兩組樣本的相關性. 值為正,則為正相關;若值為負則為負相關. 絕對值越大相關性越強.

相關系數

相關系數也體現了兩組樣本的相關性.

相關系數=協方差 / 兩組樣本標準差的乘積. 這個結果處于[-1, 1]

# 求出兩組樣本的相關系數 print(':', (cov_ab / (bhp_closing_prices.std() *vale_closing_prices.std())))

相關矩陣

numpy提供了相關矩陣的API, 可以方便的輸出兩組樣本的相關系數.

# d即為兩組樣本的相關矩陣 d = np.corrcoef(a, b) print(d) # 調用corrcoef方法求得相關矩陣 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?

多項式運算相關API:

# 已知一組多項式系數數組: P = [4, 3, 0, 1] # 則多項式為: y = 4x^3 + 3x^2 + 1 # 根據多項式系數與自變量x的值,求出多項式的結果 y = np.polyval(P, x) # 根據多項式的系數,求得該多項式導函數的系數 Q = np.polyder(P) #-> [12, 6, 0] # 根據多項式的系數,求多項式的根 (一般針對二次函數) # 返回x的值 xs = np.roots(Q)

案例: 求多項式y=4x3 + 3x2 -1000x + 1曲線拐點坐標.

''' 1. 對多項式求導函數 Q = [] 2. 求導函數的根 --> 得到y為0時x的坐標值 3. 把x帶入原函數求得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 # 多項式求導 Q = np.polyder([4, 3, -1000, 1]) # 導函數求根 xs = np.roots(Q) # x帶入原函數求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()

多項式擬合

假設得到的多項式如下:
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?
那么擬合的多項式與原函數的差方:
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 樣本數組的xy坐標 (告訴numpy原函數的數據) # n 最高次冪 (告訴numpy擬合結果的多項式的最高次冪)# 返回 P :擬合結果多項式的系數數組 P = np.polyfit(x, y, n)

案例: 使用多項式擬合兩只股票(bhp, vale)收盤價的差價函數:

''' 1. 讀取文件,求得bhp與vale的收盤價的差價 2. 繪制差價的散點圖 3. 基于多項式擬合,擬合得到一個多項式方程(系數) 4. 繪制多項式方程的曲線 '''

總結

以上是生活随笔為你收集整理的数据分析- 布林带的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。