【手把手教你】使用Python对股价的Heikin Ashi蜡烛图进行可视化

01

引言


Heikin Ashi蜡烛图是日本人在原始蜡烛图的基础上,对价格进行平均处理得到的一种价格图形。

蜡烛图也叫K线图,是技术分析的重要组成部分,最早是日本德川幕府时代商人用于记录米市行情与价格波动,后来被引入到股市和期货的图表分析上。普通K线图对大家来说应该都不陌生,而Heikin Ashi蜡烛图(简称HA蜡烛图)应该比较少见。Heikin在日文的意思是平均,而Ashi是节奏,合在一起的意思是股价运动的平均节奏。HA蜡烛图根据历史价格计算出来的,相当于对原始价格进行了降噪处理,使之更能反映股价的运动趋势。本文着重介绍HA蜡烛图的计算方法和基本原理,以及使用Python计算HA蜡烛线并实现可视化。

Heikin Ashi蜡烛图


02

计算方法及基本原理


普通K线图中往往存在很多噪声,这些噪声容易掩盖市场真实趋势的随机波动,包括价格和成交量波动。比如,对市场影响持续性较短的新闻事件,以及对技术指标和市场趋势解读等,都可能造成无意义的短期价格和交易量波动,这样的噪声会对交易者分析市场产生干扰和误导。为了减少普通K线图产生的噪声,HA蜡烛图应运而生,HA中的四个价格中,HA开盘价和HA收盘价都是经过平均计算得来,平均化的处理相当于噪声消除处理,在一定程度上消除了市场的噪声,可以更加明确地反映市场价格的走势。其计算方法具体如下∶

HA收盘价ha_close=(开盘价open+收盘价close+最高价high+最低价low)/4

HA开盘价ha_open =(上一交易日HA开盘价+上一交易日HA收盘价)/2

HA最高价ha_high =MAX(最高价high,HA开盘价ha_open,HA收盘价ha_close)

HA最低价ha_low  =MIN(最低价low,HA开盘价ha_open,HA收盘价ha_close)

有计算公式不难发现,HA蜡烛图的最新开盘价是上一K线实体的一半,因此,上涨的时候往往是一连串的红色上行蜡烛线,而下跌则是一连串的绿色下行蜡烛线,当颜色转变时(绿变红或红变绿),往往预示着价格的反转(由涨转跌或由跌转涨),当然也并非绝对如此。

03

Python代码实现及可视化

下面使用Python计算HA蜡烛线并进行可视化,由上面计算方法可知,HA蜡烛线在pandas中计算非常简单,以下代码是在anaconda的Jupyter notebook上运行(python3.7版本),使用tushare pro获取相关数据。

#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import tushare as ts 
import matplotlib.pyplot as plt
%matplotlib inline   
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

获取数据

#设置token
token='输入你的token'
pro=ts.pro_api(token)
#常用大盘指数
index={'上证综指': '000001.SH','深证成指': '399001.SZ',
       '沪深300': '000300.SH','创业板指': '399006.SZ',
        '上证50': '000016.SH','中证500': '000905.SH',
       '中小板指': '399005.SZ','上证180': '000010.SH'}
#获取代码
def get_code(name):
    df = pro.stock_basic(exchange='')
    codes=df.ts_code.values
    names=df.name.values
    stock=dict(zip(names,codes))
    #合并指数和个股成一个字典
    stocks=dict(stock,**index)
    return stocks[name]    
#默认设定时间周期为当前时间往前推300个交易日
#日期可以根据需要自己改动
def get_data(name,n=300):
    from datetime import datetime,timedelta
    t=datetime.now()
    t0=t-timedelta(n)
    start=t0.strftime('%Y%m%d')
    end=t.strftime('%Y%m%d')
    code=get_code(name)
    #如果代码在字典index里,则取的是指数数据
    if code in index.values():
        df=pro.index_daily(ts_code=code,
           start_date=start, end_date=end)
    #否则取的是个股数据,使用前复权
    else:
        df=ts.pro_bar(ts_code=code, adj='qfq', 
           start_date=start, end_date=end)
    #将交易日期设置为索引值
    df.index=pd.to_datetime(df.trade_date)
    df=df.sort_index()
    return df

计算Heikin Ashi蜡烛线

def cal_hadata(name):
    df=df=get_data(name)
    #计算修正版K线
    df['ha_close']=(df.close+df.open+df.high+df.low)/4.0
    ha_open=np.zeros(df.shape[0])
    ha_open[0]=df.open[0]
    for i in range(1,df.shape[0]):
        ha_open[i]=(ha_open[i-1]+df['ha_close'][i-1])/2
    df.insert(1,'ha_open',ha_open)
    df['ha_high']=df[['high','ha_open','ha_close']].max(axis=1)
    df['ha_low']=df[['low','ha_open','ha_close']].min(axis=1)
    df=df.iloc[1:]
    return df

