基于 Echarts 的 Python 图表库:Pyecahrts交互式的K线图(股票)

目录

一、K线图的介绍

二、K线图的使用场景

1. 趋势分析

2. 支撑与阻力

3. 价格反转

4. 交易信号

5. 波动性分析

三、Pyecharts绘制K线图

四、总结


一、K线图的介绍

        K线图(K-Line Chart)是用于显示金融市场价格走势的一种图表形式,主要用于股票、期货、外汇等交易市场的技术分析。K线图是由一系列矩形图组成,每个矩形图被称为一个K线(Kandlestick)。每个K线代表一定时间内的价格走势,常见的时间周期包括分钟、小时、日等。每个K线通常包括四个价格点,分别是开盘价(Open)、收盘价(Close)、最高价(High)和最低价(Low)。这四个价格点构成了K线的矩形,通过不同的颜色和形状来表示价格走势。常见的K线颜色分为两种,通常是实心和空心,或者涂色和未涂色。实心或涂色的K线表示当前时段收盘价高于开盘价,空心或未涂色的K线表示当前时段收盘价低于开盘价。这种表示方法可以直观地展示市场的涨跌情况。

        K线图除了显示基本的价格信息外,还可以通过不同的形态和组合来分析市场趋势、价格反转等信息。一些常见的K线形态包括单根K线、多根K线组合,如大阳线、大阴线、十字星等。


二、K线图的使用场景

        K线图在金融市场中广泛应用,主要用于技术分析,帮助投资者和交易员更好地理解市场走势和制定交易决策。以下是一些K线图的主要使用场景:

1. 趋势分析

        投资者可以通过观察K线图来判断市场的趋势是上升、下降还是横盘。趋势分析是技术分析的核心,有助于制定相应的交易策略。

2. 支撑与阻力

        K线图可以帮助识别价格的支撑和阻力水平。支撑和阻力是价格在上升或下降过程中遇到的关键水平,对于制定买入或卖出决策具有重要意义。

3. 价格反转

        特定的K线形态和组合可以暗示价格反转的可能性。例如,出现反转信号的K线组合可能预示市场即将发生变化,投资者可以根据这些信号调整其交易策略。

4. 交易信号

        K线图常用于生成各种技术指标,如移动平均线、相对强弱指标等,这些指标可以产生交易信号,指导投资者何时买入或卖出。

5. 波动性分析

        通过观察K线的幅度和波动性,投资者可以评估市场的波动水平。波动性分析有助于确定适当的止损水平和目标价格,从而降低风险。

6. 交易心理学

        K线图反映了市场参与者的情绪和心理状态。例如,长期上涨的市场可能使投资者过度乐观,而长期下跌的市场可能导致恐慌情绪。通过观察K线图,投资者可以更好地理解市场参与者的情绪,并据此调整其交易策略。


三、Pyecharts绘制K线图

代码如下(示例):

import requests
from typing import List, Union
from pyecharts import options as opts
from pyecharts.charts import Kline, Line, Bar, Grid

# 获取数据的函数,从指定URL获取数据并解析
def get_data():
    response = requests.get(
        url="https://echarts.apache.org/examples/data/asset/data/stock-DJI.json"
    )
    json_response = response.json()
    # 解析数据
    return split_data(data=json_response)

# 将原始数据拆分成需要的格式
def split_data(data):
    category_data = []  # 用于存储X轴(时间)数据
    values = []        # 存储K线图的OHLC数据
    volumes = []       # 存储交易量数据

    for i, tick in enumerate(data):
        category_data.append(tick[0])
        values.append(tick)
        # 1表示涨,-1表示跌
        volumes.append([i, tick[4], 1 if tick[1] > tick[2] else -1])
    return {"categoryData": category_data, "values": values, "volumes": volumes}

