奧運行情?用 TEJ API 分析奧運台股大盤與產業個股行情

奧運行情分析
Photo by Luca Dugaro on Unsplash

本文重點概要

  • 文章難度:★☆☆☆☆
  • 分析近三屆奧運大盤與相關產業之股價奧運行情

前言

相較於疫情下的 2021 東京奧運,2024 巴黎奧運在疫情解封後勢必會非常的盛大。透過分析近三屆奧運期間大盤及相關產業的股價表現,我們可以揭示出股市在奧運盛事期間的動態變化。本文將運用 TEJ API 探索奧運行情,以及對奧運期間股市表現的深入理解。

編輯環境與模組需求

本文使用 Windows 11 作業系統以及 VS code 作為編輯器。

資料庫使用

加權指數(Y9999)奧運行情分析

資料導入

import tejapi
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

tejapi.ApiConfig.api_key  = "Your Key"
tejapi.ApiConfig.api_base = "https://api.tej.com.tw"
tejapi.ApiConfig.ignoretz = True

設置抓取加權指數(Y9999)調整後收盤價函數,將起訖日期設為變數。

def get_TAIEX(gte , lte):
    data = tejapi.get('TWN/APRCD1',
                        coid = 'Y9999',
                        mdate = {'gte':gte, 'lte':lte},
                        # 證券代碼、日期、收盤價(元)、報酬率%
                        opts = {'columns':['coid', 'mdate', 'close_adj', 'roi']},
                        paginate = True,
                        )
    return data

紀錄近三屆奧運會日期,並將年分也記錄起來轉換成DataFrame,以利後續分析。

Olympic_opening =  [pd.Timestamp('2012-07-27', tz = 'UTC'),
                    pd.Timestamp('2016-08-05', tz = 'UTC'),
                    pd.Timestamp('2021-07-23', tz = 'UTC')
                    ]

Olympic_ending =   [pd.Timestamp('2012-08-12', tz = 'UTC'),
                    pd.Timestamp('2016-08-21', tz = 'UTC'),
                    pd.Timestamp('2021-08-08', tz = 'UTC')
                    ]
奧運行情分析

資料視覺化分析

將奧運會起訖日期代入get_TAIEX 函數,設置時間區間取奧運開幕前與閉幕後兩周,並在圖上標出奧運會起訖日期。視覺化圖表設置雙軸分別為每日收盤價與日報酬率(%)。

start = []
end = []
TAIEX_df = pd.DataFrame(columns=['coid', 'mdate', 'close_adj', 'roi'])  # 設置一個空的df
for key, value in Olympic_dict.items():
    start_date = str(value[0] - pd.DateOffset(weeks=2))[:10]  # 開幕日網前抓兩周
    end_date = str(value[1] + pd.DateOffset(weeks=2))[:10]  # 閉幕日網後抓兩周
    Olympic_data = get_TAIEX(start_date, end_date)  # 取得加權指數(Y9999)股價
    TAIEX_df = pd.concat([TAIEX_df, Olympic_data], ignore_index=True)   # 將抓回來的股價資料合併在起初設置的df
    start.append(start_date)
    end.append(end_date)

TAIEX_df['Year'] = [str(Date)[:4] for Date in TAIEX_df['mdate']]
Olympic_year = TAIEX_df['Year'].unique()  # unique可以確保股價資料年分與奧運年分是一樣的年分

fig, axs = plt.subplots(len(Olympic_year), 1, figsize=(15, 5 * len(Olympic_year)), sharex=False)

