美股最近跌的慘慘慘,又到了聖誕假期,剛好又休市。我們當然趁現在來研究美股大跌時,要如何來投資,才是最佳的選擇呀!今天要介紹VIX,以及查看VIX如何幫助我們做美股長期投資。
什麼是VIX
首先,究竟是什麼是VIX呢?VIX是一個預估12個月的波動程度,假如市場上的不確定因素越高,代表將來的股價會有非常高的不確定性,則VIX越高,假如市場普遍穩定,則VIX就會比較低。通常VIX大概會在15附近,當大家極度恐慌時(例如恐怖攻擊、金融海嘯等),VIX會急速跳動到30~50,然後再緩和下來。
更嚴謹的數學公式以連結的方式讓大家參考
於是有人就說可以參考VIX非常高的時候,當作是買點進行買入。
今天我們就用python來試試看是否有用?
獲取歷史資料
取得歷史資料的方式非常簡單,可以到「芝加哥期交所」官網來下載 S&P500歷史資料,還有VIX歷史資料,將下載下來的csv檔放在資料夾中,就可以開始今天的實驗了!
目錄
今天的教學主要分成以下幾個步驟
- 利用pandas匯入csv檔資料
- 計算S&P500的年報酬率,並繪圖
- 回測並檢討
- 稍微修改買入條件,並比較效果如何
假如第一次接觸python的朋友,可以參考python安裝教學,安裝好之後就可以一起來玩囉!
接下來我們就來玩玩這些資料吧
1. 利用pandas匯入歷史資料
首先,我們可以使用pd.read_csv()
這個函示來匯入歷史資料如下:
%matplotlib inline
import pandas as pd
vix = pd.read_csv("vixcurrent.csv", header=1, index_col='Date', parse_dates=['Date'])
vixc = vix['VIX Close']
其中,header=1
是指從第一行是column 的名稱。index_col
是將指定的column轉換成index,最後,parse_dates
是將指定的column轉換成datetime的格式。
再來,也是用類似的方法將SPX的指數給拿出來:
b = pd.read_excel("dailypricehistory.xls", header=4)['SPXSM']
b.index = pd.to_datetime(b.index, errors="coerce")
b = b.reindex(vixc.index)
b = b.dropna()
b.plot()
不過我們使用了一些額外的code,來稍微處理一下大盤指數,其中b.dropna()
是將冗餘的資料去掉,另外,使用b.reindex()
是因為,我們希望vixc跟b的長度是一樣的,每一天的index是對齊的。
大盤歷史績效分析
接下來我們希望可以分析美股SP500的年報酬指數,我們可以這樣寫:
(b.dropna()[-1]/b[0]) ** (250/len(b))
其實公式就是:
但由於我們要算年報酬,還要進一步修改,ndays 就是所有的歷史報酬天數,其中的250是一年的交易日估算。
VIX大於40,買入一年大盤能賺錢嗎?
接下來,我們來看當VIX大於40的當天,買入大盤並持有250天,會發生什麼事情呢:
# vix 大於 th 時,進行買入
th = 40
# 持有 days 天
days = 250
# 當天是否買入
buy = (vixc > th)
# 確保最近三十天並沒有buy發生,才是需要買入的訊號
buy &= (buy.shift().rolling(30).mean() == 0)
最後一行值得一提,因為其實VIX大於40後,有時候會常常飆高,但其實我們是希望VIX突然飆高的第一天,而不是變低後39,然後又飆高到40以上,這種訊號不是我們需要的,所以利用上方的最後一行代碼進行過濾。
繪圖
將買點給畫出來:
b.plot()
buy.astype(float).plot(secondary_y=True)
報酬率計算
接下來我們就來計算,當我們使用這個邏輯進行買賣時,效果如何:
# 當天收盤價
price_begin = b[buy]
# 隔250天後 的收盤價
price_end = b.shift(-days)[buy]
# 報酬率計算
ret = (price_end/price_begin)
我們可以發現報酬率滿不錯的,唯一一次沒有賺錢,是在2008年金融海嘯那次,我們可以將報酬率畫出來,方便大家理解
持有250天的報酬率
接下來我們可以將這四次持有250天的大盤報酬曲線畫出來,橫軸為時間,會得到很有趣的結果:
import matplotlib.pyplot as plt
def normalize(s):
return s / s[0]
for d in ret.index.dropna():
plt.plot(normalize(b.loc[d:].head(250).values))
這張圖中藍色的為金融海嘯,所以當買入時,還跌了一段,還是賠了40%的資產,非常的恐怖…。可見這種方法還是不能亂用。
另外更有趣的是,紅色跟藍色的大盤趨勢非常像,而綠色跟橘色也很類似,感覺大盤的變化隨時間是有規律的。
優化策略
接下來,我想要進行一個小修改,因為VIX是市場恐慌的程度,VIX高代表市場可能過於悲觀,但是不代表悲觀已經結束了,所以2008年的VIX才會噴到將近50左右的位置,所以我們不應該在VIX噴發時投資,應該要等它降溫時,投資會比較好,所以新的策略邏輯如下:
- VIX 近120天超過40
- VIX 當天降到了30
th = 40
days = 250
buy = (
((vixc > th).rolling(120).sum() > 0) &
(vixc < 30)
)
buy &= (buy.shift().rolling(30).mean() == 0)
price_begin = b[buy]
price_end = b.shift(-days)[buy]
ret = (price_end/price_begin)#.groupby(price_begin.index.year).first()
ret
我們發現,這四次的買點都是有獲利的,且大於平均年報酬率(6%),說明了這可能是比較好的投資方法。然而取樣的點非常少,才4次,所以也有可能只是運氣好而已,過去不等於未來,投資風險就請大家自行斟酌囉!
相信大家可以用類似的方式,找到更好的投資方式喔!快來試試看吧~