Ejemplo n.º 1
0
def plot_kline(df, rendered=True, col=""):
    """
    针对 dataframe 直接画出标准看盘软件的上k线图下成交量图的形式

    :param df:
    :param rendered:
    :param col:
    :return:
    """
    kline = (
        Kline()
        .add_xaxis(xaxis_data=list(df["date"]))
        .add_yaxis(
            series_name="",
            itemstyle_opts=opts.ItemStyleOpts(
                color="#ef232a",
                color0="#14b143",
                border_color="#ef232a",
                border_color0="#14b143",
            ),
            y_axis=list(zip(df["open"], df["close"], df["high"], df["low"])),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name="最大值"),
                    opts.MarkPointItem(type_="min", name="最小值"),
                ],
                symbol="pin",
                symbol_size=[56, 40],
                # label_opts=opts.LabelOpts(color="#CCFFFF",position=["top", "bottom"])
            ),
        )
        .set_global_opts(
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=True,
                    type_="slider",
                    range_start=50,
                    range_end=100,
                    xaxis_index=[0, 1],
                ),
                opts.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    range_start=50,
                    range_end=100,
                    xaxis_index=1,
                ),
            ],
            tooltip_opts=opts.TooltipOpts(
                is_show=True,
                trigger="axis",
                trigger_on="mousemove",
                axis_pointer_type="cross",
            ),
        )
    )
    if col:
        line = (
            Line()
            .add_xaxis(xaxis_data=list(df["date"]))
            .add_yaxis(
                series_name="",
                y_axis=list(df[col]),
                is_smooth=True,
                linestyle_opts=opts.LineStyleOpts(opacity=0.5),
                label_opts=opts.LabelOpts(is_show=False),
            )
        )
        kline = kline.overlap(line)

    if "volume" in df.columns:
        vl = list(df["volume"])
    elif "amount" in df.columns:
        vl = list(df["amount"])
    else:
        vl = [0 for _ in range(len(df))]
    bar = (
        Bar()
        .add_js_funcs("var barData = {}".format(list(df["close"] - df["open"])))
        .add_xaxis(xaxis_data=list(df["date"]))
        .add_yaxis(
            series_name="",
            yaxis_data=vl,
            label_opts=opts.LabelOpts(is_show=False),
            itemstyle_opts=opts.ItemStyleOpts(
                color=JsCode(
                    """
                function(params) {
                    var colorList;
                    if (barData[params.dataIndex]>0) {
                        colorList = '#ef232a';
                    } else {
                        colorList = '#14b143';
                    }
                    return colorList;
                }
                """
                )
            ),
        )
        .set_global_opts(
            tooltip_opts=opts.TooltipOpts(
                is_show=True,
                trigger="axis",
                trigger_on="mousemove",
                axis_pointer_type="cross",
            ),
        )
    )
    grid_chart = Grid()
    grid_chart.add_js_funcs("var barData = {}".format(list(df["close"] - df["open"])))
    grid_chart.add(
        kline,
        grid_opts=opts.GridOpts(
            pos_left="10%", pos_right="1%", pos_top="2%", height="65%"
        ),
    )

    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(
            pos_left="10%", pos_right="1%", pos_top="71%", height="22%"
        ),
    )
    if rendered:
        return grid_chart.render_notebook()
    else:
        return grid_chart
Ejemplo n.º 2
0
def plot_kline(ka, bs=None, file_html="kline.html", width="1400px", height="680px"):
    """

    :param ka: KlineAnalyze
    :param bs: pd.DataFrame
        买卖点,包含三个字段 ["操作提示", "交易时间", "交易价格"]
    :param file_html: str
    :param width: str
    :param height: str
    :return: None
    """
    df = ka.to_df(use_macd=True, ma_params=(5, 20,))
    x = df.dt.to_list()
    title = "%s | %s 至 %s" % (ka.symbol, ka.start_dt, ka.end_dt)
    kline = (
        Kline()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="",
            y_axis=df[['open', 'close', 'low', 'high']].values.tolist(),
            itemstyle_opts=opts.ItemStyleOpts(
                color="#ef232a",
                color0="#14b143",
                border_color="#ef232a",
                border_color0="#14b143",
            ),
        )
            .set_series_opts(
            markarea_opts=opts.MarkAreaOpts(is_silent=True)
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(title=title, 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),
                axislabel_opts=opts.LabelOpts(is_show=True, position="inside")
            ),
            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="96%", 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=x)
            .add_yaxis(
            series_name="笔",
            y_axis=df.bi.tolist(),
            is_smooth=False,
            is_connect_nones=True,
            symbol='diamond',
            symbol_size=8,
            linestyle_opts=opts.LineStyleOpts(opacity=1, type_='dotted', width=2),
            label_opts=opts.LabelOpts(is_show=False),
        )
            .add_yaxis(
            series_name="线段",
            y_axis=df.xd.tolist(),
            is_smooth=False,
            is_connect_nones=True,
            symbol='triangle',
            symbol_size=12,
            linestyle_opts=opts.LineStyleOpts(opacity=1, type_='solid', width=2),
            label_opts=opts.LabelOpts(is_show=True, position='right'),
        )
            .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, position="inside"),
            ),
        )
    )
    # Overlap Kline + Line
    overlap_kline_line = kline.overlap(kline_line)

    if isinstance(bs, pd.DataFrame) and len(bs) > 0:
        c = (
            Scatter()
                .add_xaxis(bs['交易时间'].to_list())
                .add_yaxis(
                "买卖点",
                bs['交易价格'].to_list(),
                label_opts=opts.LabelOpts(
                    is_show=True,
                    position="left",
                    formatter=JsCode(
                        "function(params){return bsName[params.dataIndex][0];}"
                    )
                ),
            ))
        overlap_kline_line = overlap_kline_line.overlap(c)

    # draw volume
    bar_1 = (
        Bar()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="Volumn",
            yaxis_data=df.vol.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 (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),
            ),
            yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(is_show=True, position='inside')
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

    # Bar-2 (Overlap Bar + Line)
    bar_2 = (
        Bar()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="MACD",
            yaxis_data=df.macd.tolist(),
            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, position="inside"),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

    line_2 = (
        Line()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="DIF",
            y_axis=df['diff'].tolist(),
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        )
            .add_yaxis(
            series_name="DEA",
            y_axis=df['dea'].tolist(),
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        )
            .set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
    )

    # draw MACD
    overlap_bar_line = bar_2.overlap(line_2)

    # 最后的 Grid
    grid_chart = Grid(init_opts=opts.InitOpts(width=width, height=height, page_title=title))
    grid_chart.add_js_funcs("var barData = {}".format(df[['open', 'close', 'low', 'high']].values.tolist()))
    if isinstance(bs, pd.DataFrame) and len(bs) > 0:
        grid_chart.add_js_funcs("var bsName = {}".format(bs[["操作提示", "交易价格"]].values.tolist()))

    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"),
    )
    grid_chart.add(
        bar_1,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"),
    )
    grid_chart.add(
        overlap_bar_line,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"),
    )
    grid_chart.render(path=file_html)
