程式語言-自建KD值
難易程度★★★★
此篇文章使用 Anaconda的 Jupyter寫程式,測試環境 python3.6,事先完成 pandas、numpy、twstock及 talib套件安裝
(這篇文長,有興趣再閱讀)
這篇我們【用公式】自己算出『KD值』
在上一篇程式語言-KD值調參數 帶領大家如何調整參數內部資料,但輸出的『結果』與『看盤軟體』的還是有落差
今天我們就用最原始的方法自己計算KD值
KD值的計算原理:
一、 要算出KD值,必先算出RSV強弱值,以下以 9 天為計算基準。
RSV=( 收盤 - 9日內的最低 ) / ( 9日內的最高 - 9日內的最低 ) * 100二、 再以平滑移動平均法,來計算KD值。
期初:K= 50,D= 50
當日K值=前一日K值 * 2/3 + 當日RSV * 1/3
當日D值=前一日D值 * 2/3 + 當日K值 * 1/3
下面就用套公式把值算出來
程式解析
- 從『導入套件』到『爬蟲』都與上一篇一模一樣,這裡不再贅述
#導入套件
%matplotlib inline
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt#專門做『技術分析』的套件
from talib import abstract#專門抓台股的套件
import twstock#設定爬蟲股票代號
sid = '2330'
data=twstock.Stock(sid)#用fetch_from抓取資料,指定日期放入dataframe裡
df = pd.DataFrame(data.fetch_from(2018,1))#設定index
df.set_index('date', inplace = True)
此時 df 的產出的資料如下圖:
2. 開始計算RSV值,在程式語言-股價爬蟲套件分析 加碼區教過大家如何使用 rolling(window=day) 畫出『移動平均線』,這裡後面加上 .min及 .max取區間最小(大)值
#計算RSV值
rsv =df['close']-df['close'].rolling(window=9).min())/
(df['close'].rolling(window=9).max()-
df['close'].rolling(window=9).min())*100
3. 因為 rolling 採用9天內的資料來計算,所以前8天不會有值,這裡用np.nan_to_num 的方法將前8筆改為 0,而資料自動轉成array型態
#把前8筆NaN改為0
rsv = np.nan_to_num(rsv)
4. 把資料放入dataframe並定義名稱為RSV,資料索引以df的收盤價為主,並加入到df裡RSV的欄位中(這裡之前解釋過,快速帶過)
#資料放入dataframe裡
RSV=pd.DataFrame(rsv)#名稱定義為RSV
RSV.columns = ['RSV']#索引比照收盤價以日期為主
RSV.index=df['close'].index#把新創的RSV欄位放入df的RSV欄位
df['RSV'] = RSV['RSV']df.head(10)
創建KD值
5. 開始創建K值,因前8筆 RSV 都沒有值,無法算出K值,所以我們給前8筆(k1)一個初始值a,用 append 添加8次
#創建K值
k1 = []
for a in range(8):
a = 74.02
k1.append(a)
k1=pd.DataFrame(k1)
k1.columns = ['K']
6. 第9筆之後就可以開始計算,我們把結果放入k2,而一開始的初始值k_temp為a,用 append 添加 df長度的次數(df-8+8)
k2 = []
k_temp = a
for i in range(len(df)-8):
#當日K值=前一日K值 * 2/3 + 當日RSV * 1/3
k_temp = k_temp*2/3+df['RSV'][i+8]*(1/3)
k2.append(k_temp)
k2=pd.DataFrame(k2)
k2.columns = ['K']
7. 用 concat 將k1、k2疊加起來
K = pd.concat([k1,k2])
K.head(10)
8. 最後用老方法設定index,並加入到df的K欄位裡
K.index=df['close'].index
df['K'] = K['K']
df.head(10)
9. D值就用上述方法再做一次,公式記得要調整~
#創建D值
d1 = []
for b in range(8):
b = 81.58
d1.append(b)
d1=pd.DataFrame(d1)
d1.columns = ['D']
d2 = []
d_temp = b
for j in range(len(df)-8):
#當日D值=前一日D值 * 2/3 + 當日K值 * 1/3
d_temp = d_temp*2/3+df['K'][j+8]*(1/3)
d2.append(d_temp)
d2=pd.DataFrame(d2)
d2.columns = ['D']
D = pd.concat([d1,d2])
D.index=df['close'].index
df['D'] = D['D']
df.head(10)
比較『原始』及『自建』KD值
10. 將自建的KD值畫出來,並與talib畫的KD圖做比較
#畫修正後的KD值
df['K'].plot(figsize=(16, 8), label='K')
df['D'].plot(figsize=(16, 8), label='D')
plt.legend(loc='upper right', shadow=True, fontsize='x-large')
plt.title('KD_modify')#用talib的abstract畫的KD
abstract.STOCH(df).plot(figsize=(16,8))
plt.title('KD_talib')
還是有些微的不一樣,感覺自己建的比較激動,不過從數據來看,自建的值與看盤軟體好像相近許多~~
附上原始程式碼
這次的教學教了
- 溫習前面爬蟲課程
- 溫習rolling(window=day)加上.min及.max的用法
- 使用nan_to_num的方法
- 溫習append的用法
- 使用concat的方法