对K线进行可视化

def kline_plot(name,ktype=0):
    df=cal_hadata(name)
    #画K线图数据
    date = df.index.strftime('%Y%m%d').tolist()
    if ktype==0:
        k_value = df[['open','close', 'low','high']].values
    else:
        k_value = df[['ha_open','ha_close', 'ha_low', 'ha_high']].values
    #引入pyecharts画图使用的是0.5.11版本,新版命令需要重写
    from pyecharts import Kline,Line, Bar, Scatter,Overlap
    kline = Kline(name+'行情走势')
    kline.add('日K线图', date, k_value,
              is_datazoom_show=True,is_splitline_show=False)
    #加入5、20日均线
    df['ma20']=df.close.rolling(20).mean()
    df['ma5']=df.close.rolling(5).mean()
    line = Line()
    v0=df['ma5'].round(2).tolist()
    v=df['ma20'].round(2).tolist()
    line.add('5日均线', date,v0
        ,is_symbol_show=False,line_width=2)
    line.add('20日均线', date,v 
        ,is_symbol_show=False,line_width=2)
    # 成交量
    bar = Bar()
    bar.add('成交量', date, df['vol'],tooltip_tragger='axis', is_legend_show=False, 
            is_yaxis_show=False, yaxis_max=5*max(df['vol']))
    overlap = Overlap()
    overlap.add(kline)
    overlap.add(line,)
    overlap.add(bar,yaxis_index=1, is_add_yaxis=True)
    return overlap

kline_plot('沪深300',ktype=0)

 沪深300普通K线图

kline_plot('沪深300',ktype=1)

 沪深300指数HA-K线图

kline_plot('中国平安',ktype=0)

中国平安普通K线图

kline_plot('中国平安',ktype=1)

中国平安HA-K线图

(20190520-20190928)

上面分别对沪深300指数和中国平安的普通K线图和HA蜡烛图进行了对比可视化。通过图形可以观察到,在上涨趋势中,HA蜡烛图基本都是阳线,表示都是收涨的蜡烛线,很少会出现阴线,且在强劲的上涨趋势中,很少会出现下影线;而在下跌趋势中,HA蜡烛图基本都是阴线,表示都是收跌的蜡烛线,很少会出现阳线,且在强劲的下跌趋势中,很少会出现上影线。这些信号比传统的烛图更容易识别趋势或交易机会。图形上显示的趋势不会经常被错误信号打断,因此更容易被发现。

以中国平安股票一季度行情来看,一旦趋势开始,HA蜡烛图可以用来让交易者继续交易提供指导,在HA蜡烛线变色之前可以一直交易。当然,颜色的变化并不总是意味着趋势的结束,也可能只是停顿。

一般而言,HA蜡烛图有三个可以用于确认趋势和买入时机的主要信号:

(1)红色的蜡烛伴随无向下“影线”,表明强劲的上升趋势;

(2)体型小、被上下影线环绕的蜡烛预示着趋势的变化:喜欢冒险的交易员可能会在这里买进或卖出,而其他人则会等到确认信号出现后再做交易。

(3)绿色的蜡烛表示下跌趋势,在没有变色前最好减少仓位或空仓等待;绿色的蜡烛伴随无向上“影线”,表明强劲的下跌趋势:在趋势发生变化之前不要做多。

中国平安HA-K线图

(20181204-2019052)

04

结语


从本质上来看,HA蜡烛图提供的是一个延迟信号,因为相对滞后性,所以产生的交易信号比较可靠,消除了市场噪音,让我们更容易把握趋势以及捕捉买卖机会,但也是因为滞后,所以进场不好把握。很多技术分析指标都存在这样的特点。而原始K线图则最能实时反映价格变动,基本不存在滞后性,因此在实际应用中一般建议将原始K线图图和HA蜡烛图结合分析。HA蜡烛图的图表的优势是更能明确地反映一个趋势是否开始及结束。但值得注意的是,HA蜡烛图并不一定比普通K线图好,大家也不能只运用图表来作入市判断,它只是一个参考工具,在个人的交易策略上有一定的指导意义。本文简单介绍了HA蜡烛图的基本原理和计算方法,以及Python的可视化分析,有兴趣的读者可以进一步利用HA蜡烛图设置买入卖出信号,并利用历史数据进行回测,进一步探讨HA蜡烛图在指导交易中的应用价值。

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值