【问题标题】:How to calculate Hull Moving Average in Python?如何在 Python 中计算赫尔移动平均线?
【发布时间】:2020-10-23 13:25:09
【问题描述】:

很高兴能与大家分享我的问题,并期待向大家学习。 我目前的问题是def calculating_hma,我无法得到正确的结果:

#python27

#inputs 
period = 9
Coin_pair = "USD-BTC"
Unit = thirtyMin''

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


def calculate_sma(coin_pair, period, unit):

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


def calculate_ema(coin_pair, period, unit):

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

def calculate_hma(coin_pair, period, unit):
    """
    Hull Moving Average.
    
    Formula:
    HMA = WMA(2*WMA(n/2) - WMA(n)), sqrt(n)
    """
    
    # MY Try of calculation ?
    ma = calculate_sma(coin_pair, period, 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, period=9, unit=timeframe)
hma = calculate_sma(market, period=9, unit=timeframe) ? 

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

【问题讨论】:

    标签: python api moving-average indicator


    【解决方案1】:

    这可以通过 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)))
    

    【讨论】:

      【解决方案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)
      

      【讨论】:

        【解决方案3】:

        解决了

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

        【讨论】:

        • 此函数与船体移动平均线的定义不匹配。
        猜你喜欢
        • 2021-05-30
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2010-10-04
        • 1970-01-01
        • 2017-12-19
        • 2021-04-09
        相关资源
        最近更新 更多