国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用Python實現(xiàn)Hull Moving Average (HMA)

赫爾移動平均線(Hull Moving Average,簡稱HMA)是一種技術(shù)指標,于2005年由Alan Hull開發(fā)。它是一種移動平均線,利用加權(quán)計算來減少滯后并提高準確性。

HMA對價格變動非常敏感,同時最大程度地減少短期波動可能產(chǎn)生的噪音。它通過使用加權(quán)計算來強調(diào)更近期的價格,同時平滑數(shù)據(jù)。

計算HMA的公式涉及三個步驟。首先,使用價格數(shù)據(jù)計算加權(quán)移動平均線。然后,使用第一步的結(jié)果計算第二個加權(quán)移動平均線。最后,使用第二步的結(jié)果計算第三個加權(quán)移動平均線。最終計算的結(jié)果就是移動赫爾平均線。

WMA_1 =一段時期內(nèi)價格的加權(quán)移動平均值(WMA) /2

WMA_2 =價格在一段時間內(nèi)的WMA

HMA_non_smooth = 2 * WMA_1 - WMA_2

HMA = HMA_non_smooth的WMA除以根號(周期)

在下面的文章中,我們將介紹如何使用Python實現(xiàn)HMA。本文將對計算WMA的兩種方法進行詳細比較。然后介紹它在時間序列建模中的作用。

Python實現(xiàn)HMA

方法1:將WMA計算為按時期加權(quán)的移動平均價格:

def hma(period):wma_1 = df['Adj Close'].rolling(period//2).apply(lambda x: \np.sum(x * np.arange(1, period//2+1)) / np.sum(np.arange(1, period//2+1)), raw=True)wma_2 = df['Adj Close'].rolling(period).apply(lambda x: \np.sum(x * np.arange(1, period+1)) / np.sum(np.arange(1, period+1)), raw=True)diff = 2 * wma_1 - wma_2hma = diff.rolling(int(np.sqrt(period))).mean()return hmaperiod = 20df['hma'] = hma(period)df['sma_20days'] = df['Adj Close'].rolling(period).mean()figsize = (10,6)df[['Adj Close','hma','sma_20days']].plot(figsize=figsize)plt.title('Hull Moving Average {0} days'.format(period))plt.show()

如圖所示,HMA比通常的SMA反應更快:

還可以嘗試更短的時間框架,看看HMA與價格曲線的關(guān)系有多密切。

df['hma_short']=hma(14)df['hma_long']=hma(30)figsize = (12,6)df[['Adj Close','hma_short','hma_long']].plot(figsize=figsize)plt.title('Hull Moving Average')plt.show()

方法2,使用體量計算加權(quán)平均值:

def hma_volume(period):wma_1 = df['nominal'].rolling(period//2).sum()/df['Volume'].rolling(period//2).sum()wma_2 = df['nominal'].rolling(period).sum()/df['Volume'].rolling(period).sum()diff = 2 * wma_1 - wma_2hma = diff.rolling(int(np.sqrt(period))).mean()return hmadf['nominal'] = df['Adj Close'] * df['Volume']period = 20df['hma_volume']=hma_volume(period)figsize=(12,8)fig, (ax0,ax1) = plt.subplots(nrows=2, sharex=True, subplot_kw=dict(frameon=True),figsize=figsize) df[['Adj Close','hma_volume','hma']].plot(ax=ax0)ax0.set_title('HMA Volume vs HMA period')df[['Volume']].plot(ax=ax1)ax1.set_title('Hull Moving Average')plt.show()

體量的HMA比第一種方法計算的HMA稍滯后:

策略的回溯測試

為了回測每種策略(方法1和2),我們將計算一個短期和一個長期的HMA:

當短線超過長線時,可以觸發(fā)買入指令。當短線低于長線時,就會觸發(fā)賣出指令。

然后我們計算每個信號產(chǎn)生的pnl。

方法1:

#SIGNALdf['hma_short']=hma(20)df['hma_long']=hma(30)df['signal'] = np.where(df['hma_short'] > df['hma_long'],1,-1)#RETURNdf['signal_shifted']=df['signal'].shift()## Calculate the returns on the days we trigger a signaldf['returns'] = df['Adj Close'].pct_change()## Calculate the strategy returnsdf['strategy_returns'] = df['signal_shifted'] * df['returns']## Calculate the cumulative returnsdf1=df.dropna()df1['cumulative_returns'] = (1 + df1['strategy_returns']).cumprod()#PLOTfigsize=(12,8)fig, (ax0,ax1) = plt.subplots(nrows=2, sharex=True, subplot_kw=dict(frameon=True),figsize=figsize) df[['Adj Close','hma_long','hma_short']].plot(ax=ax0)ax0.set_title('HMA: Short vs Long')df[['signal']].plot(ax=ax1,style='-.',alpha=0.4)ax1.legend()ax1.set_title('HMA - Signals')plt.show()df1['cumulative_returns'].plot(figsize=(10,4))plt.title('Cumulative Return')plt.show()

你可以看到每次產(chǎn)生的信號都有一條交叉線:

在數(shù)據(jù)集的整個時間段內(nèi)產(chǎn)生的總體回報是正的,即使在某些時期它是負的:

回報率:

df1['cumulative_returns'].tail()[-1]#1.0229750801053696

方法2:

#SIGNALdf['hma_volume_short']=hma_volume(20)df['hma_volume_long']=hma_volume(30)df['signal'] = np.where(df['hma_volume_short'] > df['hma_volume_long'],1,-1)#RETURNdf['returns'] = df['Adj Close'].pct_change()## Calculate the strategy returnsdf['strategy_returns'] = df['signal'].shift() * df['returns']## Calculate the cumulative returnsdf2=df.dropna()df2['cumulative_returns_volume'] = (1 + df2['strategy_returns']).cumprod()# PLOTfigsize=(12,8)fig, (ax0,ax1) = plt.subplots(nrows=2, sharex=True, subplot_kw=dict(frameon=True),figsize=figsize) df[['Adj Close','hma_volume_short','hma_volume_long']].plot(ax=ax0)df[['signal']].plot(ax=ax1,style='-.',alpha=0.4)ax0.set_title('HMA - Volume: Short vs Long')ax1.legend()plt.title('HMA - Signals')plt.show()figs = (10,4)df2['cumulative_returns_volume'].plot(figsize = figs)plt.title('Cumulative Return')plt.show()

看起來比第一種方法中的HMA更平滑,可以觸發(fā)的信號更少(在我們的例子中只有1個):

這種策略產(chǎn)生的回報不是很好:0.75(0.775-1?-24%)

df2['cumulative_returns_volume'].tail()[-1]#0.7555329108482581

我們來比較兩種策略的信號:

df['signal'] = np.where(df['hma_short'] > df['hma_long'],1,-1)df['signal_volume'] = np.where(df['hma_volume_short'] > df['hma_volume_long'],1,-1)figsize=(12,8)df[['signal','signal_volume']].plot(figsize=figsize)plt.show()

空頭頭寸的信號比多頭頭寸更多:

所以僅使用HMA還不足以產(chǎn)生有利可圖的策略。我們可以使用相對強弱指數(shù)(RSI)和隨機指數(shù)(Stochastic Oscillator等其他指標來確認交易信號。但是對于時間序列來說,HMA是一個很好的特征工程的方法。

HMA信號的一些解釋

交叉信號:當價格越過HMA上方時,可以解釋為看漲信號,當價格越過HMA下方時,可以解釋為看空信號。它也可以觸發(fā)買入和賣出信號,正如我們之前已經(jīng)看到的。(上圖點1)。

趨勢跟蹤信號:HMA也可用于識別趨勢并生成趨勢跟蹤信號。當HMA傾斜向上時,它表示上升趨勢,當它傾斜向下時,它表示下降趨勢(上圖點2)。

反轉(zhuǎn)信號:當價格從下方接近HMA時,看漲反轉(zhuǎn)趨勢可能在不久的將來發(fā)生(上圖點3)。

HMA在時間序列建模的作用

HMA在時間序列建模中的作用主要是作為一個平滑濾波器,可以在一定程度上減少噪聲并提高時間序列預測的準確性。在時間序列建模中,經(jīng)常需要對數(shù)據(jù)進行平滑處理,以消除異常值和噪聲,同時保留趨勢和季節(jié)性變化的信號。HMA是一種有效的平滑濾波器,它通過加權(quán)平均的方式來計算平均值,并對較早的數(shù)據(jù)施加更大的權(quán)重,從而可以更準確地捕捉趨勢性信號。

除了作為一個平滑濾波器,HMA還可以作為一個特征提取器來提取時間序列中的特征,并用于建立預測模型。例如,可以使用HMA計算時間序列中的趨勢和季節(jié)性變化,并將其作為輸入特征用于構(gòu)建ARIMA、VAR或LSTM等預測模型。

總結(jié)

HMA不僅在交易中有廣泛的應用,也是一種有用的時間序列分析工具。HMA作為一種移動平均線,可以減少時間序列中的噪聲和突發(fā)性變化,從而更準確地捕捉數(shù)據(jù)的趨勢性和周期性變化。在時間序列分析中,HMA通常用于平滑處理數(shù)據(jù),以提高預測的準確性。在實際應用中,HMA常常與其他技術(shù)指標和時間序列分析方法相結(jié)合,在各種數(shù)據(jù)分析和預測任務中獲取更好的預測結(jié)果。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
股票分析(三):誰與我生死與共 | Why''''s Blog
PYTHON數(shù)據(jù)可視化:利用COLORMAP讓你的圖表與眾不同
利用 Python 分析了某化妝品企業(yè)的銷售情況,我得出的結(jié)論是?
常見的8個概率分布公式和可視化
Python pandas更是可視化工具!
機器學習繪圖神器Matplotlib首秀!
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服