日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hurst指数以及MF-DFA

發布時間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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庫。
    import numpy as np import pandas as pd from arch import arch_model # GARCH(1,1) from matplotlib import pyplot as plt from datetime import timedelta from CAL.PyCAL import * from lib.Hurst import * inter = 320 #滑動時間窗口 #設置時間 today = Date.todaysDate() beginDate = '20100101' endDate = today.toDateTime().strftime('%Y%m%d') #設置指數類型 indexLabel = '000001' # SSE index #indexLabel = '399006' # CYB index#讀取指數 indexPrice = DataAPI.MktIdxdGet(ticker=indexLabel,beginDate=beginDate,endDate=endDate,field=["tradeDate","closeIndex"],pandas="1") price = np.array(indexPrice.loc[:,'closeIndex'])#計算對數收益 back_price = np.append(price[0],price.copy()) back_price = back_price[:-1] return_price = np.log(price) - np.log(back_price)#計算波動率 from GARCH(1,1) am = arch_model(return_price) res = am.fit() sqt_h = res.conditional_volatility#去除波動性 f = return_price/sqt_h#計算hurst指數,函數來自自定義library hurst = Hurst(f,T=inter,step=1,q=2,Smin=10,Smax=50,Sintr=1)indexPrice['Hurst'] = pd.DataFrame(np.array([0] * len(indexPrice))) indexPrice.loc[inter-1:,'Hurst'] = hurst indexPrice.index = indexPrice['tradeDate'] plt.figure(figsize=(10,6)) plt.subplot(3,1,1) plt.plot(f) plt.subplot(3,1,2) plt.plot(return_price) plt.subplot(3,1,3) plt.plot(sqt_h)

    上面的圖能夠看到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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。