Ejemplo n.º 3
0
def 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=True,
                                  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),
            ],
        ))
    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",
            axislabel_opts=opts.LabelOpts(is_show=False),
        ),
        yaxis_opts=opts.AxisOpts(
            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_line = kline.overlap(kline_line)

    bar_1 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(
        series_name="Volumn",
        y_axis=data["vols"],
        label_opts=opts.LabelOpts(is_show=False),
        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",
            axislabel_opts=opts.LabelOpts(is_show=False),
        ),
        legend_opts=opts.LegendOpts(is_show=False),
    ))
    bar_2 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(
        series_name="MACD",
        y_axis=data["macds"],
        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",
            axislabel_opts=opts.LabelOpts(is_show=False),
        ),
        yaxis_opts=opts.AxisOpts(
            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"],
        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)

    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1400px", height="800px", theme=ThemeType.ESSOS))
    grid_chart.add_js_funcs("var barData={}".format(data["datas"]))
    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"),
    )

    grid_chart.add(
        bar_1,
        grid_opts=opts.GridOpts(pos_left="3%",
                                pos_right="1%",
                                pos_top="71%",
                                height="10%"),
    )

    grid_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")
Ejemplo n.º 4
0
    def draw_chart(cls, data):
        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=cls.split_data_part(data),
                    symbol=["circle", "none"],
                ),
            ).set_series_opts(markarea_opts=opts.MarkAreaOpts(
                is_silent=True, data=cls.split_data_part(data))).
            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),
                    opts.DataZoomOpts(is_show=False,
                                      xaxis_index=[0,
                                                   3],
                                      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"])
            # # EMA10
            # .add_yaxis(
            #     series_name="EMA10",
            #     y_axis=data["ema10"],
            #     xaxis_index=2,
            #     yaxis_index=2,
            #     label_opts=opts.LabelOpts(is_show=False),
            # )

            # EMA144
            # .add_yaxis(
            #     series_name="EMA144",
            #     y_axis=data["ema144"],
            #     xaxis_index=2,
            #     yaxis_index=2,
            #     label_opts=opts.LabelOpts(is_show=False),
            # )
            # boll_median
            .add_yaxis(
                series_name="median",
                y_axis=data["boll_median"],
                xaxis_index=2,
                yaxis_index=2,
                label_opts=opts.LabelOpts(is_show=False),
            )
            # boll_upper
            .add_yaxis(
                series_name="upper",
                y_axis=data["boll_upper"],
                xaxis_index=2,
                yaxis_index=2,
                label_opts=opts.LabelOpts(is_show=False),
            )
            # boll_lower
            .add_yaxis(
                series_name="lower",
                y_axis=data["boll_lower"],
                xaxis_index=2,
                yaxis_index=2,
                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 + Line
        overlap_kline_line = kline.overlap(kline_line)

        # Bar-1
        bar_1 = (
            Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(
                series_name="Volumn",
                yaxis_data=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",
            yaxis_data=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="DEA",
            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)))

        rsi_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis(
            series_name="rsi6",
            y_axis=data["rsi6"],
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="rsi12",
            y_axis=data["rsi12"],
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="rsi24",
            y_axis=data["rsi24"],
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False)))

        # MACD
        overlap_bar_line = bar_2.overlap(line_2)

        # 最后的 Grid
        grid_chart = Grid(
            init_opts=opts.InitOpts(width="1400px", height="800px"))

        # 这个是为了把 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="4%",
                                    pos_right="1%",
                                    height="45%"),
        )
        # Volumn 柱状图
        grid_chart.add(
            bar_1,
            grid_opts=opts.GridOpts(pos_left="4%",
                                    pos_right="1%",
                                    pos_top="56%",
                                    height="10%"),
        )
        # MACD DIFS DEAS
        grid_chart.add(
            overlap_bar_line,
            grid_opts=opts.GridOpts(pos_left="4%",
                                    pos_right="1%",
                                    pos_top="68%",
                                    height="14%"),
        )
        # rsi6
        grid_chart.add(
            rsi_line,
            grid_opts=opts.GridOpts(pos_left="4%",
                                    pos_right="1%",
                                    pos_top="84%",
                                    height="10%"),
        )
        return grid_chart.render_embed()
