Hurst指数以及MF-DFA
轉:https://uqer.io/home/
https://uqer.io/community/share/564c3bc2f9f06c4446b48393
寫在前面
-
9月的時候說想把arch包加進去,昨兒發現優礦已經加好了,由于優礦暫時沒有開放歷史高頻接口,我索性就分享一個冷冷的小知識:分形市場假說(FMH),分析中玩的是低頻數據(日線,或者分鐘線)。
-
所謂分形市場假說,就是人們發現有效市場假說的種種不合理后,提出的一種假說,我曾經有仔細關注過這一塊,因為這個假說真是太「中國特色」了:
-
它有幾個主要論點:
- 總之就是一個具有「正反饋、非線性、分形、混沌、耗散」等等很牛逼的概念,深深吸引著曾經學過物理學的我。。。
關于Hurst指數以及MF-DFA
-
現在對于分形市場假說的主要方法論就是 Hurst指數,通過MF-DFA(Multifractal detrended fluctuation analysis)來計算, 具體的可以維基百科一下,大體就是當hurst>0.5時時間序列是一個persistent的過程,當hurst>0.5時時間序列是一個anti-persistent的過程,當hurst=0.5時間序列是一個不存在記憶的隨機游走過程。
-
而在實際計算中,不會以理論值0.5作為標準(一般會略大于0.5)
寫在最后
- 這份工作來自于LADISLAV KRISTOUFEK這位教授在12年的工作,論文名叫做RACTAL MARKETS HYPOTHESIS AND THE GLOBAL FINANCIAL CRISIS: SCALING, INVESTMENT HORIZONS AND LIQUIDITY
- 這位教授后來在13年把這項工作強化了一下(加了點小波的方法),把論文的圖畫得美美噠,竟然發表在了Nature的子刊Scientific Report上。當年我的導師發了一篇SR可是全校通報表揚啊,雖然現在我以前在物理系的導師說今年有4篇SR發表。。
- 總之,如果誰對這個感興趣,或者想在Nature上水一篇文章,可以研究研究。
- 這個方法對設計策略有沒有什么用? 好像沒有用哎,所以我發表在「研究」板塊里了哈。不過10年海通有研究員測試過根據這個方法寫的策略,據說alpha還不錯。
- 算法部分我用的是自己的library庫。
上面的圖能夠看到garch(1,1)到底做了什么,它主要是對波動率進行了建模,在做分析時消去了這部分的影響。
plt.figure(1) indexPrice['closeIndex'].tail(len(indexPrice)-inter).plot(figsize=(10,4),color='red',title='SSE Index',linewidth=1) plt.figure(2) indexPrice['Hurst'].tail(len(indexPrice)-inter).plot(figsize=(10,4),color='green',title='Hurst Index',linewidth=1,marker='.')- 看出了啥沒?簡單點說,就是hurst越大,越有可能延續之前的趨勢(即動量),若hurst越小,則越有可能違反之前的趨勢(即反轉)。LADISLAV KRISTOUFEK這位教授的想法是通過極大極小值來判斷,當然它分析的是美股啦。
- 再看看上面的圖,是對上證指數的分析,取的是日線的數據(其實我喜歡用分鐘線,因為A股波動辣么牛逼,日線顆粒度哪里夠啊。。),可以得(meng)出這些結論:
- 13年中旬hurst出現最小值,說明熊市的跌勢要反轉了,馬上要進入牛市了?!
- 15年中旬hurst出現最小值,說明牛市的漲勢要反轉了,馬上要進入熊市了?!
- 算卦完畢。
?
?
?
看到好多人在克隆這份東西,我索性就把自定義的lib分享出來,僅限學術交流。命名為Hurst并添加到library即可。
#coding=utf-8import numpy as np from sklearn.linear_model import LinearRegressiondef avgFluctuation(Xseries,q,S):lr = LinearRegression(fit_intercept = True)T = Xseries.shape[0]Ts = int(T/S)qorder = qaFlu = 0Xtime = np.array(range(1,S+1))Xtime.shape = (S,1)for v in range(1,Ts+1):Xstarts = (v-1)*SXends = v*SXtemp = Xseries[Xstarts:Xends]Xtemp.shape = (S,1)lr.fit(Xtime,Xtemp)fitX = map(lr.predict,Xtime)eX = fitX - XtempFlu = np.sum(eX*eX)/SaFlu += (Flu)**(qorder/2)/(2*Ts)for v in range(Ts+1,2*Ts+1):Xstarts = T-(v-Ts)*SXends = T-(v-Ts)*S+SXtemp = Xseries[Xstarts:Xends]Xtemp.shape = (S,1)lr.fit(Xtime,Xtemp)fitX = map(lr.predict,Xtime)eX = fitX - XtempFlu = np.sum(eX*eX)/SaFlu += (Flu)**(qorder/2)/(2*Ts)aFlu = aFlu**(1./qorder)return aFludef MFDFA(Xseries,q,Smin,Smax,Sintr=1):T = Xseries.shape[0]N = (Smax - Smin + 1)/SintraFlus = np.zeros(N)i = 0for S in range(Smin,Smax+1,Sintr):aFlus[i] = avgFluctuation(Xseries,q,S)i += 1logaFlus = np.log(aFlus)logS = np.log(range(Smin,Smax+1,Sintr))lr = LinearRegression(fit_intercept = True)logaFlus.shape = (N,1)logS.shape = (N,1)lr.fit(logS,logaFlus)h = lr.coef_return hdef Hurst(X,T=300,step=1,q=2,Smin=10,Smax=50,Sintr=1):X = np.array(X)nX = X.shape[0]hurst = np.zeros(nX-T+1)for i in range(0,nX-T+1,step):XX = X[i:i+T]Xseries = np.zeros(T)for j in range(T):Xseries[j] = np.sum(XX[0:j+1])hurst[i] = MFDFA(Xseries,q,Smin,Smax,Sintr)return hurst?
?
?
由于上面的代碼運行有點問題,下面是我自己改過的代碼:
def avgFluctuation(Xseries, q, S):lr = LinearRegression(fit_intercept = True)T = Xseries.shape[0]Ts = int(T/S)qorder = qaFlu = 0Xtime = np.array(range(1, S+1))Xtime.shape = (S, 1)for v in range(1, Ts+1):Xstarts = (v-1)*SXends = v*SXtemp = Xseries[Xstarts:Xends]Xtemp.shape = (S, 1)lr.fit(Xtime, Xtemp)fitX = list(map(lr.predict, [Xtime]))eX = fitX - XtempFlu = np.sum(eX*eX) / SaFlu += (Flu)**(qorder/2) / (2*Ts)for v in range(Ts+1,2*Ts+1):Xstarts = T-(v-Ts)*SXends = T-(v-Ts)*S+SXtemp = Xseries[Xstarts:Xends]Xtemp.shape = (S,1)lr.fit(Xtime,Xtemp)fitX = list(map(lr.predict, [Xtime]))eX = fitX - XtempFlu = np.sum(eX*eX) / SaFlu += (Flu)**(qorder/2) / (2*Ts)aFlu = aFlu**(1./qorder)return aFludef MFDFA(Xseries, q, Smin, Smax, Sintr=1):T = Xseries.shape[0]N = int((Smax - Smin + 1) / Sintr)aFlus = np.zeros(N)i = 0for S in range(Smin, Smax+1, Sintr):aFlus[i] = avgFluctuation(Xseries, q, S)i += 1logaFlus = np.log(aFlus)logS = np.log(range(Smin, Smax+1, Sintr))lr = LinearRegression(fit_intercept = True)logaFlus.shape = (N,1)logS.shape = (N,1)lr.fit(logS, logaFlus)h = lr.coef_return hdef Hurst(X, T=300, step=1, q=2, Smin=10, Smax=50, Sintr=1):X = np.array(X)nX = X.shape[0]hurst = np.zeros(nX-T+1)for i in range(0, nX-T+1, step):XX = X[i:i+T]Xseries = np.zeros(T)for j in range(T):Xseries[j] = np.sum(XX[0:j+1])hurst[i] = MFDFA(Xseries, q, Smin, Smax, Sintr)return hurst?
?
?
?
?
總結
以上是生活随笔為你收集整理的Hurst指数以及MF-DFA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言扩展包dplyr——数据清洗和整理
- 下一篇: linux 小白启航之路-搭建linux