失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > pyecharts显示K线 均线 成交量和MACD

pyecharts显示K线 均线 成交量和MACD

时间:2023-03-07 23:02:51

相关推荐

pyecharts显示K线 均线 成交量和MACD

安装 Ta-lib:

pip install Ta-lib

安装pyecharts:

pip install pyecharts

npm install -g phantomjs-prebuilt

安装图片保存插件:

pip install pyecharts-snapshot

import pandas as pdimport numpy as npimport talib as tafrom decimal import Decimalfrom pyecharts.charts import Kline, Line, Bar, Gridfrom mons.utils import JsCodefrom pyecharts import options as optsfrom pyecharts.globals import CurrentConfig, NotebookTypeCurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_NOTEBOOK# 精度计算def digital_utils(temps):temps = str(temps)if temps.find('E'):temps = '{:.8f}'.format(Decimal(temps))nums = temps.split('.')if int(nums[1]) == 0:return nums[0]else:num = str(int(nums[1][::-1]))result = '{}.{}'.format(nums[0], num[::-1])return resultdef sum_resampler(df):if df.shape[0] < 1:return float("nan")return np.sum(df)def low_resampler(df):return np.min(df)def high_resampler(df):return np.max(df)def avg_resampler(df):return digital_utils(np.average(df))def open_resampler(df):if df.shape[0] < 1:return float("nan") return np.asarray(df)[0]def close_resampler(df):if df.shape[0] < 1:return float("nan") return np.asarray(df)[-1]def volume_resampler(df):if df.shape[0] < 1:return float("nan") volume = np.asarray(df)[-1] - np.asarray(df)[0]if volume < 1:return float("nan")return volume# 根据tikt数据合成K线数据def getKline(price, volume):data_close = price.resample('T', label='right').apply(close_resampler) # 1分钟聚合,使用最右边的index作为新的indexdata_open = price.resample('T', label='right').apply(open_resampler) # 1分钟聚合,使用最右边的index作为新的indexdata_high = price.resample('T', label='right').apply(high_resampler) # 1分钟聚合,使用最右边的index作为新的indexdata_low = price.resample('T', label='right').apply(low_resampler) # 1分钟聚合,使用最右边的index作为新的indexdata_volume = volume.resample('T', label='right').apply(volume_resampler) # 1分钟聚合,使用最右边的index作为新的indexdata = pd.concat([data_open, data_close, data_low, data_high, data_volume],axis=1)data.columns = ['open', 'close', 'low', 'high', 'volume']return datadef process(data):#去掉数据中的第一行(集合竞价值)和最后一行数据(结算值)data.columns = ['localtime', 'InstrumentID', 'TradingDay', 'ActionDay', 'UpdateTime', 'UpdateMillisec', 'LastPrice', 'Volume', 'HighestPrice', 'LowestPrice', 'OpenPrice', 'ClosePrice', 'AveragePrice', 'AskPrice1', 'AskVolume1', 'BidPrice1', 'BidVolume1', 'UpperLimitPrice', 'LowerLimitPrice', 'OpenInterest', 'Turnover', 'PreClosePrice', 'PreOpenInterest', 'PreSettlementPrice']data = data[:-1]#用交易日期(TradingDay),会把前一天晚上的数据当成今天数据处理 ActionDayindex = pd.DatetimeIndex(data['TradingDay'].map(str) + ' ' + data['UpdateTime'].map(str) + '.' + data['UpdateMillisec'].map(str))data.index = index data = data[['LastPrice', 'Volume', 'HighestPrice', 'LowestPrice', 'OpenPrice', 'AveragePrice', 'AskPrice1', 'AskVolume1', 'BidPrice1', 'BidVolume1', 'UpperLimitPrice', 'LowerLimitPrice', 'OpenInterest', 'PreClosePrice', 'PreOpenInterest', 'PreSettlementPrice']]return data# 绘制K线def drawKline(kdata):kline=Kline()kline.add_xaxis(xaxis_data=kdata.index.map(str).tolist())kline.add_yaxis(series_name="kline", y_axis=kdata.values.tolist(),itemstyle_opts=opts.ItemStyleOpts( #自定义颜色color="#ec0000",color0="#00da3c",border_color="#8A0000",border_color0="#008F28",))kline.set_global_opts(title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"),# yaxis_opts=opts.AxisOpts(is_scale=True,splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),),yaxis_opts=opts.AxisOpts(is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)),# tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"),datazoom_opts=[opts.DataZoomOpts(is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100),#xaxis_index=[0, 0]设置第一幅图为内部缩放opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100), #xaxis_index=[0, 1]连接第二幅图的axisopts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), #xaxis_index=[0, 2]连接第三幅图的axis],# 三个图的 axis 连在一块# axispointer_opts=opts.AxisPointerOpts(#is_show=True,#link=[{"xAxisIndex": "all"}],#label=opts.LabelOpts(background_color="#777"),# ),)# Ma均线maLine = Line()maLine.add_xaxis(kdata.index.map(str).tolist())maLine.add_yaxis(series_name="MA5",y_axis=kdata['close'].rolling(5).mean(),is_smooth=True,linestyle_opts=opts.LineStyleOpts(opacity=0.5),label_opts=opts.LabelOpts(is_show=False),)maLine.add_yaxis(series_name="MA10",y_axis=kdata['close'].rolling(10).mean(),is_smooth=True,linestyle_opts=opts.LineStyleOpts(opacity=0.5),label_opts=opts.LabelOpts(is_show=False),)maLine.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category",grid_index=1,axislabel_opts=opts.LabelOpts(is_show=False),),yaxis_opts=opts.AxisOpts(grid_index=1,split_number=3,axisline_opts=opts.AxisLineOpts(is_on_zero=False),axistick_opts=opts.AxisTickOpts(is_show=False),splitline_opts=opts.SplitLineOpts(is_show=False),axislabel_opts=opts.LabelOpts(is_show=True),),)# Overlap Kline + maoverlap_kline_ma = kline.overlap(maLine) return overlap_kline_ma#绘制成交量图def drawVolume(kdata):volumeFlag = kdata['close'] - kdata['open']barVolume = Bar()barVolume.add_xaxis(kdata.index.map(str).tolist())barVolume.add_yaxis(series_name="Volumn", y_axis=kdata['volume'].values.tolist(),xaxis_index=1,yaxis_index=1,label_opts=opts.LabelOpts(is_show=False),itemstyle_opts=opts.ItemStyleOpts(color=JsCode("""function(params) {var colorList;if (volumeFlag[params.dataIndex] > 0) {colorList = '#ef232a';} else {colorList = '#14b143';}return colorList;}""")))barVolume.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category",grid_index=1,axislabel_opts=opts.LabelOpts(is_show=False),),legend_opts=opts.LegendOpts(is_show=False),)return volumeFlag, barVolumedef drawMACD(kdata):dw = pd.DataFrame()dw['DIF'], dw['DEA'], dw['MACD'] = ta.MACD(kdata['close'], fastperiod=12, slowperiod=26, signalperiod=9)bar_2 = Bar()bar_2.add_xaxis(kdata.index.map(str).tolist())bar_2.add_yaxis(series_name="MACD",y_axis=dw["MACD"].values.tolist(),xaxis_index=1, # 用于合并显示时排列位置,单独显示不要添加yaxis_index=1, # 用于合并显示时排列位置,单独显示不要添加label_opts=opts.LabelOpts(is_show=False),itemstyle_opts=opts.ItemStyleOpts(color=JsCode("""function(params) {var colorList;if (params.data >= 0) {colorList = '#ef232a';} else {colorList = '#14b143';}return colorList;}""")),)bar_2.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category",grid_index=1, # 用于合并显示时排列位置,单独显示不要添加axislabel_opts=opts.LabelOpts(is_show=False),),yaxis_opts=opts.AxisOpts(grid_index=1, # 用于合并显示时排列位置,单独显示不要添加split_number=4,axisline_opts=opts.AxisLineOpts(is_on_zero=False),axistick_opts=opts.AxisTickOpts(is_show=False),splitline_opts=opts.SplitLineOpts(is_show=False),axislabel_opts=opts.LabelOpts(is_show=True),),legend_opts=opts.LegendOpts(is_show=False),)line_2 = Line()line_2.add_xaxis(kdata.index.map(str).tolist())line_2.add_yaxis(series_name="DIF",y_axis=dw["DIF"],xaxis_index=1,yaxis_index=2,label_opts=opts.LabelOpts(is_show=False),)line_2.add_yaxis(series_name="DEA",y_axis=dw["DEA"],xaxis_index=1,yaxis_index=2,label_opts=opts.LabelOpts(is_show=False),)line_2.set_global_opts(legend_opts=opts.LegendOpts(is_show=False))overlap_bar_line = bar_2.overlap(line_2)return overlap_bar_linedef drawAll(overlap_kline_ma, barVolume, overlap_bar_line, volumeFlag):# 最后的 Gridgrid_chart = Grid(init_opts=opts.InitOpts(width="1400px", height="800px"))# 这个是为了把 volumeFlag 这个数据写入到 html 中,还没想到怎么跨 series 传值# demo 中的代码也是用全局变量传的grid_chart.add_js_funcs("var volumeFlag = {}".format(volumeFlag.values.tolist()))# 传递涨跌数据给vomume绘图,用红色显示上涨成交量,绿色显示下跌成交量# K线图和 MA5 的折线图grid_chart.add(overlap_kline_ma,grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"),)# Volumn 柱状图grid_chart.add(barVolume,grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"),)# MACD DIFS DEASgrid_chart.add(overlap_bar_line,grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"),)# grid_chart.render_notebook()return grid_chartdef getGrid(kdata):k = drawKline(kdata)vflag, v = drawVolume(kdata)m = drawMACD(kdata)return drawAll(k, v, m, vflag)def getKdata(path):data = pd.read_csv(path) data = process(data)price = data['LastPrice']volume = data['Volume']kdata = getKline(price, volume)kdata.drop(kdata[np.isnan(kdata['volume'])].index, inplace=True)#删除 volume列中为nan的行return kdatadef showCsvKline(path):kdata = getKdata(path)return getGrid(kdata)path = 'c:\\QiHuoData\\0204_fu.csv'grid_chart =showCsvKline(path)grid_chart.render_notebook()

如果觉得《pyecharts显示K线 均线 成交量和MACD》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。