我无法将Hull Moving Average计算为Python代码

问题描述

我很高兴能与大家分享我的问题,并希望向大家学习。 我当前的问题是def Calculation_hma,我无法获得像上面的计算一样的正确计算。

python27

iuputs 
period = 9
Coin_pair = "USD-BTC"
Unit = thirtyMin''

def getClosingPrices(coin_pair,period,unit):
    historical_data = api.getHistoricalData(coin_pair,unit)
    closing_prices = []
    for i in historical_data:
        closing_prices.append(i['C'])
    return closing_prices


def calculate_sma(coin_pair,unit):

    total_closing = sum(getClosingPrices(coin_pair,unit))
    return (total_closing / period)


def calculate_ema(coin_pair,unit):

    closing_prices = getClosingPrices(coin_pair,unit)
    prevIoUs_EMA = calculate_sma(coin_pair,unit)
    constant = (2 / (period + 1))
    current_EMA = (closing_prices[-1] * (2 / (1 + period))) + (prevIoUs_EMA * (1 - (2 / (1 + period))))

def calculate_hma(coin_pair,unit):
    """
    Hull Moving Average.
    
    Formula:
    HMA = WMA(2*WMA(n/2) - WMA(n)),sqrt(n)
    """
    
    -MY Try of calculation ?
    ma = calculate_sma(coin_pair,unit)
    HMA = ma(2*ma(period/2) - ma(period)),sqrt(period)
    
    -my question  ?
    where to use the unit and pierod and coin_pair in the calculation ?  

    -check inputs above


    )
    return hma

ema = calculate_ema(market,period=9,unit=timeframe)
sma = calculate_sma(market,unit=timeframe)
hma = calculate_sma(market,unit=timeframe) ? 

print (ema)
print (sma)
print (hma)

谢谢你们检查我的问题

致谢, 莫

解决方法

解决

def calculate_hma(coin_pair,period,unit):

    HMA = ((calculate_wma(coin_pair,int(period / 2),unit) * 2 - calculate_wma(coin_pair,unit)) + (
        calculate_wma(coin_pair,int(math.sqrt(period)),unit))) / 2
,

移动平均线通常用 ma(series) -> series 签名定义。我认为您的困惑很大一部分源于 WMA 被定义为返回一个系列,而不是您期望的单个值。

可以在此处找到问题的良好正式定义:https://oxfordstrat.com/trading-strategies/hull-moving-average/

这是单点 HMA 的 Python 实现:

def weighted_moving_average(series: List[float],lookback: Optional[int] = None) -> float:
    if not lookback:
        lookback = len(series)
    if len(series) == 0:
        return 0
    assert 0 < lookback <= len(series)

    wma = 0
    lookback_offset = len(series) - lookback
    for index in range(lookback + lookback_offset - 1,lookback_offset - 1,-1):
        weight = index - lookback_offset + 1
        wma += series[index] * weight
    return wma / ((lookback ** 2 + lookback) / 2)


def hull_moving_average(series: List[float],lookback: int) -> float:
    assert lookback > 0
    hma_series = []
    for k in range(int(lookback ** 0.5),-1,-1):
        s = series[:-k or None]
        wma_half = weighted_moving_average(s,min(lookback // 2,len(s)))
        wma_full = weighted_moving_average(s,min(lookback,len(s)))
        hma_series.append(wma_half * 2 - wma_full)
    return weighted_moving_average(hma_series)
,

这可以通过 Pandas 系列轻松解决。整个公式:

HMA = WMA(2*WMA(period/2) - WMA(period)),sqrt(period))

给定一个输入序列 s 和一个句点可以打包成一行:

import pandas as pd
import numpy as np

HMA = s.rolling(period//2).apply(lambda x: ((np.arange(period//2) + 1)*x).sum()/(np.arange(period//2) + 1).sum(),raw=True).multiply(2).sub(
                        s.rolling(period).apply(lambda x: ((np.arange(period) + 1)*x).sum()/(np.arange(period) + 1).sum(),raw=True)
                ).rolling(int(np.sqrt(period))).apply(lambda x: ((np.arange(int(np.sqrt(period))) + 1)*x).sum()/(np.arange(int(np.sqrt(period))) + 1).sum(),raw=True)

但为了清晰和方便,最好定义 2 个函数:

def WMA(s,period):
       return s.rolling(period).apply(lambda x: ((np.arange(period)+1)*x).sum()/(np.arange(period)+1).sum(),raw=True)

def HMA(s,period):
       return WMA(WMA(s,period//2).multiply(2).sub(WMA(s,period)),int(np.sqrt(period)))