# 將抓回來的股價資料畫在圖上
for i, year in enumerate(Olympic_year):
    Olympic = TAIEX_df[TAIEX_df['Year'] == year]
    axs[i].plot(Olympic['mdate'].to_numpy(), Olympic['close_adj'].to_numpy(), color='royalblue', label=f"Olympic {year} TAIEX", zorder = 2)
    ax2 = axs[i].twinx()  # 設置雙軸
    ax2.plot(Olympic['mdate'].to_numpy(), Olympic['roi'].to_numpy(), color='seagreen', label=f'Olympic {year} ROI', zorder = 1)
    ax2.axhline(0, color='black', linestyle='--', linewidth=1)  # 畫出"零"線
    axs[i].set_xlabel('Date')
    axs[i].set_ylabel('Stock Price')
    axs[i].legend(loc='upper left')
    ax2.legend(loc='lower right')
    # 將開幕日與閉幕日畫出來
    for start_day, end_day, Oyear in zip(Olympic_df['start_date'], Olympic_df['end_date'], Olympic_df['Year']):
        if Oyear == year:
            axs[i].axvline(x=start_day, color='r', linestyle='--', alpha=0.5, linewidth=2)
            axs[i].axvline(x=end_day, color='r', linestyle='--', alpha=0.5, linewidth=2)
            axs[i].set_title(f"Olympic on {Oyear}")
奧運行情分析
近三屆奧運加權指數(Y9999)股價與報酬率(%)折線圖

從上圖可以看出 2012 年、2016 年奧運表現較好,特別是奧運開幕前 2~3 個工作日,股價都是呈現上漲的趨勢,從報酬率(%)的線可以更明顯看出上漲。2021 年奧運表現較差,不過奧運開幕前 2~3 個工作日也有上漲的趨勢,但相對力道較小,不過這年可能是因為新冠疫情爆發所導致股市波動較大,因此較難看出對股市的影響。

產業個股奧運行情分析

抓取奧運相關產業

奧運的舉辦能推動相關產業的需求增加,奧運是運動品牌廠大顯身手的關鍵年,每逢奧運年業績必成長。有 Nike、GAP、Lululemon、Under Armour、Adidas、Fast Retailing 等。本文整理出六大奧運相關產業,分別為受運動風潮影響的成衣紡織、製鞋及運動器材產業;受TV需求增加的面板產業;受觀光風潮與國際盛事影響的航空、旅遊產業,並挑選該產業特定幾間企業為例。

  • 面板產業(LCD面板) – 2409(友達) , 3481(群創) , 6116(彩晶)
    2409(友達) , 3481(群創) , 6116(彩晶)為台股面板三虎,因為轉播進步而驅動的面板業將有機會受惠於今年大型運動賽事題材。
  • 成衣紡織(成衣製造、聚酯絲棉) – 1476(儒鴻) , 1477(聚陽) , 1402(遠東新)
    1476(儒鴻) , 1477(聚陽) , 1402(遠東新)為許多國際運動品牌之紡織廠商,如:NIKE、Adidas、Lululemon、Under Armour 、GAP、UNIQLO、H&M 、A&F等等。
  • 製鞋(鞋及旅行箱) – 9904(寶成) , 9910(豐泰) , 9802(鈺齊-KY)
    9904(寶成) , 9910(豐泰) , 9802(鈺齊-KY)為許多國際運動品牌之製鞋代工廠商,如:Nike、Adidas、Asics、New Balance、Timberland、Under Armour等等。
  • 運動器材(健身器材、自行車) – 1515(力山) , 1736(喬山) , 9921(巨大)
    奧運帶動運動健身器材的產品銷售熱度,包含跑步機、自行車等等。1515(力山) , 1736(喬山) , 9921(巨大)為國內健身器材與自行車龍頭,將有機會因為解封加上大型運動賽事而帶來龐大商機。
  • 旅遊(旅行社) – 2731(雄獅) , 5706(鳳凰)
    為了觀賽而帶動的旅遊業雄獅(2731)、鳳凰(5706)有機會受惠於2024巴黎奧運。
  • 航空(空運業) – 2610(華航) , 2618(長榮航)
    2024巴黎奧運作為國際大事加上疫情解封後的第一次奧運,空運業的華航(2610)、長榮航空(2618)有機會受惠於2024巴黎奧運。
