iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
AI & Data

用Python程式進行股票技術分析系列 第 20

Day20 移動平均線的扣抵

  • 分享至 

  • xImage
  •  

移動平均線

在Day7的時候已經談過移動平均線的定義,在這邊則是說明移動平均線的上揚與下彎所代表的涵義:

  • 移動平均線上揚與支撐
    • 移動平均線上揚,代表更有效的支撐,也容易助漲
    • 當股價回檔到上揚移動平均線時,容易有支撐
    • 當股價跌破上揚移動平均線時,容易出現假跌破 (詳細參考明天Day21的內容)
  • 移動平均線下彎與壓力
    • 移動平均線下彎,代表更有效的壓力,也容易助跌
    • 當股價反彈到下彎移動平均線時,容易有壓力

移動平均線的扣抵定義

前面談到移動平均線的上揚與下彎,最主要帶出今天的的重點:扣抵。扣抵的定義為扣除和相抵(遞補);其實質功能為可以預知移動平均線會上揚或是下彎,藉此能做到提前布局,或是提早減碼的策略。

移動平均線扣抵試算

用以下模擬資料與5日移動平均線,進行扣抵試算:
Imgur
扣小加大:假如扣除(扣)的是低價,新增(抵)的是高價,會造成平均數字增加,因此移動平均線會上揚。以下案例為「扣」93「加」94,移動平均線上揚(94.6 → 94.8):
Imgur
扣平:假如扣除(扣)與新增(抵)是相同的價格,會造成平均數字不變,因此移動平均線會走平。以下案例為「扣」94「加」94,移動平均線走平:
Imgur
扣大加小:假如扣除(扣)的是高價,新增(抵)的是低價,會造成平均數字降低,因此移動平均線會下彎。 以下案例為「扣」95「加」94,移動平均線下彎(94.8 → 94.6):
Imgur

移動平均線扣抵實務應用

必須假設未來一段時間股價波動不大,股票暴漲暴跌則扣抵理論無效。另外盤整區間扣抵是無效的。扣抵比較適用20日移動平均線以上的天期,比較具備意義。

程式實作:試算扣抵並預測20日移動平均線何時下彎

以下為驗證資料的設定:

  • 當前日期:2023/06/09
  • 20日移動平均線扣抵開始日期:2023/05/15

試算扣抵程式碼如下所示:

# 設定資料區間:區間的最後一天當作為「當前」的日期
df_k_line_range = df_k_line['2023-04-21':'2023-06-09']

# 「當前」的日期的股價之價位
current_price = df_k_line_range.iloc[-1]['Close']

# 設定20日移動平均線扣抵開始日期並取得其索引
deduction_date_idx = date_to_index(df_k_line_range,df_k_line_range.iloc[-20].name.strftime("%Y-%m-%d"))

# 取得總筆數
row, _ = df_k_line_range.shape

# 扣抵判斷
predict_days = 0
for idx in range(deduction_date_idx+1,row) :
    deduction_price = df_k_line_range.iloc[idx]['Close']
    if deduction_price < current_price  :
        print('扣小加大 : {} 扣小({:.2f}) , 加大({:.2f})'.format(df_k_line_range.iloc[idx].name.strftime("%Y-%m-%d"),deduction_price,current_price))
    elif df_k_line_range.iloc[idx]['Close'] > current_price  :
        print('扣大加小 : {} 扣大({:.2f}) , 加小({:.2f})'.format(df_k_line_range.iloc[idx].name.strftime("%Y-%m-%d"),deduction_price,current_price))
        # 以此案例,當出現「扣大加小」時跳出
        predict_days = predict_days + 1
        break
    predict_days = predict_days + 1
print('預計第{}天後移動平均線下彎'.format(predict_days))

程式執行後顯示『預計第4天後移動平均線下彎』。接下來用以下程式碼驗證移動平均線實際下彎的時間:

# 設定資料區間
df_sma_range = df_sma['2023-06-09':]
# 從「當前」的日期往後確認20日移動平均線的趨勢
relay_days = 0
for idx in range(1,len(df_sma_range)) :
    if df_sma_range.iloc[idx]['SMA20'] > df_sma_range.iloc[idx-1]['SMA20'] :
        print('{} : 移動平均線上揚'.format(df_sma_range.iloc[idx].name.strftime("%Y-%m-%d")))
    elif df_sma_range.iloc[idx]['SMA20'] < df_sma_range.iloc[idx-1]['SMA20'] :
        print('{} : 移動平均線下彎'.format(df_sma_range.iloc[idx].name.strftime("%Y-%m-%d")))
        # 以此案例,當出現「移動平均線下彎」時跳出
        relay_days = relay_days + 1
        break
    else :
        print('{} : 移動平均線走平'.format(df_sma_range.iloc[idx].name.strftime("%Y-%m-%d")))
    relay_days = relay_days + 1
print('實際第{}天後移動平均線下彎'.format(relay_days))

程式執行後顯示『實際第5天後移動平均線下彎』。預測與實際相差僅有一天,由此可確認扣抵確有預知移動平均線會上揚或是下彎的功能。
完整的程式碼請參照「第二十天:移動平均線的扣抵.ipynb」。


上一篇
Day19 趨勢、位階、型態(3)
下一篇
Day21 葛蘭碧八大法則
系列文
用Python程式進行股票技術分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言