波動率是對給定證券的回報方差的統計量度。我將使用對數(每日回報)的絕對值來模擬比特幣的波動性。
用於測試不同波動率模型的數據如下所示。比特幣是美元。
比特幣數據
通過了解比特幣的預測波動性,我們能夠更好地限制風險並改進我們的交易策略。
日誌(比特幣每日返還)
在這裡,我包含了從雅虎獲取比特幣價格的Python 代碼。
import yfinance as yf #import data via Yahoo
sp_list = [‘BTC-USD’]今天= datetime.today()# dd/mm/YY #
獲取最後一個工作日的
偏移量= max(1, (today.weekday() + 6) % 7 – 3)
timed = timedelta(offset)
today_business = today – timed
print(“d1 =”, today_business )
今天= today_business.strftime(“%Y-%m-%d”)Symbols_list = sp_list
start = ‘2017-01-01’
end = 今天
r = yf.download(symbols_list, start,end)
介紹
我將介紹一種新的波動率預測方法,它可以應用於任何平穩的時間序列。這種新方法在“使用數據驅動創新波動性的新型算法交易策略”中首次引入,用DD-EWMA表示。在這個例子中,我們將研究比特幣的波動性。在DD-EWMA方法要求給定的時間序列是靜止的。
通過日Ë這篇文章的末尾,你將能夠產生DD-EWMA波動預測比特幣的價格。
DD-EWMA 比特幣波動率預測
平穩與非平穩時間序列
快速回顧一下什麼是平穩時間序列。在數學術語中,給定為X = {xt} 的時間序列在什麼時候是平穩的。
平穩時間序列條件
簡而言之,i) 讀作如下;時間序列X 的平均值是一些我們稱之為mu 的常數值。 ii) 內容如下;時間序列X 在(r,s) 處的協方差等於序列X 在未來某個時間的協方差。這就是說X 的協方差在時間上是恆定的。
現在我們已經定義了使時間序列平穩的原因,我們可以說比特幣價格不是平穩的時間序列,因為均值隨時間不是恆定的,隨著時間的推移,市場的上漲趨勢表明了這一點。
在這裡,我們證明了比特幣的給定時間序列具有向上的線性趨勢,這意味著均值不是隨時間恆定的。分解方法可以從數據中消除這種趨勢,從而使其穩定。
分解簡介:將任何時間序列 [Xt] 視為三個組件可能會有所幫助。下面我展示了任何給定非平穩時間序列的加性模型的數學公式。
對於比特幣的價格,只有一個 趨勢成分。
對於那些想要快速復習如何將簡單的線性趨勢線擬合到時間序列的人,這裡是下面的Python 代碼。
############################################### ################### 符合比特幣價格的基線線性模型####################### #########################################import statsmodels.api as sm #feed X 使其包含一個沒有預測變量的數據幀。 X = range(0,len(spy)) y = spy X = sm.add_constant(X) # 添加一個常量model = sm.OLS(y, X).fit() predictions = model.predict(X) print_model = model.summary() print(print_model)to_plot = pd.DataFrame({‘Bitcoin 價格’:spy,’Linear Trend’:predictions}) to_plot.plot(ylabel=”Price”, title=”Bitcoin – Non-stationary time系列”)
自相關
在開始對時間序列建模之前,我首先生成自相關圖以了解數據中是否存在任何底層模式。對於時間序列建模,我應該期望看到沒有模式的平穩時間序列。
請注意,自動更正是數據點與其自身滯後版本的相關性。
Log的ACF(比特幣的每日日誌回報)
上圖是平穩時間序列的完美示例。數據的含義是所有數據點基本上與自身的滯後版本無關,這意味著我們有一個噪聲時間序列。
每個每日回報與前幾天無關。
比特幣價格對數回報的波動性
現在轉向本文的主要目標,我們要預測比特幣價格的對數回報的波動性。 BTC-USD 的對數回報是平穩的,因為對數回報的平均值接近於零。
比特幣的每日日誌回報
在我們介紹新的數據驅動方法之前,我們首先展示並定義我們將作為基線進行比較的歷史方法。歷史上,ARCH 和GARCH 都被用於預測波動率。出於本文的目的,我們將演示GARCH 和ARCH 如何與新的DD-EWMA 方法進行比較。
自回歸條件異方差模型(ARCH) 給出為
拱
廣義自回歸條件異方差模型(GARCH) 給出為
加爾奇
在ARCH(q) 過程中,條件方差僅指定為過去樣本方差的線性函數,而GARCH(p, q) 過程也允許輸入滯後條件方差。
DD-EWMA
在本節中,我們將介紹數據驅動的指數加權移動平均線。指數加權移動平均線(EWMA) 定義為
sigma 是波動率,lambda 是一個常數,將權重轉移到最近的數據上,yt 是在時間t 觀察到的數據。 EWMA 的一個屬性是每個後續t 的權重呈指數下跌,這意味著最近的數據對當前步驟的波動性產生更大的影響。
設f(x) 是對數回報條件分佈的密度函數,t+1 處的sigma 是基於過去t 次觀測的t+1 時刻的波動率預測。
比特幣對數收益分佈
通過了解對數回報的分佈,我們能夠選擇合適的基礎統計模型。我的意思是選擇正確的distirubtion 來重現我們的數據。分佈的示例是(正態、對數正態、威布爾、指數、Student-t)。
首先,我首先簡單地繪製直方圖。
很明顯,分佈有重尾。重尾的意思是尾巴下的面積大於典型的正態分佈,均值= 0,方差= 1,在數學上用N(0,1) 表示。在這裡我可以看到student-t 分佈是最合適的。
student-t distirubtion 最適合再現對數回報,因此我們將其定義為
T 分佈(Mu、Sigma、自由度)
T 分佈採用三個參數(Mu、Sigma、自由度)。由於自由度(DoF) 接近無窮大,據說T 分佈簡單地變成了正態分佈,小自由度代表反映金融資產對數回報的重尾分佈。
數據驅動的指數加權移動平均線
在“使用數據驅動的創新波動率的新算法交易策略”中首次引入的波動率建模新技術由以下等式給出。
DD-EWMA 波動率預測公式
這裡rt 定義為我們的每日對數回報,alpha 定義為我們的常數,它介於0 和1 之間,隨機變量X 與均值mu 的符號相關定義為
符號相關
使用DD-EWMA 方程,我們可以預測任何平穩的時間序列,而不僅限於簡單的波動率建模,但是由於模型的機制是EWMA,因此最好應用於波動性時間序列,其中數據的分佈是學生-t 分配。
這種新方法優於方差的平方根作為波動率的估計。例如,與直接估計波動率相比,給定資產的回報的顯著變動(遵循重尾分佈)將對通過方差平方根的波動率估計產生更大的影響。下圖展示了這一點,我將新的DD-EWMA (DDIVF) 與方差的平方根(KFIVF) 進行了比較。
EWMA 波動率預測是數據驅動的,因為alpha 的最優值是通過最小化一步預測誤差平方和(FESS) 來獲得的,並且樣本符號相關性用於識別rt 的條件分佈.
用Python 實現的ARCH 模型
############################################### ##################
# ARCH 比特幣日誌的基線波動率返回
##################### ###########################################from arch import arch_model
am = arch_model(y,p=1, o=0, q=0)
res = am.fit(update_freq=5)
print(res.summary())
fig = res.plot(annualize=”D”)df = pd.DataFrame({‘Bitcoin Vol’:y[10:],’ARCH(1)’:res.conditional_volatility[10:]})subplot = df.plot(title = ‘ARCH(1) 模型應用於比特幣Vol ‘)
均方根誤差:0.0318298
從視覺上我們可以看到ARCH(1) 模型的預成型效果很差。是時候繼續研究GARCH 模型了。當數據表現出異方差性和波動性聚類時,GARCH 更適合建模時間序列數據。
波動率聚類:高度波動的日子通常緊隨其後的是其他波動的日子
用python實現的GARCH模型——比特幣波動率。
############################################### ###################
GARCH 比特幣日誌的基線波動率返回
##################### ###########################################from arch import arch_model
am = arch_model(y) #GARCH 模型p=1 , q=1
res = am.fit(update_freq=5)
print(res.summary())
fig = res.plot(annualize=”D”)df = pd. DataFrame({‘Bitcoin Vol’:y[10:],’GARCH(1,1)’:res.conditional_volatility[10:]})subplot = df.plot(title = ‘GARCH(1,1) 模型應用於比特幣成交量’)
均方根誤差:0.0319375
在預測比特幣的波動性時,ARCH 和GARCH 都表現不佳。現在轉向新的DD-EWMA 方法以尋求更好的結果。
Python 中的DD-EWMA 實現
現在介紹了所有理論,我們將繼續在python 中實現這種新方法。如上所述,主要目標將是產生比特幣的前瞻性預測波動率。
首先,我們概述了在DD-EWMA 公式中尋找alpha 的sudo 代碼以及我們在每個時間步的波動率預測。
DD-EWMA 波動率預測
接下來我們將我們的sudo 代碼翻譯成python。這裡我們定義了兩個函數,其中DD_volatility 代表我們的算法一,rho_cal 是我們輸入到DD-EWMA 公式的樣本符號相關性。
def rho_cal(X):
rho_hat = scipy.stats.pearsonr(X-np.mean(X), np.sign(X- np.mean(X)))#rho_hat[0]:Pearson 相關性,rho_hat[1] :two-tailed p-value
return rho_hat[0]def DD_volatility(y,cut_t,alpha):
t = len(y)
rho = rho_cal(y) # 計算樣本符號相關性
vol = abs(y-np.mean(y) ))/rho # 計算觀察到的波動率
MSE_alpha = np.zeros(len(alpha))
sn = np.zeros(len(alpha))#
a in range(len(alpha)) 的波動率:
s = np.mean(vol [0:cut_t]) # 初始平滑統計
誤差= np.zeros
for i in range
error[i] = vol[i] – s
s = alpha[a]*vol[i]+( 1-alpha[a])*s
MSE_alpha[a] = np.mean((error[(len(error)-cut_t):(len(error))])**2) # 預測誤差平方和(FESS)
sn[a] = s
vol_forecast = sn[[i for i, j in enumerate(MSE_alpha) if j == min(MSE_alpha)]]#which min
RMSE = np.sqrt(min(MSE_alpha))
return vol_forecast, RMSE
函數DD_volatility 的關鍵是我們在公式中循環遍歷alpha。然後,我們計算給定特定alpha 的波動率預測的均方誤差(MSE),並選擇生成最低MSE 的alpha。我們使用50 天的歷史數據窗口來擬合我們的最佳alpha。需要理解的一個關鍵部分是alpha 現在變得固定,需要額外的研究來了解在配方中製作alpha dyamaic 的影響。
數據驅動的指數加權移動平均結果
下面給出了用於預測比特幣價格波動的DD-EWMA 結果。 Alpha 版的回溯期為30 天。了解模型預測提前一天的預測。存在其他方法來擴展預測以預測未來的服務天數,但我不會在本文中提及。
DD-EWMA 比特幣波動率預測
均方根誤差:0.00001627348
從上圖中,預測與實際匹配,模型也得到DD-EWMA 的RMSE 支持,給出為0.00001627。 DD-EWMA 的RMSE 是對基線ARCH(1) 模型和GARCH(1,1) 模型的巨大改進。 DD-EWMA 模型給出的預測通過使用數據驅動的方法更好地預測了波動性。
結論
本文中展示的所有內容都是為了預測比特幣的波動性,並使用真實數據進行測試。為了提高對比特幣波動性建模的穩健性,使用了一種新方法(DD-EWMA)並取得了巨大成功。