VIX美股大跌投資法:Python實作教學看這裡!

美股最近跌的慘慘慘,又到了聖誕假期,剛好又休市。我們當然趁現在來研究美股大跌時,要如何來投資,才是最佳的選擇呀!今天要介紹VIX,以及查看VIX如何幫助我們做美股長期投資。

線上程式碼直接跑免安裝

什麼是VIX

首先,究竟是什麼是VIX呢?VIX是一個預估12個月的波動程度,假如市場上的不確定因素越高,代表將來的股價會有非常高的不確定性,則VIX越高,假如市場普遍穩定,則VIX就會比較低。通常VIX大概會在15附近,當大家極度恐慌時(例如恐怖攻擊、金融海嘯等),VIX會急速跳動到30~50,然後再緩和下來。

嚴謹的數學公式以連結的方式讓大家參考

於是有人就說可以參考VIX非常高的時候,當作是買點進行買入。
今天我們就用python來試試看是否有用?

獲取歷史資料

取得歷史資料的方式非常簡單,可以到「芝加哥期交所」官網來下載 S&P500歷史資料,還有VIX歷史資料,將下載下來的csv檔放在資料夾中,就可以開始今天的實驗了!

目錄

今天的教學主要分成以下幾個步驟

  1. 利用pandas匯入csv檔資料
  2. 計算S&P500的年報酬率,並繪圖
  3. 回測並檢討
  4. 稍微修改買入條件,並比較效果如何

假如第一次接觸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是一年的交易日估算。

從下圖可以看出,大盤的平均年報酬率大概是6%左右。

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噴發時投資,應該要等它降溫時,投資會比較好,所以新的策略邏輯如下:

  1. VIX 近120天超過40
  2. 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次,所以也有可能只是運氣好而已,過去不等於未來,投資風險就請大家自行斟酌囉!

相信大家可以用類似的方式,找到更好的投資方式喔!快來試試看吧~

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!