Ejemplo n.º 5
0
def draw_kine(stock_data):
    '''
        pyecharts V1 版本开始支持链式调用
       文档地址 https://pyecharts.org/#/zh-cn/
    '''
    stock_data.index = pd.to_datetime(stock_data['TIME'], format="%Y/%m/%d")
    stock_data = stock_data[["TIME", "OPEN", "CLOSE", "LOW", "HIGH", "VOLUME"]]
    # stock_data = stock_data.sort_index(ascending=True)  # 倒序,看时间顺序是否正常
    # k线图
    kline = (
        Kline().add_xaxis(stock_data[["TIME"]].values.tolist()).add_yaxis(
            "K线图",
            stock_data.iloc[:, 1:5].values.tolist(),
            itemstyle_opts=opts.ItemStyleOpts(color="#ec0000",
                                              color0="#00da3c"),
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(is_scale=True, is_show=False),
            # axis_opts=opts.AxisOpts(is_scale=True,min_=0), #y轴起始坐标可以设为0
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),  # y轴起始坐标可自动调整
            title_opts=opts.TitleOpts(title="价格",
                                      subtitle=ts_code,
                                      pos_top="20%"),
            axispointer_opts=opts.AxisPointerOpts(
                is_show=True,
                link=[{
                    "xAxisIndex": "all"
                }],
                label=opts.LabelOpts(background_color="#777"),
            ),
            datazoom_opts=[  # 设置zoom参数后即可缩放
                opts.DataZoomOpts(
                    is_show=True,
                    type_="inside",
                    xaxis_index=[0, 1],  # 设置第0轴和第1轴同时缩放
                    range_start=0,
                    range_end=100,
                ),
                opts.DataZoomOpts(
                    is_show=True,
                    xaxis_index=[0, 1],
                    type_="slider",
                    pos_top="90%",
                    range_start=0,
                    range_end=100,
                ),
            ],
            brush_opts=opts.BrushOpts(
                x_axis_index="all",
                brush_link="all",
                out_of_brush={"colorAlpha": 0.1},
                brush_type="lineX",
            ),
        ))

    # 成交量柱形图
    x = stock_data[["TIME"]].values.tolist()
    y = stock_data[["VOLUME"]].values[:, 0].tolist()

    bar = (Bar().add_xaxis(x).add_yaxis(
        "成交量",
        y,
        xaxis_index=1,
        yaxis_index=1,
        label_opts=opts.LabelOpts(is_show=False),
        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(
        title_opts=opts.TitleOpts(title="成交量", pos_top="70%"),
        legend_opts=opts.LegendOpts(is_show=False),
    ))

    # 使用网格将多张图标组合到一起显示
    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1200px",
        height="600px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))

    # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值
    # demo 中的代码也是用全局变量传的
    grid_chart.add_js_funcs("var barData = {}".format(
        stock_data.iloc[:, 1:5].values.tolist()))
    grid_chart.add(
        kline,
        grid_opts=opts.GridOpts(pos_left="15%", pos_right="15%", height="55%"),
    )

    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(pos_left="15%",
                                pos_right="15%",
                                pos_top="70%",
                                height="20%"),
    )

    grid_chart.render('stock_{}.html'.format(ts_code))  #保存成用股票代码命名的文档
Ejemplo n.º 6
0
def NPS(CenterName):
    Items = CenterName
    SubTitle = "各项目NPS"
    NPS_Scores = [
        25.01, 26.33, 27.21, 22.22, 21.11, 20.03, 23.00, 24.44, 26.36
    ]
    BigTitle = '碧桂园集中式商业消费者满意度研究'
    Color_Com = 'rgba(61,109,207,0.6)'
    Color_Min = 'rgba(55,148,140,1)'
    Color_Max = 'rgba(212,105,105,1)'
    bar = Bar(init_opts=opts.InitOpts(bg_color={
        "type": "pattern",
        "image": JsCode("img"),
        "repeat": "no-repeat"
    }, ))
    bar.add_xaxis(xaxis_data=Items)
    bar.add_yaxis(series_name='NPS',
                  yaxis_data=NPS_Scores,
                  itemstyle_opts=opts.ItemStyleOpts(color=Color_Com),
                  label_opts=opts.LabelOpts(position='inside',
                                            formatter="{c}%"))
    bar.set_global_opts(title_opts=opts.TitleOpts(
        title=BigTitle,
        subtitle=SubTitle,
        pos_right='center',
        title_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)',
                                                font_size=20),
        subtitle_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)',
                                                   font_size=16)),
                        legend_opts=opts.LegendOpts(is_show=False),
                        yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(
                            formatter="{value}%")))
    bar.set_series_opts(
        markline_opts=opts.MarkLineOpts(
            data=[opts.MarkLineItem(name='Average', type_='average')],
            linestyle_opts=opts.LineStyleOpts(color=Color_Max,
                                              width=3,
                                              type_='dashed'),
            label_opts=opts.LabelOpts(formatter="{c}%")),
        markpoint_opts=opts.MarkPointOpts(data=[
            opts.MarkPointItem(
                name='Min_Score',
                type_='min',
                symbol_size=75,
                itemstyle_opts=opts.ItemStyleOpts(color=Color_Min)),
            opts.MarkPointItem(
                name='Max_Score',
                type_='max',
                symbol_size=75,
                itemstyle_opts=opts.ItemStyleOpts(color=Color_Max))
        ],
                                          label_opts=opts.LabelOpts(
                                              formatter="{c}%",
                                              font_size=10,
                                              position='inside')))
    bar.add_js_funcs(
        "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';"
    )
    grid = Grid(init_opts=opts.InitOpts(bg_color={
        "type": "pattern",
        "image": JsCode("img"),
        "repeat": "no-repeat"
    },
                                        width='1200px',
                                        height='650px'))
    grid.add_js_funcs(
        "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';"
    )
    grid.add(bar, grid_opts=opts.GridOpts(width=850, pos_top='90'))
    return grid
Ejemplo n.º 7
0
def Satisfaction(CenterName, TabName, Scores_List):
    Items = CenterName
    SubTitle = TabName + "指标得分"
    Scores = Scores_List
    BigTitle = '碧桂园集中式商业消费者满意度研究'
    Color_Com = 'rgba(61,109,207,0.6)'
    Color_Min = 'rgba(55,148,140,1)'
    Color_Max = 'rgba(212,105,105,1)'
    bar = Bar(init_opts=opts.InitOpts(bg_color={
        "type": "pattern",
        "image": JsCode("img"),
        "repeat": "no-repeat"
    }, ))
    bar.add_xaxis(xaxis_data=Items)
    for i in range(len(Scores)):
        if (i == 0):
            bar.add_yaxis(
                series_name=Scores[i][0],
                yaxis_data=Scores[i][1:],
                itemstyle_opts=opts.ItemStyleOpts(color=Color_Com),
                label_opts=opts.LabelOpts(position='inside'),
            )
        else:
            bar.add_yaxis(is_selected=False,
                          series_name=Scores[i][0],
                          yaxis_data=Scores[i][1:],
                          itemstyle_opts=opts.ItemStyleOpts(color=Color_Com),
                          label_opts=opts.LabelOpts(position='inside'))
    bar.set_global_opts(title_opts=opts.TitleOpts(
        title=BigTitle,
        subtitle=SubTitle,
        pos_right='center',
        title_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)',
                                                font_size=20),
        subtitle_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)',
                                                   font_size=16)),
                        legend_opts=opts.LegendOpts(orient='vertical',
                                                    pos_left='85%',
                                                    pos_top='middle',
                                                    item_width=10,
                                                    item_height=11,
                                                    item_gap=20,
                                                    selected_mode='single'))
    bar.set_series_opts(
        markline_opts=opts.MarkLineOpts(
            data=[opts.MarkLineItem(name='Average', type_='average')],
            linestyle_opts=opts.LineStyleOpts(color=Color_Max,
                                              width=3,
                                              type_='dashed')),
        markpoint_opts=opts.MarkPointOpts(data=[
            opts.MarkPointItem(name='Min_Score',
                               type_='min',
                               symbol_size=75,
                               itemstyle_opts=opts.ItemStyleOpts(
                                   color=Color_Min)),
            opts.MarkPointItem(name='Max_Score',
                               type_='max',
                               symbol_size=75,
                               itemstyle_opts=opts.ItemStyleOpts(
                                   color=Color_Max))
        ]))
    bar.add_js_funcs(
        "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';"
    )
    grid = Grid(init_opts=opts.InitOpts(bg_color={
        "type": "pattern",
        "image": JsCode("img"),
        "repeat": "no-repeat"
    },
                                        width='1200px',
                                        height='650px'))
    grid.add_js_funcs(
        "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';"
    )
    grid.add(bar, grid_opts=opts.GridOpts(width=850, pos_top='90'))
    return grid
