Table of Contents
相較於疫情下的 2021 東京奧運,2024 巴黎奧運在疫情解封後勢必會非常的盛大。透過分析近三屆奧運期間大盤及相關產業的股價表現,我們可以揭示出股市在奧運盛事期間的動態變化。本文將運用 TEJ API 探索奧運行情,以及對奧運期間股市表現的深入理解。
本文使用 Windows 11 作業系統以及 VS code 作為編輯器。
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}")
從上圖可以看出 2012 年、2016 年奧運表現較好,特別是奧運開幕前 2~3 個工作日,股價都是呈現上漲的趨勢,從報酬率(%)的線可以更明顯看出上漲。2021 年奧運表現較差,不過奧運開幕前 2~3 個工作日也有上漲的趨勢,但相對力道較小,不過這年可能是因為新冠疫情爆發所導致股市波動較大,因此較難看出對股市的影響。
奧運的舉辦能推動相關產業的需求增加,奧運是運動品牌廠大顯身手的關鍵年,每逢奧運年業績必成長。有 Nike、GAP、Lululemon、Under Armour、Adidas、Fast Retailing 等。本文整理出六大奧運相關產業,分別為受運動風潮影響的成衣紡織、製鞋及運動器材產業;受TV需求增加的面板產業;受觀光風潮與國際盛事影響的航空、旅遊產業,並挑選該產業特定幾間企業為例。
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()
經由上圖可以看出 2016年與2021 年在奧運開幕前2~3個工作日都呈現一個上漲的趨勢,2012 年雖然沒有上漲的趨勢,但也使原本的下跌趨緩。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌。由此我們可以推測奧運開幕對面板產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。
經由上圖可以看出這三屆奧運開幕前 2~3 個工作日都呈現一個上漲的趨勢。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌,下跌的佔多數。由此我們可以推測奧運開幕對成衣紡織產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。
經由上圖(9802 在 2012 年 10 月才掛牌上市,因此左上圖為空)可以看出 2012 年與 2016 年在奧運開幕前 2~3 個工作日都呈現一個上漲的趨勢,2021年雖然沒有明顯上漲的趨勢,但也使原本的下跌趨緩。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌。由此我們可以推測奧運開幕對製鞋產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。
經由上圖可以看出這三屆奧運開幕前2~3個工作日都呈現一個上漲的趨勢,以2012年最為顯著。奧運閉幕後就沒有一個特別的趨勢,有的上漲有的下跌,但是上漲的佔多數。由此我們可以推測奧運開幕對運動器材產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。
經由上圖可以看出這三屆奧運開幕前2~3個工作日都呈現一個上漲的趨勢。奧運閉幕後就沒有一個特別的趨勢,下跌的佔多數。由此我們可以推測奧運開幕對旅遊產業的股市會帶來短期的正面影響,而奧運閉幕後則較難看出對股市的影響。
經由上圖可以看出這三屆奧運開幕前2~3個工作日都呈現一個上漲的趨勢。奧運閉幕後就沒有一個特別的趨勢,像是2021年都在閉幕後下跌,而2012年、2016年則是上漲。由此我們可以推測奧運開幕對航空產業的股市會帶來短期的正面影響,畢竟國際大型競賽,而奧運閉幕後則較難看出對股市的影響。
從近三屆奧運期間台股加權指數與個股相關產業股價圖的觀察中,我們發現在奧運開幕前2~3個工作日,股價普遍呈現上漲趨勢,尤其在2012年和2016年表現較為顯著,2021年有可能是受疫情影響。然而,奧運閉幕後,股市表現就較為不穩定,有的上漲,有的下跌。總的來說,這顯示奧運開幕對台股大盤和本文所提及的產業股市確實帶來了一定程度的短期正面影響,但奧運閉幕後的影響則較難以預測。而從長期上來看,奧運只是一個持有期間必經的單獨事件,做出投資決策時最好還是回歸公司基本面、護城河等等考慮為佳。
本次實作透過 TEJ API 實現奧運會行情分析,僅用 TEJ API 所提供的有效資料和視覺化的套件,就可以做出這樣的結果並實作自身所想像的各類型之視覺化分析,省時又省力的情況下,也能提供投資人更多元的評估指標。選購 TEJ E-Shop 的相關方案,用高品質的資料庫,建構出適合自己的分析應用或交易策略。
溫馨提醒,本次策略僅供參考,不代表任何商品或投資上的建議。
電子報訂閱