2020年3月29日 星期日

[Pandas 練習/投資] 昨天美股跌了,今天台股跌的機會大嗎?如果美股漲,台股漲的機會是多少?


世界股市息息相關,道瓊工業指數和台灣加權指數的相關係數達 0.78,因此台股和美股會有相似的趨勢。
然而,有相關性不表示有因果關係。不同國家的股市有相同趨勢更可能是『共因』。例如這次的武漢肺炎,對世界經濟以及投資人信心造成實質影響,投資者同時在不同國家市場抽手,使得整體股市下跌。
但因果關係也可能存在。這波肺炎引起的股災,讓美股瘋狂,一下子熔斷,一下子飆漲。若台灣股民看到美股大跌,失去信心將導致台股也跌。要證明這因果關係是困難的,今天不妨把問題簡化成一個可以回答的問題:昨天美股漲/跌了,今天台股漲/跌的機率是多少?平均漲/跌幅度為何?我們將使用 Pandas 回答這個問題,讓你在和同事猜測台股走勢時更有根據。
那就開始吧!首先,載入所需的 module,股價歷史資料 ^TWII.csv^DJI.csv 是手動從 Yahoo Finance 下載的。之後再學習如何自動化這步。
import datetime
import pandas as pd

twii = pd.read_csv("^TWII.csv")
dji = pd.read_csv("^DJI.csv")
整理我們所需要的指數資訊。首先,產生從台股歷史第一天開始到今天的連續日期。
start_date = twii["Date"][0]
end_date = datetime.date.today().isoformat()
date_rng = pd.date_range(start=start_date, end=end_date, freq='D')
df = pd.DataFrame(date_rng,columns=['Date'])
把台股加權指數以及道瓊工業指數以日期為 index,填入 df。因為 column 名稱重覆了,在 join 時需要加上 suffix。組合好後,重新命名表格,避免之後混亂。
# join TWII price history
df = df.set_index('Date').join(twii.set_index("Date")['Adj Close'])

# join DJI history data
# need to using rsuffix to avoid duplicated column name
df = df.join(dji.set_index("Date")['Adj Close'],rsuffix="_DJI")

# 重新命名表格,避免之後混亂
df=df.rename(columns={"Adj Close": "TWII", "Adj Close_DJI": "DJI"})

# 偷看一下
df.tail()
偷看一下,現在表格大概長這樣,沒開盤的日子會是NaN,我們要來處理一下假日。
這裡的邏輯如下:
  1. 台股、美股都沒開盤的日子,例如周末,就直接刪去。因此,若美股星期五大跌,我們想知道下星期一的台股如何反應。
  2. 第 N-1 天美股有開盤,但第 N 天台股沒開盤:就當作沒漲沒跌。
  3. 第 N-1 天美股有開盤,但第 N-1 天台股沒開盤:把 N-1 天的台股指數用前一個交易日的指數填入,比較台股第 N 天和前一個交易日的漲跌。所以我們要做的是ffill(),向前填入。
# 移除所有台股/美股都沒有值的日子,如共同假日
df=df.dropna(how='all').ffill()
df.tail()
前處理完了以後,就可以開始計算了!首先回答,美股前一天下跌不同程度時,台股如何反應。把他做成一個表格。
# df_daily: 今天的股價 除以 昨天的股價
df_daily = df/df.shift(1) 
# df_profit: 換算成單日漲跌幅
df_profit = (df_daily-1)

summary = [];

# 
down_list = [0,-0.01,-0.02,-0.03,-0.04,-0.05]
for val in down_list:
    df_selected = df_profit[df_profit["DJI"].shift(1)<val]
    summary.append([val, 
                    df_selected["DJI"].count(), 
                    df_selected["TWII"].mean(), 
                    df_selected[df_selected["TWII"]>0]["TWII"].count()/df_selected["TWII"].count()]);

df_dj_down = pd.DataFrame(summary, columns = ['DJI daily <', 'count', 'TW Ave profit' ,'TW up prob.'])
print(df_dj_down)
結果如下表。出乎意料的,趨勢相當明顯呀!說明如下:
  1. 在前一天道瓊下跌的 1553 個日子 ,台股平均起來,跌了 0.25%,只有 40% 的機率上漲。
  2. 隨著道瓊跌幅增加,台股的平均跌幅也明顯加大,下跌的機率也大增。例如道瓊跌大於 3%的 40 個日子裡,台股的平均跌幅達 1.8%,只有 27% 的機率上漲。
  3. 有點意外的是,原來指數跌超過 2% 就已經很少見了呀!在下跌的日子裡只佔不到 10%。
反過來說,如果前一天美股漲,台股如何反應呢?在美股漲的 3026 個日子裡,台股平均起來的確也跟著漲。但台股的平均漲幅,和美股的漲幅好像連動性不高!美股漲逾 3% 的 66 個日子裡,台股的平均漲幅只有 1%。前一天美股大漲 5% 的 13 個日子裡,台股平均漲幅也只有0.8%。
看起來,美股下跌時和台股的相關性較高,美股大漲時,台灣股民可能就比較無感!這之間到底是什麼緣故,就留待大家解讀了!

沒有留言

張貼留言