Ejemplo n.º 8
0
        data=markareadata,
        itemstyle_opts=opts.ItemStyleOpts(opacity=0.5, )))
    kline.set_global_opts(
        xaxis_opts=opts.AxisOpts(is_scale=True),
        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(type_="inside", range_start=-100),
            opts.DataZoomOpts(pos_bottom="0%"),
        ],
        # title_opts=opts.TitleOpts(title=stock_code),
    )

    grid_chart = Grid(init_opts=opts.InitOpts(
        width="100%",
        height="950px",
        theme=ThemeType.ESSOS,
        page_title=stock_code,
    ))
    grid_chart.add_js_funcs("var areaData={}".format(markareadata))
    grid_chart.add_js_funcs("console.log('hello world')")
    grid_chart.add(
        kline,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="85%"),
    )
    grid_chart.render('pyecharts.html')
Ejemplo n.º 9
0
def draw(df, file_png="test.png"):
    x = df.dt.to_list()
    kline = (
        Kline()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="",
            y_axis=df[['open', 'close', 'low', 'high']].values.tolist(),
            itemstyle_opts=opts.ItemStyleOpts(
                color="#ef232a",
                color0="#14b143",
                border_color="#ef232a",
                border_color0="#14b143",
            ),
        )
            .set_series_opts(
            markarea_opts=opts.MarkAreaOpts(is_silent=True)
        )
            .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),
                axislabel_opts=opts.LabelOpts(is_show=True, position="inside")
            ),
            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=x)
            .add_yaxis(
            series_name="笔",
            y_axis=df.bi.tolist(),
            is_smooth=False,
            is_connect_nones=True,
            symbol='diamond',
            symbol_size=8,
            linestyle_opts=opts.LineStyleOpts(opacity=1, type_='dotted', width=1.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
            .add_yaxis(
            series_name="线段",
            y_axis=df.xd.tolist(),
            is_smooth=False,
            is_connect_nones=True,
            symbol='triangle',
            symbol_size=12,
            linestyle_opts=opts.LineStyleOpts(opacity=1, type_='solid', width=1.5),
            label_opts=opts.LabelOpts(is_show=True, position='right'),
        )
            .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, position="inside"),
            ),
        )
    )
    # Overlap Kline + Line
    overlap_kline_line = kline.overlap(kline_line)

    df1 = df[df['基准价格'] > 0]
    c = (
        Scatter()
            .add_xaxis(df1['出现时间'].to_list())
            .add_yaxis(
            "买卖点",
            df1['基准价格'].to_list(),
            label_opts=opts.LabelOpts(
                is_show=True,
                position="left",
                formatter=JsCode(
                    "function(params){return bsName[params.dataIndex][0];}"
                )
            ),
        ))
    overlap_kline_line = overlap_kline_line.overlap(c)

    # draw volume
    bar_1 = (
        Bar()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="Volumn",
            yaxis_data=df.vol.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 (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),
            ),
            yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(is_show=True, position='inside')
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

    # Bar-2 (Overlap Bar + Line)
    bar_2 = (
        Bar()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="MACD",
            yaxis_data=df.macd.tolist(),
            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, position="inside"),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

    line_2 = (
        Line()
            .add_xaxis(xaxis_data=x)
            .add_yaxis(
            series_name="DIF",
            y_axis=df['diff'].tolist(),
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        )
            .add_yaxis(
            series_name="DEA",
            y_axis=df['dea'].tolist(),
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        )
            .set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
    )

    # draw MACD
    overlap_bar_line = bar_2.overlap(line_2)

    # 最后的 Grid
    grid_chart = Grid(init_opts=opts.InitOpts(width="1400px", height="680px"))
    grid_chart.add_js_funcs("var barData = {}".format(df[['open', 'close', 'low', 'high']].values.tolist()))
    grid_chart.add_js_funcs("var bsName = {}".format(df1[["操作提示", "基准价格"]].values.tolist()))
    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"),
    )
    grid_chart.add(
        bar_1,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"),
    )
    grid_chart.add(
        overlap_bar_line,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"),
    )
    file_html = file_png.replace(".png", '.html')
    make_snapshot(snapshot, grid_chart.render(path=file_html), file_png)