# 计算移动平均线的函数
def calculate_ma(day_count: int, data):
    result: List[Union[float, str]] = []
    for i in range(len(data["values"])):
        if i < day_count:
            result.append("-")  # 前几天数据不足时用"-"填充
            continue
        sum_total = 0.0
        for j in range(day_count):
            sum_total += float(data["values"][i - j][1])
        result.append(abs(float("%.3f" % (sum_total / day_count))))
    return result

# 绘制K线图、折线图和柱状图
def draw_charts():
    # 提取K线图数据
    kline_data = [data[1:-1] for data in chart_data["values"]]
    # 创建K线图对象
    kline = (
        Kline()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="Dow-Jones指数",
            y_axis=kline_data,
            itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"),
        )
        .set_global_opts(
            legend_opts=opts.LegendOpts(
                is_show=False, pos_bottom=10, pos_left="center"
            ),
            # 设置数据缩放、拖拽和切换显示的功能
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    xaxis_index=[0, 1],
                    range_start=98,
                    range_end=100,
                ),
                opts.DataZoomOpts(
                    is_show=True,
                    xaxis_index=[0, 1],
                    type_="slider",
                    pos_top="85%",
                    range_start=98,
                    range_end=100,
                ),
            ],
            # 设置Y轴的一些参数
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
                ),
            ),
            # 设置提示框的样式
            tooltip_opts=opts.TooltipOpts(
                trigger="axis",
                axis_pointer_type="cross",
                background_color="rgba(245, 245, 245, 0.8)",
                border_width=1,
                border_color="#ccc",
                textstyle_opts=opts.TextStyleOpts(color="#000"),
            ),
            # 设置视觉映射,用于表示涨跌情况
            visualmap_opts=opts.VisualMapOpts(
                is_show=False,
                dimension=2,
                series_index=5,
                is_piecewise=True,
                pieces=[
                    {"value": 1, "color": "#00da3c"},
                    {"value": -1, "color": "#ec0000"},
                ],
            ),
            # 设置坐标轴指示器
            axispointer_opts=opts.AxisPointerOpts(
                is_show=True,
                link=[{"xAxisIndex": "all"}],
                label=opts.LabelOpts(background_color="#777"),
            ),
            # 设置刷子,用于进行区域选择
            brush_opts=opts.BrushOpts(
                x_axis_index="all",
                brush_link="all",
                out_of_brush={"colorAlpha": 0.1},
                brush_type="lineX",
            ),
        )
    )

    # 创建折线图对象
    line = (
        Line()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="MA5",
            y_axis=calculate_ma(day_count=5, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA10",
            y_axis=calculate_ma(day_count=10, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA20",
            y_axis=calculate_ma(day_count=20, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA30",
            y_axis=calculate_ma(day_count=30, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))
    )

    # 创建柱状图对象
    bar = (
        Bar()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="成交量",
            y_axis=chart_data["volumes"],
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                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=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

    # K线图和折线图的重叠
    overlap_kline_line = kline.overlap(line)

    # 创建Grid图表,包含K线图和折线图的重叠部分以及柱状图
    grid_chart = Grid(
        init_opts=opts.InitOpts(
            width="1000px",
            height="800px",
            animation_opts=opts.AnimationOpts(animation=False),
        )
    )
    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%"),
    )
    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(
            pos_left="10%", pos_right="8%", pos_top="63%", height="16%"
        ),
    )

    # 渲染生成HTML文件
    grid_chart.render("professional_kline_brush.html")


if __name__ == "__main__":
    chart_data = get_data()
    draw_charts()

k线图


四、总结

        通过本文的学习,读者可以掌握使用Python中的Pyecharts库绘制金融数据可视化图表的基本方法。这不仅有助于理解市场走势和交易活动,还为更深入的数据分析提供了基础。通过对金融数据的可视化,投资者和分析师能够更直观地捕捉市场机会,做出更明智的决策。

        另外,新的一年祝各位基金股票一片红o( ̄▽ ̄)d!

你可能感兴趣的:(数据可视化,python,pyecharts,echarts,python,数据可视化)