iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 25
3
AI & Data

python 入門到分析股市系列 第 25

[Day25]繪製K線圖

前言

今天鐵人25天要來繪製K線圖,在繪製K線圖之前要先安裝Ta-lib
Ta-lib:python套件,專門用來計算金融技術指標。裡面有很多好用的function,今天用來算出均線。
K線圖:根據股價一天走勢的 4 個價位:開盤價、收盤價、最高價、最低價繪製而成。開盤價與收盤價,會構成 K 線的實體(Body),最高價、最低價分別成為上影線(Shadow)及下影線。如果收盤價高於開盤價,Body 為紅色;收盤價低於開盤價,Body 為黑色或是綠色。

安裝Ta-lib

  • 下載
    安裝的網址Url到此網頁後尋找
    https://ithelp.ithome.com.tw/upload/images/20181101/20111390RbCpVPElP1.png
    其中cp36表示python3.6,win32表示32位,amd64表示64位,請自行下載對應的檔案

  • 從Anaconda Prompt安裝,cd 到下載的資料夾,執行以下指令,請將 「TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl」換成自己下載的檔案名稱

pip install TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl

載入預設套件

# basic
import numpy as np
import pandas as pd

# get data
import pandas_datareader as pdr

# visual
import matplotlib.pyplot as plt
import mpl_finance as mpf
%matplotlib inline
import seaborn as sns

#time
import datetime as datetime

#talib
import talib

取得股票

使用pandas_datareader抓取某個股票,這邊使用台積電(2330)

start = datetime.datetime(2018,4,1)
df_2330 = pdr.DataReader('2330.TW', 'yahoo', start=start)

繪製蠟燭

使用set_xticklabels來繪製蠟燭

df_2330.index = df_2330.index.format(formatter=lambda x: x.strftime('%Y-%m-%d')) 

fig = plt.figure(figsize=(24, 8))

ax = fig.add_subplot(1, 1, 1)
ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
                      df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75); 

https://ithelp.ithome.com.tw/upload/images/20181101/20111390O4mIIoA5n8.png
從上圖可以看到很基本的k線圖,接下來要加上10日均線和30日均線

加上均線

加上10日均線和30日均線

sma_10 = talib.SMA(np.array(df_2330['Close']), 10)
sma_30 = talib.SMA(np.array(df_2330['Close']), 30)

fig = plt.figure(figsize=(24, 8))
ax = fig.add_subplot(1, 1, 1)
ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
                      df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
plt.rcParams['font.sans-serif']=['Microsoft JhengHei'] 
ax.plot(sma_10, label='10日均線')
ax.plot(sma_30, label='30日均線')
ax.legend();

https://ithelp.ithome.com.tw/upload/images/20181101/201113904xyAN6uwEy.png

加上成交量

sma_10 = talib.SMA(np.array(df_2330['Close']), 10)
sma_30 = talib.SMA(np.array(df_2330['Close']), 30)

fig = plt.figure(figsize=(24, 15))
ax = fig.add_axes([0,0.2,1,0.5])
ax2 = fig.add_axes([0,0,1,0.2])

ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
                      df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
plt.rcParams['font.sans-serif']=['Microsoft JhengHei'] 
ax.plot(sma_10, label='10日均線')
ax.plot(sma_30, label='30日均線')

