Python实现平滑平均K线(Smoothed Heikin Ashi)

平滑平均K线(Smoothed Heikin Ashi)

对于平均K线(Heikin Ashi),交易者一般都比较熟悉,不熟悉的可以参见我写的文章Python实现Heikin Ashi(平均K线)。最近在tradeview上发现了Heikin Ashi的一种改进版本——平滑平均K线(Smoothed Heikin Ashi),据说效果要比常规的Heikin Ashi好几倍(本人未验证)。

计算公式

在这里插入图片描述
可以发现Smoothed Heikin Ashi就是对开盘价、最高价、最低价、收盘价的均价进行常规Heikin Ashi的计算,非常的简单。

Python实现

def smoothed_heikin_ashi(df, n=60, ma_type='EMA'):
    sha = pd.DataFrame(index=df.index, columns=['open', 'high', 'low', 'close'])
    alpha = 2 / (1 + n)
    if ma_type.lower() == 'sma':
        alpha = 1 / n
    sha['open'] = df['open'].ewm(alpha=alpha, adjust=False).mean()
    sha['high'] = df['high'].ewm(alpha=alpha, adjust=False).mean()
    sha['low'] = df['low'].ewm(alpha=alpha, adjust=False).mean()
    sha['close'] = df['close'].ewm(alpha=alpha, adjust=False).mean()
    return heikin_ashi(sha)

这里我默认使用EMA(60)对价格进行平均,当然也可以使用SMA(n, 1)进行平均。heikin_ashi()方法请参见我的这篇文章

绘制K线

使用东方财富300059的历史日K数据进行检验,使用mplfinance库绘制K线图。数据如下:
在这里插入图片描述

将原始K线、常规Heikin Ashi和Smoothed Heikin Ashi都绘制出来,方便比较。

import mplfinance as mf
sha = smoothed_heikin_ashi(data)
rha = heikin_ashi(data)
fig = mf.figure(style='charles')
ax0 = fig.add_subplot(3, 1, 1)
ax1 = fig.add_subplot(3, 1, 2)
ax2 = fig.add_subplot(3, 1, 3)
mf.plot(data, type='candle', ax=ax0, mav=(60,), axtitle='Original Kline')
mf.plot(rha, type='candle', ax=ax1, mav=(60,), axtitle='Regular Heikin Ashi')
mf.plot(sha, type='candle', ax=ax2, mav=(60,), axtitle='Smoothed Heikin Ashi')
mf.show()

结果如下:
在这里插入图片描述

小结

肉眼可见的Smoothed Heikin Ashi要更加的平滑,错误信号更少,能够非常好的刻画大趋势。但是对于震荡行情的情况,其表现也是不尽人意。
相信配合其他过滤指标进行回测,效果肯定比常规的Heikin Ashi要好。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Douglas-Peucker算法来实现Python线平滑。下面是一个使用Douglas-Peucker算法的Python函数实现,它将输入的曲线进行平滑处理并返回平滑后的曲线点的列表: ```python def douglas_peucker(points, tolerance): # 找到距离最大的点 dmax = 0 index = 0 end = len(points) - 1 for i in range(1, end): d = point_to_line_distance(points[i], points, points[end]) if d > dmax: index = i dmax = d # 如果最大距离大于容差,则递归处理 if dmax > tolerance: # 对分割后的两个曲线进行递归处理 left = douglas_peucker(points[:index+1], tolerance) right = douglas_peucker(points[index:], tolerance) # 合并处理后的曲线 return left[:-1] + right else: return [points[0], points[end]] # 计算点到直线的距离 def point_to_line_distance(point, start, end): if start == end: return abs(point - start) else: k = (end - start[1]) / (end - start) b = start - k * start[0] return abs(k * point - point + b) / math.sqrt(k * k + 1) ``` 在上面的代码中,我们使用了点到直线的距离来计算曲线上的点与直线的距离。如果距离超过了容差,我们就会使用递归的方式对分割后的两个曲线进行处理。最终,我们将处理后的曲线点列表合并起来,即可得到平滑后的曲线点的列表。 例如,如果我们有一个包含10个点的曲线,可以将其平滑到只有3个点: ```python points = [(0, 0), (2, 3), (5, 6), (7, 6), (9, 3), (10, 0), (9, -3), (7, -6), (5, -6), (2, -3)] tolerance = 2 smoothed_points = douglas_peucker(points, tolerance) print(smoothed_points) ``` 输出结果为: ``` [(0, 0), (5, 6), (10, 0)] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值