industry_dict = {
    'LCD_panel': ['2409', '3481', '6116'],
    'clothes': ['1402', '1476', '1477'],
    'shoes': ['9802', '9904', '9910'],
    'fitness_bike': ['1515', '1736', '9921'],
    'travel': ['2731', '5706'],
    'aviation': ['2610', '2618']
}

設置抓取企業資料函數與抓取股價函數

設置抓取企業資料函數,將證券代碼設為變數,可以將證券代碼資料以 list 型態輸入。

def get_data_industry(*coid):  # *coid的可以輸入list型態的變數
    data_industry = tejapi.get('TWN/AIND',
                                coid = coid,
                                # 證券代碼、公司中文簡稱、TEJ子產業_名稱(中)	
                                opts = {'columns':['coid', 'inamec', 'tejinm3_c']},
                                paginate = True)
    data_industry = data_industry.rename(columns={"inamec":"Company_c", "tejinm3_c": "Industry_c"}).reset_index().drop(columns=['None'])
    return data_industry

設置抓取股價函數,將起訖日期與證券代碼設為變數,可以將證券代碼資料以list型態輸入。

def get_stock_price(gte , lte , *coid):
    data = tejapi.get('TWN/APRCD1',
                        coid = coid,
                        mdate = {'gte':gte, 'lte':lte},
                        # 證券代碼、日期、收盤價(元)
                        opts = {'columns':['coid', 'mdate', 'close_adj']},
                        paginate = True,
                        )
    return data

資料視覺化分析

將奧運會起訖日期和本文挑選出的證券代碼代入 get_stock_price 函數,設置時間區間取奧運開幕前與閉幕後兩周,並在圖上標出奧運會起訖日期。

for key, value in Olympic_dict.items():
    start_date = str(value[0] - pd.DateOffset(weeks=2))[:10]  # 開幕日網前抓兩周
    end_date = str(value[1] + pd.DateOffset(weeks=2))[:10]  # 閉幕日網前抓兩周
    for industry, icoid in industry_dict.items():
        stock_data = get_stock_price(start_date, end_date, icoid)  # 取得股價資料
        stock_data['mdate'] = pd.to_datetime(stock_data['mdate'])
        industry_name = get_data_industry(industry_dict[industry])  # 取得產業名稱
        fig, axes = plt.subplots(nrows=1, ncols=len(icoid), figsize=(7*len(icoid), 5), squeeze=False, layout="constrained")
        for i, coid in enumerate(icoid):
            data = stock_data[stock_data['coid'] == coid]
            company_c = industry_name.loc[i, 'Company_c']
            industry_c = industry_name.loc[i, 'Industry_c']
            event_year = start_date[:4]
            # 不同年分設置不同顏色
            if event_year == '2012':
                color = 'olivedrab'
            elif event_year == '2016':
                color = 'mediumturquoise'
            elif event_year == '2021':
                color = 'dodgerblue'
            # 將抓回來的股價資料畫在圖上
            axes[0,i].plot(data['mdate'].to_numpy(), data['close_adj'].to_numpy(), color=color, label=f'{company_c} - {coid}', marker='o')
            axes[0,i].set_xlabel('Date')
            axes[0,i].set_ylabel(f'Stock Price {coid}')
            axes[0,i].legend(fontsize=12)
            axes[0,i].xaxis.set_major_locator(mdates.DayLocator(interval=5))  # 設置x軸時間,每5天顯示日期
            axes[0,i].xaxis.set_major_formatter(mdates.DateFormatter('%b%d'))  # 日期顯示月日
            axes[0,i].tick_params(axis='x', which='major', labelsize=12)
            for start_day, end_day, Oyear in zip(Olympic_df['start_date'], Olympic_df['end_date'], Olympic_df['Year']):
                if Oyear == str(stock_data['mdate'].loc[0])[:4]:
                    axes[0,i].axvline(x=start_day, color='r', linestyle='--', alpha=0.5, linewidth=2)
                    axes[0,i].axvline(x=end_day, color='r', linestyle='--', alpha=0.5, linewidth=2)
                    axes[0,i].set_title(f"{Oyear}年奧運-{industry_c}產業-{company_c}-{coid}")
        plt.tight_layout()
        plt.show()
  • LCD 面板產業
