iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
2
AI & Data

量化交易30天系列 第 3

量化交易30天 Day3 - 分析K線型態

  • 分享至 

  • xImage
  •  

量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。

K線圖的其中一個用途,就是可以利用過去的K線走勢,去推測未來可能的走勢為何,而K線型態,是指過去幾根K線的長相(一般來說可能是2~5根不等),透過某些特定的長相,可以幫助我們推測未來的走勢。

由於K線型態有非常多種,這邊先介紹兩個最基本的,都是由3根連續K棒組成,如下圖

Morning star 晨星

Morning star 條件:

  • 第1根是陰線,第2根可以是陽線或陰線,第3根是陽線。
  • 第2根的開盤價與收盤價(也就是灰色方塊的部分)都要小於第1根的收盤價與第3根的開盤價。
  • 第3根的方塊長度要大於第1根的綠色方塊長度的一半。

Morning star的意義,在第1根大黑K之後,接第2根漲跌幅度較小的K棒,代表跌幅收斂,緊接著第3根大紅K,表示趨勢由下跌反轉為上漲行情。

Evening star 夜星

Evening star 條件:

  • 第1根是陽線,第2根可以是陽線或陰線,第3根是陰線。
  • 第2根的開盤價與收盤價(也就是灰色方塊的部分)都要大於第1根的收盤價與第3根的開盤價。
  • 第3根的方塊長度要大於第1根的方塊長度的一半。

Evening star的意義,在第1根大紅K之後,接第2根漲跌幅度較小的K棒,代表漲幅收斂,緊接著第3根大黑K,表示趨勢由上漲反轉為下跌行情。

Python抓取Evening star

這邊就來實作一下如何用Python在一片Dataframe的汪洋之中,怎麼抓到"Evening star"吧!步驟如下:

  1. 抓取股票價格 and 整理資料
  2. 瞭解數據概況
  3. 利用K線特徵抓取Evening star出現的日期
  4. 回頭檢視K線圖中,python抓到日期的K線圖是否與Evening star相符

1. 抓取股票價格 and 整理資料

這次我們使用SPY這檔商品來找找看,首先,先將數據清理乾淨:

# 串接API抓取資料
import os
import pandas_datareader as pdr
SPY = pdr.get_data_tiingo('SPY', api_key='YOUR API KEY')
SPY = SPY.reset_index(level=[0,1])
SPY.index = SPY['date']
SPY_adj = SPY.iloc[:,7:11]
SPY_adj.columns = ['Close','High','Low','Open']

# 取2019年的數據
SPY_adj_2019 = SPY_adj['2019']

# 開盤價 & 收盤價
SPY_adj_2019_Open = SPY_adj_2019.Open
SPY_adj_2019_Close = SPY_adj_2019.Close

# 當日漲跌點數
SPY_DailyChg_2019 = SPY_adj_2019_Close - SPY_adj_2019_Open

2. 瞭解數據概況

因為接下來要用漲跌點數去篩選適當的K棒,所以需要先大概知道數字的狀況,

# 取得每日的振幅
SPY_Abs_DailyChg_2019 = abs(SPY_DailyChg_2019)

# 分析振幅統計數據,以利篩選適合的K棒
SPY_Abs_DailyChg_2019.describe()

Output
-------------------
count    252.000000
mean       1.158146
std        1.096910
min        0.000000
25%        0.388314
50%        0.773739
75%        1.642583
max        5.949495
dtype: float64

從上面的資料可以看到,SPY在2019年252個交易日內:

  • 平均漲跌點數為1.158146,因此在篩選第一根K棒的時候,可以取振幅大於這個數字的,會是相對比較大根的K棒
  • 第2根K棒要取相對比較小根的,所以可以取25百分點的這個數字為標準
  • 第3根K棒的振幅要超過第1根的一半,因此我們可以用-0.58為標準來篩選

3. 利用K線特徵抓取Evening star出現的日期

根據上面的數字,就可以篩選符合條件的K棒囉。

# 抓取 第1根大振幅陽線、第2根小振幅陽線或陰線、第3根陰線且振幅大於第1根的1/2
evening_condition_1 = [0,0]
for i in range(2, len(SPY_DailyChg_2019)):
    if ( SPY_DailyChg_2019[i-2] > 1.158 ) & ( abs(SPY_DailyChg_2019[i-1]) < 0.388 ) & ( SPY_DailyChg_2019[i] < -0.58 ):
        evening_condition_1.append(1)
    else:
        evening_condition_1.append(0)

# condition 1 符合的次數
evening_condition_1.count(1)

# 第2根的開盤與收盤價 均大於 第1根的收盤與第3根的開盤
evening_condition_2 = [0,0]
for i in range(2, len(SPY_adj_2019_Open)):
    if ( SPY_adj_2019_Open[i-1] > SPY_adj_2019_Close[i-2] ) & ( SPY_adj_2019_Open[i-1] > SPY_adj_2019_Open[i] ) & ( SPY_adj_2019_Close[i-1] > SPY_adj_2019_Close[i-2] ) & ( SPY_adj_2019_Close[i-1] > SPY_adj_2019_Open[i] ):
        evening_condition_2.append(1)
    else:
        evening_condition_2.append(0)
evening_condition_2.count(1)

# Evening Star Signal
evening_star_signal = []
for i in range(len(evening_condition_1)):
    if ( evening_condition_1[i] == 1 ) & ( evening_condition_2[i] == 1 ):
        evening_star_signal.append(1)
    else:
        evening_star_signal.append(0)
        
# Find Evening Star date
for i in range(len(evening_star_signal)):
    if evening_star_signal[i] == 1:
        print(SPY_adj_2019.index[i])

Output
----------
2019-08-20 00:00:00+00:00

最後發現,2019年只撈出8/20這一天出現Evening Star的型態。

4. 回頭檢視K線圖中,python抓到日期的K線圖是否與Evening star相符

下面就把2019年8月的K線圖拉出來看吧!

# 檢視K線圖
import mplfinance as mpf

SPY_adj_2019_Aug = SPY_adj_2019['2019-08']
mpf.plot(SPY_adj_2019_Aug,type='candle')

如下圖,紅色框框的部份就是我們抓到的日期,可以看出來型態的確是很明顯的Evening star的型態,表示上面篩選的數字是還算準的。

本篇總結
本篇成功的抓取到剛開始設定的K線型態,當然K線型態還有很多種,大家也都可以自己玩玩看喔!
下一篇會開始介紹K線型態如何用在股票交易的部分,請繼續收看,謝謝!

P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。

筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。


上一篇
量化交易30天 Day2 - 繪製K線圖
下一篇
量化交易30天 Day4 - 運用K線型態來交易
系列文
量化交易30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
lumpa7223
iT邦新手 5 級 ‧ 2023-05-18 15:43:22

取2019年的數據

SPY_adj_2019 = SPY_adj['2019'] <--有問題

SPY_adj_2019 = SPY_adj.ioc['2019'] <--是否改成這樣

我要留言

立即登入留言