如何解决我无法将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)))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。