奧運行情分析
近三屆奧運 LCD 面板產業- 2409、3481、6116 股市圖

經由上圖可以看出 2016年與2021 年在奧運開幕前2~3個工作日都呈現一個上漲的趨勢,2012 年雖然沒有上漲的趨勢,但也使原本的下跌趨緩。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌。由此我們可以推測奧運開幕對面板產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。

  • 成衣紡織產業
奧運行情分析
近三屆奧運 成衣紡織產業-1402、1476、1477股市圖

經由上圖可以看出這三屆奧運開幕前 2~3 個工作日都呈現一個上漲的趨勢。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌,下跌的佔多數。由此我們可以推測奧運開幕對成衣紡織產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。

  • 製鞋產業
奧運行情分析
近三屆奧運 製鞋產業-9802、9904、9910股市圖

經由上圖(9802 在 2012 年 10 月才掛牌上市,因此左上圖為空)可以看出 2012 年與 2016 年在奧運開幕前 2~3 個工作日都呈現一個上漲的趨勢,2021年雖然沒有明顯上漲的趨勢,但也使原本的下跌趨緩。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌。由此我們可以推測奧運開幕對製鞋產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。

  • 運動器材產業
奧運行情分析
近三屆奧運 運動器材產業-1515、1736、9921股市圖

經由上圖可以看出這三屆奧運開幕前2~3個工作日都呈現一個上漲的趨勢,以2012年最為顯著。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌,但是上漲的佔多數。由此我們可以推測奧運開幕對運動器材產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。

  • 旅行產業
奧運行情分析
近三屆奧運 旅行產業-2731、5706股市圖

經由上圖可以看出這三屆奧運開幕前2~3個工作日都呈現一個上漲的趨勢。奧運閉幕後就沒有一個特別的趨勢,下跌的佔多數。由此我們可以推測奧運開幕對旅遊產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。

  • 航空產業
奧運行情分析
近三屆奧運 航空產業-2610、2618股市圖

經由上圖可以看出這三屆奧運開幕前2~3個工作日都呈現一個上漲的趨勢。奧運閉幕後就沒有一個特別的趨勢,像是2021年都在閉幕後下跌,而2012年、2016年則是上漲。由此我們可以推測奧運開幕對航空產業的股市會帶來短期的正面影響,畢竟國際大型競賽,而奧運閉幕後則較難看出對股市的影響。

結論

從近三屆奧運期間台股加權指數與個股相關產業股價圖的觀察中,我們發現在奧運開幕前2~3個工作日,股價普遍呈現上漲趨勢,尤其在2012年和2016年表現較為顯著,2021年有可能是受疫情影響。然而,奧運閉幕後,股市表現就較為不穩定,有的上漲,有的下跌。總的來說,這顯示奧運開幕對台股大盤和本文所提及的產業股市確實帶來了一定程度的短期正面影響,但奧運閉幕後的影響則較難以預測。而從長期上來看,奧運只是一個持有期間必經的單獨事件,做出投資決策時最好還是回歸公司基本面、護城河等等考慮為佳。

本次實作透過 TEJ API 實現奧運會行情分析,僅用 TEJ API 所提供的有效資料和視覺化的套件,就可以做出這樣的結果並實作自身所想像的各類型之視覺化分析,省時又省力的情況下,也能提供投資人更多元的評估指標。選購 TEJ E-Shop 的相關方案,用高品質的資料庫,建構出適合自己的分析應用或交易策略。

溫馨提醒,本次策略僅供參考,不代表任何商品或投資上的建議

Github 原始碼

點此前往 Github

延伸閱讀

相關連結

返回總覽頁
Procesing