Ejemplo n.º 10
0
def draw_chart(stock_data):
    '''
        pyecharts V1 版本开始支持链式调用
       文档地址 https://pyecharts.org/#/zh-cn/
    '''
    stock_data.index = pd.to_datetime(stock_data['TIME'], format="%Y/%m/%d")
    x = stock_data["TIME"].values.tolist()
    stock_basic_data = stock_data[[
        "TIME", "OPEN", "CLOSE", "LOW", "HIGH", "VOLUME"
    ]]
    # stock_data = stock_data.sort_index(ascending=True)  # 倒序,看时间顺序是否正常决定是不是要用
    # k线图
    kline = (
        Kline().add_xaxis(x).add_yaxis(
            "K线图",
            stock_basic_data.iloc[:, 1:5].values.tolist(),
            itemstyle_opts=opts.ItemStyleOpts(color="#ec0000",
                                              color0="#00da3c"),
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(is_scale=True, is_show=False),
            # axis_opts=opts.AxisOpts(is_scale=True,min_=0), #y轴起始坐标可以设为0
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),  # y轴起始坐标可自动调整
            tooltip_opts=opts.TooltipOpts(trigger="axis",
                                          axis_pointer_type="line"),
            legend_opts=opts.LegendOpts(is_show=True,
                                        orient='vertical',
                                        pos_right="5%",
                                        pos_top='20%'),
            title_opts=opts.TitleOpts(title="股票价格",
                                      subtitle=ts_code,
                                      pos_left='22%',
                                      pos_top="20%"),
            #把所有的x轴连接在一起
            # axispointer_opts=opts.AxisPointerOpts(is_show=True,
            #                                       link=[{"xAxisIndex": "all"}],
            #                                       label=opts.LabelOpts(background_color="#777"),
            #                                       ),
            datazoom_opts=[  # 设置zoom参数后即可缩放
                opts.DataZoomOpts(
                    is_show=True,
                    type_="inside",
                    xaxis_index=[0, 1, 2, 3, 4],  # 设置第0轴和第1轴同时缩放
                    range_start=0,
                    range_end=100,
                ),
            ],
        ))
    # 成交量柱形图
    bar_volumn = (Bar().add_xaxis(x).add_yaxis(
        "成交量",
        stock_basic_data["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 (barData[params.dataIndex][1] > barData[params.dataIndex][0]) {
                                   colorList = '#ef232a';

                               } else {
                                   colorList = '#14b143';
                               }
                               return colorList;
                           }
                           """)),
    ).set_global_opts(
        title_opts=opts.TitleOpts(title="成交量", pos_left='22%', pos_top="48%"),
        legend_opts=opts.LegendOpts(is_show=True,
                                    orient='vertical',
                                    pos_right="5%",
                                    pos_top='48%'),
    ))
    #绘制均线图
    line_ma = (
        Line().add_xaxis(x).add_yaxis(
            series_name="MA5",
            y_axis=stock_data["MA5"].values.tolist(),
            is_hover_animation=False,
            # linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            series_name="MA10",
            y_axis=stock_data["MA10"].values.tolist(),
            is_hover_animation=False,
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            series_name="MA20",
            y_axis=stock_data["MA20"].values.tolist(),
            is_hover_animation=False,
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).set_global_opts(
            title_opts=opts.TitleOpts(title="MA",
                                      pos_left='22%',
                                      pos_top="88%"),
            xaxis_opts=opts.AxisOpts(
                type_="category",
                axislabel_opts=opts.LabelOpts(is_show=False),
                is_scale=True),
            datazoom_opts=[opts.DataZoomOpts(type_="inside")],
            legend_opts=opts.LegendOpts(is_show=True,
                                        orient='vertical',
                                        pos_right="5%",
                                        pos_top='85%'),
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),
        ))
    #绘制jdk线
    line_kdj = (Line().add_xaxis(x).add_yaxis(
        series_name="K",
        y_axis=stock_data["K"].values.tolist(),
        linestyle_opts=opts.LineStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).add_yaxis(
        series_name="D",
        y_axis=stock_data["D"].values.tolist(),
        linestyle_opts=opts.LineStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).add_yaxis(
        series_name="J",
        y_axis=stock_data["J"].values.tolist(),
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).set_global_opts(
        title_opts=opts.TitleOpts(title="KDJ", pos_left='22%', pos_top="62%"),
        datazoom_opts=[opts.DataZoomOpts(type_="inside", )],
        legend_opts=opts.LegendOpts(is_show=True,
                                    orient='vertical',
                                    pos_right="7%",
                                    pos_top='60%'),
        xaxis_opts=opts.AxisOpts(
            is_scale=True,
            axislabel_opts=opts.LabelOpts(is_show=False),
        ),
        yaxis_opts=opts.AxisOpts(
            is_scale=True,
            splitarea_opts=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),
        ),
    ))
    #绘制macd柱状图
    bar_macd = (Bar().add_xaxis(x).add_yaxis(
        series_name='MACD',
        yaxis_data=stock_data['MACD'].values.tolist(),
        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(
        title_opts=opts.TitleOpts(title="MACD", pos_left='22%', pos_top="75%"),
        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=True,
                                    orient='vertical',
                                    pos_right="5%",
                                    pos_top='70%'),
    ))
    #绘制DIF和DEA
    line_macd = (Line().add_xaxis(x).add_yaxis(
        series_name="DIF",
        y_axis=stock_data['DIF'].values.tolist(),
        xaxis_index=2,
        yaxis_index=2,
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).add_yaxis(
        series_name="DEA",
        y_axis=stock_data['DEA'].values.tolist(),
        xaxis_index=2,
        yaxis_index=2,
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False)))
    #绘制布林线
    line_boll = (Line().add_xaxis(x).add_yaxis(
        series_name="MID",
        y_axis=stock_data["MID"].values.tolist(),
        linestyle_opts=opts.LineStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).add_yaxis(
        series_name="UPPER",
        y_axis=stock_data["UPPER"].values.tolist(),
        linestyle_opts=opts.LineStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).add_yaxis(
        series_name="LOWER",
        y_axis=stock_data["LOWER"].values.tolist(),
        linestyle_opts=opts.LineStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        is_symbol_show=False,
    ).set_global_opts(
        datazoom_opts=[opts.DataZoomOpts(type_="inside", )],
        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)),
        ),
    ))

    overlap_kline_linema = kline.overlap(line_boll)
    overlap_macd = bar_macd.overlap(line_macd)
    # 使用网格将多张图标组合到一起显示
    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1400px",
        height="700px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))

    # 为了把 data.datas 的数据写入到html中作为全局变量,目前无法跨 series 传值
    # demo 中的代码也是用全局变量传的
    grid_chart.add_js_funcs("var barData = {}".format(
        stock_basic_data.iloc[:, 1:5].values.tolist()))
    grid_chart.add(
        overlap_kline_linema,
        grid_opts=opts.GridOpts(pos_left="35%",
                                pos_right="15%",
                                pos_top="3%",
                                height="40%"),
    )

    grid_chart.add(
        bar_volumn,
        grid_opts=opts.GridOpts(pos_left="35%",
                                pos_right="15%",
                                pos_top="45%",
                                height="10%"),
    )

    grid_chart.add(line_kdj,
                   grid_opts=opts.GridOpts(pos_left="35%",
                                           pos_right="15%",
                                           pos_top="60%",
                                           height="10%"))
    grid_chart.add(overlap_macd,
                   grid_opts=opts.GridOpts(pos_left="35%",
                                           pos_right="15%",
                                           pos_top="72%",
                                           height="10%"))

    grid_chart.add(line_ma,
                   grid_opts=opts.GridOpts(pos_left="35%",
                                           pos_right="15%",
                                           pos_top="85%",
                                           height="10%"))

    grid_chart.render('stock_{}/stock_{}.html'.format(
        ts_code, ts_code))  # 保存成用股票代码命名的文档
    return 0
Ejemplo n.º 11
0
def draw_charts(echarts_data):
    kline_data = echarts_data["data"]
    date = echarts_data["date"]
    kline = (
        Kline().add_xaxis(xaxis_data=date).add_yaxis(
            series_name="Dow-Jones index",
            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"),

            # 其中inside是支持鼠标缩放
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=True,
                    type_="inside",
                    xaxis_index=[0, 1, 2, 3, 4],
                    range_start=50,
                    range_end=100,
                ),
                opts.DataZoomOpts(
                    is_show=True,
                    xaxis_index=[0, 1, 2, 3, 4],
                    type_="slider",
                    range_start=50,
                    range_end=100,
                ),
            ],
            # # 不知道为什么要分开三个写,可能是想通过xaxis_index分别配置
            # 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),
            # ],
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),
            title_opts=opts.TitleOpts(title="my_echart"),
            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"
                    },
                ],
            ),
            # 所有图的axis 连在一块
            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=date).add_yaxis(
            series_name="MA5",
            y_axis=echarts_data['ma5'],
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,  # 去掉折线上的小圆点
        ).add_yaxis(
            series_name="MA20",
            y_axis=echarts_data['ma20'],
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,  # 去掉折线上的小圆点
        ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")))

    # Kline And Line
    overlap_kline_line = kline.overlap(line)

    bar = (
        Bar().add_xaxis(xaxis_data=date).add_yaxis(
            series_name="Volume",
            y_axis=echarts_data['volume'],
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
            #
            # # 变色
            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",
                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),
        ))

    # Bar-2 (Overlap Bar + Line)
    bar_2 = (
        Bar().add_xaxis(xaxis_data=date).add_yaxis(
            series_name="MACD",
            y_axis=echarts_data['macd'],
            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),

                # 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,
            ),
            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),
        ))

    macd_line = (
        Line().add_xaxis(xaxis_data=date).add_yaxis(
            series_name="DIFF",
            y_axis=echarts_data['macd_diff'],
            # xaxis_index=2,
            # yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="DEA",
            y_axis=echarts_data["macd_dea"],
            # xaxis_index=2,
            # yaxis_index=2,
            is_symbol_show=False,  # 去掉折线上的小圆点
            label_opts=opts.LabelOpts(is_show=False),
        )
        # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
        # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))
    )
    # MACD BAR And MACD Line
    bar_macd_line = bar_2.overlap(macd_line)

    # KDJ
    kdj_line = (
        Line().add_xaxis(xaxis_data=date).add_yaxis(
            series_name="K",
            y_axis=echarts_data['kdj_k'],
            is_symbol_show=False,  # 去掉折线上的小圆点
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="D",
            y_axis=echarts_data["kdj_d"],
            is_symbol_show=False,  # 去掉折线上的小圆点
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="J",
            y_axis=echarts_data["kdj_j"],
            is_symbol_show=False,  # 去掉折线上的小圆点
            label_opts=opts.LabelOpts(is_show=False),
            # markline_opts=opts.MarkLineOpts(
            #     data=[100]
            # ),
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                grid_index=2,
                axislabel_opts=opts.LabelOpts(is_show=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,
            ), ))

    ######################
    ## kdj的macd

    # Bar-2 (Overlap Bar + Line)
    macd_kdj_bar = (
        Bar().add_xaxis(xaxis_data=date).add_yaxis(
            series_name="MACD_KDJ",
            y_axis=echarts_data['kdj_macd'],
            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),

                # 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,
            ),
            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),
        ))

    macd_kdj_line = (
        Line().add_xaxis(xaxis_data=date).add_yaxis(
            series_name="KDJ_DIFF",
            y_axis=echarts_data['kdj_macd_diff'],
            # xaxis_index=2,
            # yaxis_index=2,
            is_symbol_show=False,  # 去掉折线上的小圆点
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="KDJ_DEA",
            y_axis=echarts_data["kdj_macd_dea"],
            # xaxis_index=2,
            # yaxis_index=2,
            is_symbol_show=False,  # 去掉折线上的小圆点
            label_opts=opts.LabelOpts(is_show=False),
        )
        # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
        # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))
    )
    # MACD BAR And MACD Line
    bar_macd_kdj_line = macd_kdj_bar.overlap(macd_kdj_line)

    ######################

    # Grid Overlap + Bar
    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1000px",
        height="800px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))

    # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值
    # demo 中的代码也是用全局变量传的
    grid_chart.add_js_funcs("var barData = {}".format(kline_data))

    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="30%"),
    )
    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(pos_left="10%",
                                pos_right="8%",
                                pos_top="35%",
                                height="10%"),
    )

    # 加上MACD
    grid_chart.add(
        bar_macd_line,
        grid_opts=opts.GridOpts(
            pos_left="10%",
            pos_right="8%",
            pos_top="45%",
            height="10%",
        ),
    )

    # 加上KDJ
    grid_chart.add(
        kdj_line,
        grid_opts=opts.GridOpts(
            pos_left="10%",
            pos_right="8%",
            pos_top="55%",
            height="10%",
        ),
    )

    # 加上KDJ的MACD
    grid_chart.add(
        bar_macd_kdj_line,
        grid_opts=opts.GridOpts(
            pos_left="10%",
            pos_right="8%",
            pos_top="65%",
            height="10%",
        ),
    )

    grid_chart.render("300368.html")
Ejemplo n.º 12
0
    def kline(self):
        data = self.calculate().to_dict('list')
        kline = (
            Kline().add_xaxis(xaxis_data=data["date"]).add_yaxis(
                series_name="portfolio index",
                y_axis=data["datas"],
                itemstyle_opts=opts.ItemStyleOpts(
                    color="#ef232a",
                    color0="#14b143",
                    border_color="#ef232a",
                    border_color0="#14b143",
                ),
            ).set_global_opts(
                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)),
                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),
                ],
                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"),
                ),
                brush_opts=opts.BrushOpts(
                    x_axis_index="all",
                    brush_link="all",
                    out_of_brush={"colorAlpha": 0.1},
                    brush_type="lineX",
                ),
                # 三个图的 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["date"]).add_yaxis(
            series_name="MA5",
            y_axis=self.calculate_ma(day_count=5, data=data),
            is_smooth=True,
            linestyle_opts=opts.LineStyleOpts(opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA10",
            y_axis=self.calculate_ma(day_count=10, data=data),
            is_smooth=True,
            linestyle_opts=opts.LineStyleOpts(opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA20",
            y_axis=self.calculate_ma(day_count=20, data=data),
            is_smooth=True,
            linestyle_opts=opts.LineStyleOpts(opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA30",
            y_axis=self.calculate_ma(day_count=30, data=data),
            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 + Line
        overlap_kline_line = kline.overlap(kline_line)

        # Bar-1
        bar_1 = (Bar().add_xaxis(xaxis_data=data["date"]).add_yaxis(
            series_name="Volumn",
            y_axis=data["volume"],
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
            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["date"]).add_yaxis(
            series_name="MACD",
            y_axis=data["MACD"],
            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["date"]).add_yaxis(
            series_name="DIFF",
            y_axis=data["DIFF"],
            xaxis_index=2,
            yaxis_index=2,
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="DEA",
            y_axis=data["DEA"],
            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)

        # 最后的 Grid
        grid_chart = Grid(
            init_opts=opts.InitOpts(width="1500px", height="750px"))

        # 这个是为了把 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 DEAS
        grid_chart.add(
            overlap_bar_line,
            grid_opts=opts.GridOpts(pos_left="3%",
                                    pos_right="1%",
                                    pos_top="82%",
                                    height="14%"),
        )
        makedir(self.path, 'kline')
        grid_chart.render(
            f"{self.path}\\kline\\{str(self.names)}_{time.strftime('%Y-%m-%d', time.localtime())}.html"
        )
Ejemplo n.º 13
0
class MyPyecharts():

    kline_chart = None
    grid_chart = None

    def __init__(self, bar_data):
        self.bar_data = bar_data
        self.bar_data_datetime = list(
            self.bar_data.index.strftime("%Y-%m-%d %H:%M"))

    def kline(self):
        """"""
        if "_" in self.bar_data.symbol[0]:
            symbol_split = self.bar_data.symbol[0].split("_")
            series_name = "_".join(
                [symbol_split[0], symbol_split[1][-2:], symbol_split[2][-2:]])
        else:
            series_name = self.bar_data.symbol[0]

        kline = Kline(init_opts=opts.InitOpts(width="1400px", height="800px"))
        kline.add_xaxis(xaxis_data=self.bar_data_datetime)
        kline.add_yaxis(
            series_name=series_name,
            yaxis_index=0,
            y_axis=self.bar_data[[
                "open_price", "close_price", "low_price", "high_price"
            ]].values.tolist(),
            itemstyle_opts=opts.ItemStyleOpts(color="#ef232a",
                                              color0="#14b143",
                                              border_color="#8A0000",
                                              border_color0="#008F28",
                                              opacity=0.8),
        )

        kline.set_global_opts(
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    xaxis_index=[0, 0],
                    range_start=0,
                    range_end=100,
                ),
                opts.DataZoomOpts(
                    is_show=True,
                    type_="slider",
                    xaxis_index=[0, 1],
                    pos_top="95%",
                    range_start=0,
                    range_end=100,
                ),
            ],
            xaxis_opts=opts.AxisOpts(
                is_scale=True,
                type_="category",
                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,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=0.8)),
            ),
            brush_opts=opts.BrushOpts(
                tool_box=[
                    "rect", "polygon", "keep", "lineX", "lineY", "clear"
                ],
                x_axis_index="all",
                brush_link="all",
                out_of_brush={"colorAlpha": 0.1},
                brush_type="lineX",
            ),
            tooltip_opts=opts.TooltipOpts(
                is_show=True,
                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",
                    font_size=12,
                    font_family="Arial",
                    font_weight="lighter",
                ),
            ),
            toolbox_opts=opts.ToolboxOpts(orient="horizontal",
                                          pos_left="right",
                                          pos_top="0%"),
            legend_opts=opts.LegendOpts(
                is_show=True,
                type_="scroll",
                selected_mode="multiple",
                pos_left="left",
                pos_top="0%",
                legend_icon="roundRect",
            ),

            # 多图的 axis 连在一块
            axispointer_opts=opts.AxisPointerOpts(
                is_show=True,
                link=[{
                    "xAxisIndex": "all"
                }],
                label=opts.LabelOpts(background_color="#777"),
            ),
        )

        self.kline_chart = kline

    def overlap_sma(self, sma_series: list = [5, 10, 20, 60]):
        # 在K线图上绘制 SMA 均线
        SMA_series = sma_series

        SMA_line = (Line().add_xaxis(
            xaxis_data=self.bar_data_datetime).set_global_opts(
                xaxis_opts=opts.AxisOpts(type_="category")))

        for i in SMA_series:
            sma_value = ta.SMA(np.array(self.bar_data["close_price"]), i)
            SMA_line.add_yaxis(
                series_name=f"SMA_{i}",
                y_axis=sma_value.tolist(),
                is_symbol_show=False,
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8),
                label_opts=opts.LabelOpts(is_show=False),
                tooltip_opts=opts.TooltipOpts(is_show=False),
            )

        self.kline_chart.overlap(SMA_line)

    def overlap_boll(self, timeperiod=14, nbdevup=2, nbdevdn=2, matype=0):
        # 在K线图上绘制 布林带

        boll_up, boll_mid, boll_low = ta.BBANDS(np.array(self.bar_data["close_price"]),\
                                                timeperiod=timeperiod, nbdevup=nbdevup, nbdevdn=nbdevdn, matype=matype)

        BOLL_line = (Line().add_xaxis(
            xaxis_data=self.bar_data_datetime).add_yaxis(
                series_name="布林上轨",
                y_axis=boll_up.tolist(),
                is_symbol_show=False,
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8),
                label_opts=opts.LabelOpts(is_show=False),
                tooltip_opts=opts.TooltipOpts(is_show=False),
            ).add_yaxis(
                series_name="布林中轨",
                y_axis=boll_mid.tolist(),
                is_symbol_show=False,
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8),
                label_opts=opts.LabelOpts(is_show=False),
                tooltip_opts=opts.TooltipOpts(is_show=False),
            ).add_yaxis(
                series_name="布林下轨",
                y_axis=boll_low.tolist(),
                is_symbol_show=False,
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8),
                label_opts=opts.LabelOpts(is_show=False),
                tooltip_opts=opts.TooltipOpts(is_show=False),
            ))

        self.kline_chart.overlap(BOLL_line)

    def grid_volume(self, grid_index=1):
        """"""
        vol_bar = (Bar().add_xaxis(
            xaxis_data=self.bar_data_datetime).add_yaxis(
                series_name="成交量",
                y_axis=self.bar_data["volume"].tolist(),
                xaxis_index=grid_index,
                yaxis_index=grid_index,
                label_opts=opts.LabelOpts(is_show=False),
                itemstyle_opts=opts.ItemStyleOpts(opacity=0.8,
                                                  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=grid_index,
                ),
                legend_opts=opts.LegendOpts(is_show=False),
            ))

        return vol_bar

    def grid_graph(self, grid_graph=None):
        # 创建组合图表画布对象
        self.grid_chart = Grid(
            init_opts=opts.InitOpts(width="1900px", height="900px"))

        bar_data = [[
            row["open_price"], row["close_price"], row["low_price"],
            row["high_price"]
        ] for ix, row in self.bar_data.iterrows()]
        self.grid_chart.add_js_funcs("var barData = {}".format(bar_data))

        self.grid_chart.add(
            chart=self.kline_chart,
            grid_index=0,
            grid_opts=opts.GridOpts(pos_left="5%",
                                    pos_right="5%",
                                    pos_top="10%",
                                    height="60%"),
        )
        self.grid_chart.add(
            chart=grid_graph,
            grid_index=1,
            grid_opts=opts.GridOpts(pos_left="5%",
                                    pos_right="5%",
                                    pos_top="75%",
                                    height="20%"),
        )

        return self.grid_chart

    def render(self, html_name="render.html"):
        return self.grid_chart.render(html_name)
Ejemplo n.º 14
0
def plot_kline(
    df,
    rendered=True,
    ucolor="#ef232a",
    dcolor="#14b143",
    ucolorborder=None,
    dcolorborder=None,
    ucolorvolume=None,
    dcolorvolume=None,
    col="",
):
    """
    针对 dataframe 直接画出标准看盘软件的上k线图下成交量图的形式

    :param df:
    :param rendered:
    :param ucolor: str for color when going up, default red in A stock as "#ef232a"
    :param dcolor: str for color when going down, default green in A stock as "#14b143"
    :param col:
    :return:
    """
    # TODO: color changing seems to make no effect, possible issue with pyecharts
    if ucolorborder is None:
        ucolorborder = ucolor
    if dcolorborder is None:
        dcolorborder = dcolor
    if ucolorvolume is None:
        if ucolor != "#ffffff":
            ucolorvolume = ucolor
        else:
            ucolorvolume = ucolorborder
    if dcolorvolume is None:
        if dcolor != "#ffffff":
            dcolorvolume = dcolor
        else:
            dcolorvolume = dcolorborder

    kline = (
        Kline().add_xaxis(xaxis_data=list(df["date"])).add_yaxis(
            series_name="",
            itemstyle_opts=opts.ItemStyleOpts(
                color=ucolor,
                color0=dcolor,
                border_color=ucolorborder,  # ucolor,
                border_color0=dcolorborder,  # dcolor,
            ),
            y_axis=list(zip(df["open"], df["close"], df["low"], df["high"])),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name="最大值"),
                    opts.MarkPointItem(type_="min", name="最小值"),
                ],
                symbol="pin",
                symbol_size=[56, 40],
                # label_opts=opts.LabelOpts(color="#CCFFFF",position=["top", "bottom"])
            ),
        ).set_global_opts(
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=True,
                    type_="slider",
                    range_start=50,
                    range_end=100,
                    xaxis_index=[0, 1],
                ),
                opts.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    range_start=50,
                    range_end=100,
                    xaxis_index=1,
                ),
            ],
            tooltip_opts=opts.TooltipOpts(
                is_show=True,
                trigger="axis",
                trigger_on="mousemove",
                axis_pointer_type="cross",
            ),
        ))
    if col is not None:
        for c in col:
            line = (Line().add_xaxis(xaxis_data=list(df["date"])).add_yaxis(
                series_name=c,
                y_axis=list(df[c]),
                is_smooth=True,
                linestyle_opts=opts.LineStyleOpts(opacity=0.5),
                label_opts=opts.LabelOpts(is_show=False),
            ))
            kline = kline.overlap(line)

    if "volume" in df.columns:
        vl = list(df["volume"])
    elif "amount" in df.columns:
        vl = list(df["amount"])
    else:
        vl = [0 for _ in range(len(df))]
    bar = (
        Bar().add_js_funcs("var barData = {}".format(
            list(df["close"] - df["open"]))).add_xaxis(
                xaxis_data=list(df["date"])).add_yaxis(
                    series_name="",
                    yaxis_data=vl,
                    label_opts=opts.LabelOpts(is_show=False),
                    itemstyle_opts=opts.ItemStyleOpts(
                        color=JsCode("""
                function(params) {{
                    var colorList;
                    if (barData[params.dataIndex]>0) {{
                        colorList = '{ucolor}';
                    }} else {{
                        colorList = '{dcolor}';
                    }}
                    return colorList;
                }}
                """.format(ucolor=ucolorvolume,
                           dcolor=dcolorvolume))  # escape {} when using format
                    ),
                ).set_global_opts(tooltip_opts=opts.TooltipOpts(
                    is_show=True,
                    trigger="axis",
                    trigger_on="mousemove",
                    axis_pointer_type="cross",
                ), ))
    grid_chart = Grid()
    grid_chart.add_js_funcs("var barData = {}".format(
        list(df["close"] - df["open"])))
    grid_chart.add(
        kline,
        grid_opts=opts.GridOpts(pos_left="10%",
                                pos_right="1%",
                                pos_top="2%",
                                height="65%"),
    )

    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(pos_left="10%",
                                pos_right="1%",
                                pos_top="71%",
                                height="22%"),
    )
    if rendered:
        return grid_chart.render_notebook()
    else:
        return grid_chart