建网站的费用论坛建站哪个比较好
前言
K线图(Candlestick)是金融领域中常用的图表类型,用于展示股票、期货等金融产品的价格变动情况。它能够清晰地显示开盘价、收盘价、最高价和最低价,帮助投资者分析价格趋势和市场情绪。
在本进阶教程中,我们将通过5个实战案例,深入学习pyecharts中K线图的高级用法,包括自定义样式、添加技术指标、交互功能实现以及多图表组合等技巧。pyecahts源码
目录
- 前言
- 案例一:基础K线图与最大值标记线
- 代码解析
- 关键技巧
- 案例二:K线图与数据缩放功能
- 代码解析
- 关键技巧
- 案例三:自定义数据缩放滑块位置
- 代码解析
- 关键技巧
- 案例四:K线图与移动平均线(MA)的组合
- 代码解析
- 关键技巧
- 案例五:Professional_kline_chart(专业级K线图)
- 代码解析
- 关键技巧
- 总结
案例一:基础K线图与最大值标记线
下面是第一个案例的代码,展示了一个基础的K线图,并添加了最大值标记线:
from pyecharts import options as opts # 导入配置模块
from pyecharts.charts import Kline # 导入K线图模块# 准备K线数据,格式为:[开盘价, 收盘价, 最低价, 最高价]
data = [ [2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], [2255.77, 2270.28, 2253.31, 2276.22],
]# 创建K线图对象
c = (Kline()# 添加X轴数据,使用日期格式.add_xaxis(["2017/7/{}".format(i + 1) for i in range(31)])# 添加Y轴数据,设置最大值标记线.add_yaxis("kline",data,markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="max", value_dim="close")]),)# 设置全局配置.set_global_opts(xaxis_opts=opts.AxisOpts(is_scale=True), # X轴采用自适应刻度yaxis_opts=opts.AxisOpts(is_scale=True, # Y轴采用自适应刻度splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),),title_opts=opts.TitleOpts(title="Kline-MarkLine"), # 设置图表标题)#.render("kline_markline.html") # 渲染为HTML文件
)
c.render_notebook() # 在Notebook中显示
代码解析
-
数据准备:我们定义了一个包含31天K线数据的列表,每个元素代表一天的[开盘价, 收盘价, 最低价, 最高价]。
-
创建K线图对象:通过
Kline()
函数创建一个K线图实例。 -
添加X轴数据:使用列表推导式生成31天的日期数据。
-
添加Y轴数据:添加K线数据,并设置
markline_opts
参数来显示收盘价的最大值标记线。 -
设置全局配置:
xaxis_opts
和yaxis_opts
都设置为is_scale=True
,表示采用自适应刻度,使图表更美观。yaxis_opts
中还设置了splitarea_opts
,用于显示Y轴的分割区域。title_opts
用于设置图表标题。
-
渲染图表:使用
render_notebook()
在Jupyter Notebook中显示图表,也可以使用render()
方法将图表保存为HTML文件。
关键技巧
- 数据缩放功能:
DataZoomOpts()
为K线图添加了一个底部滑块,用户可以通过拖动滑块来放大或缩小图表的时间范围,查看更详细或更宏观的价格走势。 - 缩放配置:可以通过
DataZoomOpts
的参数来自定义缩放功能,例如设置初始缩放范围、是否启用滚动条等。 - 多缩放器:可以添加多个
DataZoomOpts
实例,实现不同方向的缩放(水平和垂直)。
这个案例展示了如何为K线图添加交互性的数据缩放功能,使图表更具实用性。接下来我们将继续学习更多高级功能。
案例二:K线图与数据缩放功能
下面是第二个案例的代码,展示了如何为K线图添加数据缩放(DataZoom)功能:
from pyecharts import options as opts
from pyecharts.charts import Klinedata = [[2320.26, 2320.26, 2287.3, 2362.94],[2300, 2291.3, 2288.26, 2308.38],[2295.35, 2346.5, 2295.35, 2345.92],[2347.22, 2358.98, 2337.35, 2363.8],[2360.75, 2382.48, 2347.89, 2383.76],[2383.43, 2385.42, 2371.23, 2391.82],[2377.41, 2419.02, 2369.57, 2421.15],[2425.92, 2428.15, 2417.58, 2440.38],[2411, 2433.13, 2403.3, 2437.42],[2432.68, 2334.48, 2427.7, 2441.73],[2430.69, 2418.53, 2394.22, 2433.89],[2416.62, 2432.4, 2414.4, 2443.03],[2441.91, 2421.56, 2418.43, 2444.8],[2420.26, 2382.91, 2373.53, 2427.07],[2383.49, 2397.18, 2370.61, 2397.94],[2378.82, 2325.95, 2309.17, 2378.82],[2322.94, 2314.16, 2308.76, 2330.88],[2320.62, 2325.82, 2315.01, 2338.78],[2313.74, 2293.34, 2289.89, 2340.71],[2297.77, 2313.22, 2292.03, 2324.63],[2322.32, 2365.59, 2308.92, 2366.16],[2364.54, 2359.51, 2330.86, 2369.65],[2332.08, 2273.4, 2259.25, 2333.54],[2274.81, 2326.31, 2270.1, 2328.14],[2333.61, 2347.18, 2321.6, 2351.44],[2340.44, 2324.29, 2304.27, 2352.02],[2326.42, 2318.61, 2314.59, 2333.67],[2314.68, 2310.59, 2296.58, 2320.96],[2309.16, 2286.6, 2264.83, 2333.29],[2282.17, 2263.97, 2253.25, 2286.33],[2255.77, 2270.28, 2253.31, 2276.22],
]c = (Kline().add_xaxis(["2017/7/{}".format(i + 1) for i in range(31)]).add_yaxis("kline", data).set_global_opts(xaxis_opts=opts.AxisOpts(is_scale=True),yaxis_opts=opts.AxisOpts(is_scale=True,splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),),datazoom_opts=[opts.DataZoomOpts()],title_opts=opts.TitleOpts(title="Kline-DataZoom-slider"),)#.render("kline_datazoom_slider.html")
)
c.render_notebook()
代码解析
-
数据准备:与案例一相同,我们使用了31天的K线数据。
-
创建K线图对象:通过
Kline()
函数创建一个K线图实例。 -
添加X轴和Y轴数据:与案例一类似,但没有添加最大值标记线。
-
设置全局配置:
xaxis_opts
和yaxis_opts
保持与案例一相同的配置。- 添加了
datazoom_opts=[opts.DataZoomOpts()]
,这是本案例的核心,启用了数据缩放功能。 - 设置了图表标题为"Kline-DataZoom-slider"。
关键技巧
- 数据缩放功能:
DataZoomOpts()
为K线图添加了一个底部滑块,用户可以通过拖动滑块来放大或缩小图表的时间范围,查看更详细或更宏观的价格走势。 - 缩放配置:可以通过
DataZoomOpts
的参数来自定义缩放功能,例如设置初始缩放范围、是否启用滚动条等。 - 多缩放器:可以添加多个
DataZoomOpts
实例,实现不同方向的缩放(水平和垂直)。
这个案例展示了如何为K线图添加交互性的数据缩放功能,使图表更具实用性。接下来我们将继续学习更多高级功能。
案例三:自定义数据缩放滑块位置
下面是第三个案例的代码,展示了如何自定义数据缩放滑块的位置:
from pyecharts import options as opts
from pyecharts.charts import Klinedata = [[2320.26, 2320.26, 2287.3, 2362.94],[2300, 2291.3, 2288.26, 2308.38],[2295.35, 2346.5, 2295.35, 2345.92],[2347.22, 2358.98, 2337.35, 2363.8],[2360.75, 2382.48, 2347.89, 2383.76],[2383.43, 2385.42, 2371.23, 2391.82],[2377.41, 2419.02, 2369.57, 2421.15],[2425.92, 2428.15, 2417.58, 2440.38],[2411, 2433.13, 2403.3, 2437.42],[2432.68, 2334.48, 2427.7, 2441.73],[2430.69, 2418.53, 2394.22, 2433.89],[2416.62, 2432.4, 2414.4, 2443.03],[2441.91, 2421.56, 2418.43, 2444.8],[2420.26, 2382.91, 2373.53, 2427.07],[2383.49, 2397.18, 2370.61, 2397.94],[2378.82, 2325.95, 2309.17, 2378.82],[2322.94, 2314.16, 2308.76, 2330.88],[2320.62, 2325.82, 2315.01, 2338.78],[2313.74, 2293.34, 2289.89, 2340.71],[2297.77, 2313.22, 2292.03, 2324.63],[2322.32, 2365.59, 2308.92, 2366.16],[2364.54, 2359.51, 2330.86, 2369.65],[2332.08, 2273.4, 2259.25, 2333.54],[2274.81, 2326.31, 2270.1, 2328.14],[2333.61, 2347.18, 2321.6, 2351.44],[2340.44, 2324.29, 2304.27, 2352.02],[2326.42, 2318.61, 2314.59, 2333.67],[2314.68, 2310.59, 2296.58, 2320.96],[2309.16, 2286.6, 2264.83, 2333.29],[2282.17, 2263.97, 2253.25, 2286.33],[2255.77, 2270.28, 2253.31, 2276.22],
]c = (Kline().add_xaxis(["2017/7/{}".format(i + 1) for i in range(31)]).add_yaxis("kline", data).set_global_opts(xaxis_opts=opts.AxisOpts(is_scale=True),yaxis_opts=opts.AxisOpts(is_scale=True,splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),),datazoom_opts=[opts.DataZoomOpts(pos_bottom="-2%")],title_opts=opts.TitleOpts(title="Kline-DataZoom-slider-Position"),)#.render("kline_datazoom_slider_position.html")
)
c.render_notebook()
代码解析
-
数据准备:与前两个案例相同,我们使用了31天的K线数据。
-
创建K线图对象:通过
Kline()
函数创建一个K线图实例。 -
添加X轴和Y轴数据:与前两个案例类似。
-
设置全局配置:
xaxis_opts
和yaxis_opts
保持与前两个案例相同的配置。datazoom_opts
中添加了pos_bottom="-2%"
参数,这是本案例的核心,用于自定义数据缩放滑块的位置。- 设置了图表标题为"Kline-DataZoom-slider-Position"。
关键技巧
- 自定义滑块位置:通过
pos_bottom
参数可以调整数据缩放滑块的垂直位置,负值表示超出图表底部边界。 - 其他位置参数:除了
pos_bottom
,还可以使用pos_top
、pos_left
和pos_right
等参数来调整滑块的位置。 - 滑块样式:可以通过
DataZoomOpts
的其他参数来自定义滑块的样式,如颜色、高度等。
这个案例展示了如何自定义数据缩放滑块的位置,使图表布局更加灵活。接下来我们将继续学习更多高级功能。
案例四:K线图与移动平均线(MA)的组合
下面是第四个案例的代码,展示了如何将K线图与移动平均线组合:
import requests
import json
from pyecharts import options as opts
from pyecharts.charts import Kline, Line, Bar, Grid
from pyecharts.commons.utils import JsCode
from typing import List, Union, Dict, Any# 获取数据
# 注意:这里的API链接可能会失效,实际使用时请替换为有效的数据源
url = 'https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d&limit=30'
response = requests.get(url)
origin_data = json.loads(response.text)# 数据处理函数
def split_data(origin_data: List[List[Any]]) -> Dict[str, Any]:datas = []times = []vols = []macds = []difs = []deas = []for item in origin_data:# 时间处理times.append(item[0])# K线数据处理datas.append([float(item[1]), float(item[4]), float(item[3]), float(item[2])])# 成交量处理vols.append(float(item[5]))return {"datas": datas,"times": times,"vols": vols,"macds": macds,"difs": difs,"deas": deas}def split_data_part():mark_line_data = []idx = 0vols = 0for i in range(len(data["times"])):if i % 10 == 0 and i != 0:mark_line_data.append([{"xAxis": idx,"yAxis": float("%.2f" % data["datas"][idx][3])if data["datas"][i][1] > data["datas"][i][0]else float("%.2f" % data["datas"][i][2]),"value": str(float("%.2f" % (vols / (i - idx + 1)))) + " M",},{"xAxis": i,"yAxis": float("%.2f" % data["datas"][i][3])if data["datas"][i][1] > data["datas"][i][0]else float("%.2f" % data["datas"][i][2]),},])idx = ivols = data["datas"][i][4] if len(data["datas"][i]) > 4 else 0return mark_line_data# 计算移动平均线
def calculate_ma(day_count: int, data_datas: List[List[float]]) -> List[Union[float, str]]:result: List[Union[float, str]] = []for i in range(len(data_datas)):if i < day_count:result.append("-")continuesum_total = 0.0for j in range(day_count):sum_total += float(data_datas[i - j][1])result.append(abs(float("%.2f" % (sum_total / day_count))))return result# 主函数
def main():global datadata = split_data(origin_data=origin_data)draw_charts()# 绘制图表
def draw_charts():# K线图kline = (Kline().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="",y_axis=data["datas"],itemstyle_opts=opts.ItemStyleOpts(color="#ef232a",color0="#14b143",border_color="#ef232a",border_color0="#14b143",),markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),opts.MarkPointItem(type_="min", name="最小值"),]),).set_global_opts(title_opts=opts.TitleOpts(title="K线图与移动平均线组合", pos_left="0"),xaxis_opts=opts.AxisOpts(type_="category",is_scale=True,boundary_gap=False,axisline_opts=opts.AxisLineOpts(is_on_zero=False),splitline_opts=opts.SplitLineOpts(is_show=False),split_number=20,min_="dataMin",max_="dataMax",),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),opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100),],))# 移动平均线图line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="MA5",y_axis=calculate_ma(day_count=5, data_datas=data["datas"]),is_smooth=True,linestyle_opts=opts.LineStyleOpts(opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).add_yaxis(series_name="MA10",y_axis=calculate_ma(day_count=10, data_datas=data["datas"]),is_smooth=True,linestyle_opts=opts.LineStyleOpts(opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).add_yaxis(series_name="MA20",y_axis=calculate_ma(day_count=20, data_datas=data["datas"]),is_smooth=True,linestyle_opts=opts.LineStyleOpts(opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).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),),))# 叠加K线图和移动平均线图overlap_kline_line = kline.overlap(line)# 成交量柱状图bar = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="成交量",y_axis=data["vols"],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.dataIndex < data.datas.length && data.datas[params.dataIndex][1] > data.datas[params.dataIndex][0]) {colorList = '#ef232a';} else {colorList = '#14b143';}return colorList;}""")),).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),))# 组合图表grid_chart = Grid()grid_chart.add_js_funcs("var data = {}".format(json.dumps(data)))# 添加K线图和移动平均线图grid_chart.add(overlap_kline_line,grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"),)# 添加成交量柱状图grid_chart.add(bar,grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="16%"),)grid_chart.render("kline_with_ma.html")if __name__ == "__main__":main()
代码解析
-
数据获取:通过
requests
库从网络API获取比特币USD价格数据,并通过split_data
函数解析数据。 -
移动平均线计算:
calculate_ma
函数用于计算指定天数的移动平均线,这里我们计算了5日、10日和20日移动平均线。 -
K线图创建:创建K线图并设置自定义样式,包括涨跌颜色区分和最大值/最小值标记点。
-
移动平均线图创建:创建线图来显示5日、10日和20日移动平均线,使用不同颜色区分。
-
成交量柱状图创建:创建柱状图来显示成交量数据,并使用JavaScript代码根据涨跌情况自定义颜色。
-
图表组合:使用
overlap
方法将K线图和移动平均线图叠加,然后使用Grid
组件将叠加后的图表与成交量柱状图组合在一起,形成一个完整的分析图表。
关键技巧
- 数据获取:通过网络API获取实时数据,可以使图表内容更加丰富和实用。
- 移动平均线:移动平均线是技术分析中的重要指标,可以帮助识别价格趋势。
- 多图表组合:使用
Grid
组件可以将多个图表组合在一起,提供更全面的分析视角。 - 自定义样式:可以通过
itemstyle_opts
参数自定义K线和柱状图的颜色、边框等样式。 - 数据缩放:添加多个
DataZoomOpts
实例,实现内部缩放和外部滑块缩放两种方式。
这个案例展示了如何创建一个功能完整的金融分析图表,结合了K线图、移动平均线和成交量数据,非常适合用于股票、期货等金融产品的技术分析。
案例五:Professional_kline_chart(专业级K线图)
下面是第五个案例的代码,展示了如何创建一个功能完整的专业级K线图:
#数据字典省略
def split_data(origin_data) -> dict:datas = []times = []vols = []macds = []difs = []deas = []for i in range(len(origin_data)):datas.append(origin_data[i][1:])times.append(origin_data[i][0:1][0])vols.append(origin_data[i][5])macds.append(origin_data[i][7])difs.append(origin_data[i][8])deas.append(origin_data[i][9])vols = [int(v) for v in vols]return {"datas": datas,"times": times,"vols": vols,"macds": macds,"difs": difs,"deas": deas,}def split_data_part() -> Sequence:mark_line_data = []idx = 0tag = 0vols = 0for i in range(len(data["times"])):if data["datas"][i][5] != 0 and tag == 0:idx = ivols = data["datas"][i][4]tag = 1if tag == 1:vols += data["datas"][i][4]if data["datas"][i][5] != 0 or tag == 1:mark_line_data.append([{"xAxis": idx,"yAxis": float("%.2f" % data["datas"][idx][3])if data["datas"][idx][1] > data["datas"][idx][0]else float("%.2f" % data["datas"][idx][2]),"value": vols,},{"xAxis": i,"yAxis": float("%.2f" % data["datas"][i][3])if data["datas"][i][1] > data["datas"][i][0]else float("%.2f" % data["datas"][i][2]),},])idx = ivols = data["datas"][i][4]tag = 2if tag == 2:vols += data["datas"][i][4]if data["datas"][i][5] != 0 and tag == 2:mark_line_data.append([{"xAxis": idx,"yAxis": float("%.2f" % data["datas"][idx][3])if data["datas"][i][1] > data["datas"][i][0]else float("%.2f" % data["datas"][i][2]),"value": str(float("%.2f" % (vols / (i - idx + 1)))) + " M",},{"xAxis": i,"yAxis": float("%.2f" % data["datas"][i][3])if data["datas"][i][1] > data["datas"][i][0]else float("%.2f" % data["datas"][i][2]),},])idx = ivols = data["datas"][i][4]return mark_line_datadef calculate_ma(day_count: int):result: List[Union[float, str]] = []for i in range(len(data["times"])):if i < day_count:result.append("-")continuesum_total = 0.0for j in range(day_count):sum_total += float(data["datas"][i - j][1])result.append(abs(float("%.2f" % (sum_total / day_count))))return resultdef draw_chart():kline = (Kline().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="",y_axis=data["datas"],itemstyle_opts=opts.ItemStyleOpts(color="#ef232a",color0="#14b143",border_color="#ef232a",border_color0="#14b143",),markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),opts.MarkPointItem(type_="min", name="最小值"),]),markline_opts=opts.MarkLineOpts(label_opts=opts.LabelOpts(position="middle", color="blue", font_size=15),data=split_data_part(),symbol=["circle", "none"],),).set_series_opts(markarea_opts=opts.MarkAreaOpts(is_silent=True, data=split_data_part())).set_global_opts(title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"),xaxis_opts=opts.AxisOpts(type_="category",is_scale=True,boundary_gap=False,axisline_opts=opts.AxisLineOpts(is_on_zero=False),splitline_opts=opts.SplitLineOpts(is_show=False),split_number=20,min_="dataMin",max_="dataMax",),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),opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100),opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100),],# 三个图的 axis 连在一块# axispointer_opts=opts.AxisPointerOpts(# is_show=True,# link=[{"xAxisIndex": "all"}],# label=opts.LabelOpts(background_color="#777"),# ),))kline_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="MA5",y_axis=calculate_ma(day_count=5),is_smooth=True,linestyle_opts=opts.LineStyleOpts(opacity=0.5),label_opts=opts.LabelOpts(is_show=False),).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 + Lineoverlap_kline_line = kline.overlap(kline_line)# Bar-1bar_1 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="Volumn",y_axis=data["vols"],xaxis_index=1,yaxis_index=1,label_opts=opts.LabelOpts(is_show=False),# 根据 echarts demo 的原版是这么写的# itemstyle_opts=opts.ItemStyleOpts(# color=JsCode("""# function(params) {# var colorList;# if (data.datas[params.dataIndex][1]>data.datas[params.dataIndex][0]) {# colorList = '#ef232a';# } else {# colorList = '#14b143';# }# return colorList;# }# """)# )# 改进后在 grid 中 add_js_funcs 后变成如下itemstyle_opts=opts.ItemStyleOpts(color=JsCode("""function(params) {var colorList;if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) {colorList = '#ef232a';} else {colorList = '#14b143';}return colorList;}""")),).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),))# Bar-2 (Overlap Bar + Line)bar_2 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="MACD",y_axis=data["macds"],xaxis_index=2,yaxis_index=2,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;}""")),).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category",grid_index=2,axislabel_opts=opts.LabelOpts(is_show=False),),yaxis_opts=opts.AxisOpts(grid_index=2,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().add_xaxis(xaxis_data=data["times"]).add_yaxis(series_name="DIF",y_axis=data["difs"],xaxis_index=2,yaxis_index=2,label_opts=opts.LabelOpts(is_show=False),).add_yaxis(series_name="DIF",y_axis=data["deas"],xaxis_index=2,yaxis_index=2,label_opts=opts.LabelOpts(is_show=False),).set_global_opts(legend_opts=opts.LegendOpts(is_show=False)))# 最下面的柱状图和折线图overlap_bar_line = bar_2.overlap(line_2)# 最后的 Gridgrid_chart = Grid()# 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值# demo 中的代码也是用全局变量传的grid_chart.add_js_funcs("var barData = {}".format(data["datas"]))# K线图和 MA5 的折线图grid_chart.add(overlap_kline_line,grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"),)# Volumn 柱状图grid_chart.add(bar_1,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("professional_kline_chart.html")if __name__ == "__main__":data = split_data(origin_data=echarts_data)draw_chart()
代码解析
-
数据获取与处理:通过
get_data
函数从网络API获取道琼斯指数数据,并通过split_data
函数解析数据。 -
技术指标计算:计算了多种技术指标,包括移动平均线(MA5、MA10、MA20、MA30)和MACD指标(DIF、DEA、MACD)。
-
K线图创建:创建K线图并设置自定义样式,包括涨跌颜色区分。
-
移动平均线图创建:创建线图来显示不同周期的移动平均线,使用不同颜色区分。
-
成交量柱状图创建:创建柱状图来显示成交量数据,并使用JavaScript代码自定义颜色。
-
MACD指标图创建:创建MACD柱状图和线图,展示DIF、DEA和MACD数据。
-
图表叠加与组合:使用
overlap
方法将K线图和移动平均线图叠加,将MACD线图和柱状图叠加,然后使用Grid
组件将所有图表组合在一起,形成一个完整的专业级分析图表。
关键技巧
- 多技术指标整合:同时展示K线图、移动平均线和MACD指标,提供更全面的分析视角。
- JavaScript代码自定义:使用
JsCode
自定义柱状图颜色,根据数据值动态设置颜色。 - 高级图表布局:使用
Grid
组件创建多层次的图表布局,优化空间利用。 - 交互功能增强:添加数据缩放、Brush工具和联动提示框,提升用户体验。
- 性能优化:关闭动画效果,提高图表渲染速度。
这个案例展示了如何创建一个功能完整的专业级K线图分析工具,整合了多种技术指标和交互功能,非常适合用于专业的金融分析工作。
总结
通过以上五个案例,我们系统学习了pyecharts中K线图的从入门到精通的使用方法,涵盖了以下核心知识点和技巧:
-
基础K线图创建:掌握了K线图的基本结构和数据格式,以及如何添加标记线和自定义样式。
-
数据缩放功能:学会了如何为K线图添加数据缩放滑块,以及如何自定义滑块的位置和样式。
-
多图表组合:掌握了如何将K线图与移动平均线、成交量柱状图和MACD指标图组合,创建综合分析图表。
-
技术指标计算:学会了如何计算移动平均线(MA)和MACD等常用技术指标,并将其可视化。
-
高级交互功能:掌握了如何添加数据缩放、联动提示框等交互功能,提升用户体验。
-
自定义样式:学会了如何使用JavaScript代码自定义图表元素的样式,实现更丰富的视觉效果。
-
数据获取与处理:掌握了如何从网络API获取实时数据,并进行预处理和解析。
这些技巧不仅可以帮助你创建功能强大、交互友好的金融分析图表,还可以应用到其他类型的数据分析可视化任务中。在实际应用中,你可以根据具体需求灵活组合这些技巧,创建出更具个性化的图表。
pyecharts作为一个功能丰富的可视化库,还有很多其他强大的功能和图表类型值得探索。希望本教程能够帮助你快速掌握K线图的高级用法,并在实际项目中发挥作用。祝你在数据可视化的道路上越走越远!
``