mpf.volume_overlay(ax2, df_2330['Open'], df_2330['Close'], df_2330['Volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)
ax2.set_xticks(range(0, len(df_2330.index), 10))
ax2.set_xticklabels(df_2330.index[::10])

ax.legend();

https://ithelp.ithome.com.tw/upload/images/20181101/20111390Od6WRbnZdt.png
接下來要來加上KD指標

加上KD指標

公式:
未成熟隨機值(RSV):(今日收盤價 - 最近9天的最低價) / (最近9天最高價 - 最近9天的最低價)
當日K值:前日K值 * (2/3) + 當日RSV值 * (1/3)
當日D值:前日D值 * (2/3) + 當日K值 * (1/3)

K值就是日常的波動,D值就是稍大一點的趨勢,而RSV就是K的次一級的級數了。三者的關係就像是浪花(RSV),和波浪(K,D)的關係。

KD指標之所以被廣為運用,在於它涵蓋了一定時間內最高價與最低價的概念,因此可以很靈敏地反映出價格的變化。

KD黃金交叉:當KD指標的K值由下往上突破D值,建議買進、做多。
KD死亡交叉:當KD指標的K值由上往下跌破D值時,建議賣出、做空。
KD鈍化:K值在高檔 (K > 80) 或低檔( K < 20) 區連續3天,因為當一檔股票高檔鈍化(K值>80,3天以上),表示非常的強勢通常會再漲的機會就會變得非常高。

sma_10 = talib.SMA(np.array(df_2330['Close']), 10)
sma_30 = talib.SMA(np.array(df_2330['Close']), 30)
df_2330['k'], df_2330['d'] = talib.STOCH(df_2330['High'], df_2330['Low'], df_2330['Close'])
df_2330['k'].fillna(value=0, inplace=True)
df_2330['d'].fillna(value=0, inplace=True)

fig = plt.figure(figsize=(24, 20))
ax = fig.add_axes([0,0.3,1,0.4])
ax2 = fig.add_axes([0,0.2,1,0.1])
ax3 = fig.add_axes([0,0,1,0.2])

ax.set_xticks(range(0, len(df_2330.index), 10))
ax.set_xticklabels(df_2330.index[::10])
mpf.candlestick2_ochl(ax, df_2330['Open'], df_2330['Close'], df_2330['High'],
                      df_2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
plt.rcParams['font.sans-serif']=['Microsoft JhengHei'] 
ax.plot(sma_10, label='10日均線')
ax.plot(sma_30, label='30日均線')

ax2.plot(df_2330['k'], label='K值')
ax2.plot(df_2330['d'], label='D值')
ax2.set_xticks(range(0, len(df_2330.index), 10))
ax2.set_xticklabels(df_2330.index[::10])

mpf.volume_overlay(ax3, df_2330['Open'], df_2330['Close'], df_2330['Volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)
ax3.set_xticks(range(0, len(df_2330.index), 10))
ax3.set_xticklabels(df_2330.index[::10])

ax.legend();
ax2.legend();

https://ithelp.ithome.com.tw/upload/images/20181108/201113901h6zvsah62.png
KD值的前8天會是Nan,為了讓時間序列相同,因此將Nan值填入0,所以前8天的KD值不具任何參考作用。

以上就完成基礎的k線圖了。可喜可賀。


心得

股市走勢可以使用KD值做參考,當遇到KD黃金交叉時買入,KD死亡交叉賣出。

參考資料

https://www.cmoney.tw/notes/note-detail.aspx?nid=6460

之前的章節


上一篇
[Day24] 分析股票 - 基礎股票分析
下一篇
[Day26] 財報爬蟲和分析
系列文
python 入門到分析股市30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
kobe3345678
iT邦新手 5 級 ‧ 2018-12-10 16:30:45

summer大大您好,
我有安裝anaconda3,且使用jupyter notebook執行,並已安裝Ta-lib,我在複製程式碼到繪製蠟燭這片段時,執行會出現AttributeError: module 'mpl_finance' has no attribute 'candlestick2_ochl'

我google網路上,都是使用這類型語法
mpf.candlestick2_ochl....
但搜不到解決辦法,請問大大知道原因嗎?

Summer iT邦新手 5 級 ‧ 2018-12-11 10:02:08 檢舉

先謝謝summer大,我在另一台電腦用沒有這個問題,有問題的那台電腦我還沒試著去排除,有時間時再去試試看,感恩!

Summer iT邦新手 5 級 ‧ 2018-12-14 11:26:52 檢舉

/images/emoticon/emoticon07.gif

0
csshieh
iT邦新手 5 級 ‧ 2019-07-18 17:45:27

我在安裝時TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl會有以下的錯誤出現,
https://ithelp.ithome.com.tw/upload/images/20190718/2011916393tk7D3boX.jpg
請問如何解決?

0
kyc1109
iT邦新手 4 級 ‧ 2021-07-22 11:41:45

Nice post.
由於mpl_finance已不支援,所以將下面的程式碼
import mplfinance as mpf

df2330.index = df2330.index.format(formatter=lambda x: x.strftime('%Y-%m-%d'))
fig = plt.figure(figsize=(24, 8))
ax = fig.addsubplot(1, 1, 1)
ax.setxticks(range(0, len(df2330.index), 10))
ax.setxticklabels(df2330.index[::10])
mpf.candlestick2ochl(ax, df2330['Open'], df2330['Close'], df2330['High'],
df2330['Low'], width=0.6, colorup='r', colordown='g', alpha=0.75);

改成這樣才能使用,不過一來畫面沒原po的好看,二來後面的例子就沒辦法照個實作了
import mplfinance as mpf
df_2330.index.name = 'Date'
mpf.plot(df_2330,type='candle', mav=(5,10,20),volume=True)

我要留言

立即登入留言