Ejemplo n.º 1
0
def KlinePlotting(target_file):
    global trend_punishment
    res = pickle.load(open(target_file, 'rb'))
    c = (Line().add_xaxis([item[0] for item in res]).add_yaxis(
        "打分",
        [item[1] for item in res],
        linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
    ).set_global_opts(
        title_opts=opts.TitleOpts(title="打分"),
        xaxis_opts=opts.AxisOpts(type_="category"),
        datazoom_opts=[
            opts.DataZoomOpts(
                type_="slider",
                xaxis_index=[0],
                range_start=80,
                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"),
        ),
    ))

    gridChart = Grid(init_opts=opts.InitOpts(width="1000px",
                                             height="500px",
                                             animation_opts=opts.AnimationOpts(
                                                 animation=False)))
    gridChart.add(c, grid_opts=opts.GridOpts(pos_left="10%", pos_right="10%"))
    gridChart.render("score_modified_plot_new_0.002.html")
Ejemplo n.º 2
0
def test_liquid_grid(fake_writer):
    l1 = (
        Liquid()
        .add("lq", [0.6, 0.7], center=["60%", "50%"])
        .set_global_opts(title_opts=opts.TitleOpts(title="多个 Liquid 显示"))
    )

    l2 = Liquid().add(
        "lq",
        [0.3254],
        center=["25%", "50%"],
        label_opts=opts.LabelOpts(
            font_size=50,
            formatter=JsCode(
                """function (param) {
                        return (Math.floor(param.value * 10000) / 100) + '%';
                    }"""
            ),
            position="inside",
        ),
    )

    c = Grid().add(l1, grid_opts=opts.GridOpts()).add(l2, grid_opts=opts.GridOpts())
    c.render()
    _, content = fake_writer.call_args[0]
    assert_in("center", content)
Ejemplo n.º 3
0
def draw_charts(fn1, fn2):
    df1 = pd.read_csv(fn1)
    df1['datetime'] = df1['date'] + ' ' + df1['time']
    #print(df1.head())
    kline1 = gen_kline_one(df1)

    df2 = pd.read_csv(fn2)
    df2['datetime'] = df2['date'] + ' ' + df2['time']
    #print(df1.head())
    kline2 = gen_kline_two(df2)

    grid_chart = Grid(
        init_opts=opts.InitOpts(
            width="1300px",
            height="700px",
            #animation_opts=opts.AnimationOpts(animation=False),
        )
    )
    grid_chart.add(
        kline1,
        grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"),
    )
    grid_chart.add(
        kline2,
        grid_opts=opts.GridOpts(
            pos_left="3%", pos_right="5%", pos_top="53%", height="39%" ),
    )

    fn = get_dss( ) + 'backtest/render/bar2.html'
    grid_chart.render(fn)
Ejemplo n.º 4
0
    def html_output(self, order, view, mode):
        """
        output function of html

        Args:
            order(int): diversified_ranking use different order
            view(View): view object
            mode(str): single or multiple
            
        Returns:
            None
            
        """
        instance = self.instance
        data = {}
        data['order'] = order
        data['chartname'] = instance.table_name
        data['describe'] = view.table.describe
        data['x_name'] = view.fx.name
        data['y_name'] = view.fy.name
        data['chart'] = Chart.chart[view.chart]
        data['classify'] = [v[0] for v in view.table.classes]
        data['x_data'] = view.X
        data['y_data'] = view.Y
        data['title_top'] = 5

        [chart, filename] = self.html_handle(data)
        grid = Grid()
        grid.add(chart,
                 grid_opts=opts.GridOpts(pos_bottom='20%', pos_top='20%'))
        if mode == 'single':
            self.page.add(grid)  #the grid is added in the same page
        elif mode == 'multiple':
            grid.render('./html/' + self.table_name + '/' +
                        filename)  #the grid is added in a new file
Ejemplo n.º 5
0
    def draw(self, symbol, fn_render):
        fn = get_dss() + 'fut/bar/day_' + symbol + '.csv'
        df1 = pd.read_csv(fn)
        # print(df1.head())
        price_min = int(df1.close.min() * 0.99)
        price_max = df1.close.max()

        kline = self.gen_kline(df1, symbol)
        line_cci = self.gen_cci(df1, 100)

        grid_chart = Grid(init_opts=opts.InitOpts(
            width="1390px",
            height="700px",
            animation_opts=opts.AnimationOpts(animation=False),
        ))
        grid_chart.add(
            kline,
            grid_opts=opts.GridOpts(pos_left="10%",
                                    pos_right="8%",
                                    height="60%"),
        )
        grid_chart.add(
            line_cci,
            grid_opts=opts.GridOpts(pos_left="10%",
                                    pos_right="8%",
                                    pos_top="75%",
                                    height="17%"),
        )

        grid_chart.render(fn_render)
Ejemplo n.º 6
0
    def draw(self, symbol, fn_render):

        fn = get_dss() +'fut/bar/day_' + symbol + '.csv'
        df = pd.read_csv(fn)
        df1 = df.loc[:,['date','time','close']]

        n = 30
        close_list = df.apply(lambda record: float(record['close']), axis=1).tolist()
        close_list = np.array(close_list)
        ma_arr = talib.SMA(close_list, n)
        df['ma'] = ma_arr
        df['close'] = df['close'] - df['ma']
        df2 = df.loc[:,['date','time','close']]

        line1 = self.gen_line_one(df1, symbol)
        line2 = self.gen_line_two(df2)

        grid_chart = Grid(
            init_opts=opts.InitOpts(
                width="1300px",
                height="700px",
                #animation_opts=opts.AnimationOpts(animation=False),
            )
        )
        grid_chart.add(
            line1,
            grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"),
        )
        grid_chart.add(
            line2,
            grid_opts=opts.GridOpts(
                pos_left="5%", pos_right="3%", pos_top="53%", height="39%" ),
        )

        grid_chart.render(fn_render)
Ejemplo n.º 7
0
def test_grid_options(fake_writer):
    bar = _chart_for_grid()
    gc = Grid().add(
        bar,
        opts.GridOpts(pos_left="5%", pos_right="20%", is_contain_label=True))
    gc.render()
    _, content = fake_writer.call_args[0]
    assert_in("containLabel", content)
Ejemplo n.º 8
0
def draw_charts():

    pz = 'CF'
    vtSymbol = 'CF'

    fn = get_dss() + 'backtest/fut/' + pz + '/day_' + vtSymbol + '.csv'
    df1 = pd.read_csv(fn)
    # df1 = df1[df1.date >= '2019-01-20']
    #df1['datetime'] = df1['date'] + ' ' + df1['time']
    df1['datetime'] = df1['date']
    price_min = int(df1.close.min() * 0.99)
    price_max = df1.close.max()

    #fn  = get_dss( )+ 'fut/engine/aberration_raw/signal_aberration_raw_duo_deal_CF.csv'
    #fn  = get_dss( )+ 'fut/engine/aberration_raw/signal_aberration_raw_kong_deal_CF.csv'

    fn = get_dss(
    ) + 'fut/engine/aberration_enhance/signal_aberration_enhance_duo_deal_CF.csv'
    #fn  = get_dss( )+ 'fut/engine/aberration_enhance/signal_aberration_enhance_kong_deal_CF.csv'

    df2 = pd.read_csv(fn)
    dt_list = df2['datetime'].tolist()
    dt_list = [dt[:10] for dt in dt_list]
    # print(dt_list)
    df2['datetime'] = dt_list

    line = gen_line(df1, vtSymbol, price_min, price_max)
    line_atr = gen_atr(df1, 10)
    line_boll = gen_boll(df1, 10, 2)
    line = line.overlap(line_boll)

    scatter_open = gen_poit_open(df2)
    scatter_close = gen_poit_close(df2)
    line = line.overlap(scatter_open)
    line = line.overlap(scatter_close)

    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1300px",
        height="700px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))
    grid_chart.add(
        line,
        grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="60%"),
    )
    grid_chart.add(
        line_atr,
        grid_opts=opts.GridOpts(pos_left="10%",
                                pos_right="8%",
                                pos_top="76%",
                                height="17%"),
    )

    fn = get_dss() + 'backtest/render/k_deal_aberration_' + vtSymbol + '.html'
    grid_chart.render(fn)
Ejemplo n.º 9
0
def draw_charts():

    # #fn = get_dss() +'backtest/fut/m/' + 'm_01_05.csv'
    # fn = get_dss() +'backtest/fut/m/' + 'day_m.csv'
    # df1 = pd.read_csv(fn)
    # df1['datetime'] = df1['date'] + ' ' + df1['time']
    # #print(df1.head())
    # kline1 = gen_kline_one(df1)
    #
    # fn = get_dss() +'backtest/fut/y/' + 'day_y.csv'
    # df2 = pd.read_csv(fn)
    # df2['datetime'] = df2['date'] + ' ' + df2['time']
    # #print(df1.head())
    # kline2 = gen_kline_two(df2)

#--------------------------------------------------------------------------

    fn = 'bar_kamaresid_raw_duo_CF.csv'
    fn = 'bar_kamaresid_raw_duo_m.csv'

    df = pd.read_csv(fn)
    df.columns = ['date','time','close','q1','q2','resid']
    df1 = df.loc[:,['date','time','close']]
    df2 = df.loc[:,['date','time','resid']]
    df2['close'] = df2['resid']
    print(df1.head(3))
    print(df2.head(3))
    s1 = 'close'
    s2 = 'resid'

    line1 = gen_line_one(df1)
    line2 = gen_line_two(df2)


    grid_chart = Grid(
        init_opts=opts.InitOpts(
            width="1300px",
            height="700px",
            #animation_opts=opts.AnimationOpts(animation=False),
        )
    )
    grid_chart.add(
        line1,
        grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"),
    )
    grid_chart.add(
        line2,
        grid_opts=opts.GridOpts(
            pos_left="5%", pos_right="3%", pos_top="53%", height="39%" ),
    )

    fn = get_dss( )+ 'backtest/render/k_k_' + s1 + '_' + s2 + '.html'
    grid_chart.render(fn)
Ejemplo n.º 10
0
def draw_charts():

    vtSymbol = 'CF005'

    fn = get_dss() + 'fut/bar/min5_' + vtSymbol + '.csv'
    df1 = pd.read_csv(fn)
    df1 = df1[df1.date >= '2019-11-20']
    df1['datetime'] = df1['date'] + ' ' + df1['time']
    # print(df1.head())

    fn = get_dss() + 'fut/engine/rsiboll/signal_rsiboll_duo_deal_CF.csv'
    df2 = pd.read_csv(fn)

    kline = gen_kline(df1)
    line_rsi = gen_rsi(df1)
    line_atr = gen_atr(df1)
    scatter_deal_one = gen_poit_one(df2)
    scatter_deal_two = gen_poit_two(df2)
    scatter_deal_three = gen_poit_three(df2)

    kline_scatter = kline.overlap(scatter_deal_one)
    kline_scatter = kline_scatter.overlap(scatter_deal_two)
    kline_scatter = kline_scatter.overlap(scatter_deal_three)

    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1000px",
        height="700px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))
    grid_chart.add(
        kline_scatter,
        grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="45%"),
    )
    grid_chart.add(
        line_rsi,
        grid_opts=opts.GridOpts(pos_left="10%",
                                pos_right="8%",
                                pos_top="57%",
                                height="17%"),
    )

    grid_chart.add(
        line_atr,
        grid_opts=opts.GridOpts(pos_left="10%",
                                pos_right="8%",
                                pos_top="76%",
                                height="17%"),
    )

    grid_chart.render("k_deal_rsi_atr.html")
Ejemplo n.º 11
0
def draw_charts():
    vtSymbol = 'm'

    fn = get_dss() + 'backtest/fut/m/day_' + vtSymbol + '.csv'
    df1 = pd.read_csv(fn)
    #df1 = df1[df1.date >= '2019-10-12']
    df1['datetime'] = df1['date'] + ' ' + df1['time']
    # print(df1.head())

    kline = gen_kline(df1)
    line_rsi = gen_rsi(df1)
    line_atr = gen_atr(df1)

    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1500px",
        height="700px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))
    grid_chart.add(
        kline,
        grid_opts=opts.GridOpts(pos_left="3%", pos_right="8%", height="45%"),
    )
    grid_chart.add(
        line_rsi,
        grid_opts=opts.GridOpts(pos_left="3%",
                                pos_right="8%",
                                pos_top="57%",
                                height="17%"),
    )

    grid_chart.add(
        line_atr,
        grid_opts=opts.GridOpts(pos_left="3%",
                                pos_right="8%",
                                pos_top="76%",
                                height="17%"),
    )

    fn = get_dss() + 'backtest/render/bar_ti_ti.html'
    grid_chart.render(fn)
Ejemplo n.º 12
0
def gen_grid_chart(
    overlap_kline_line: Kline,
    width: str,
    height: str,
    bar_plot_list: typing.List[Bar],
    filename: str,
) -> Grid:
    index = 0
    grid_chart = Grid(init_opts=opts.InitOpts(
        width=width,
        height=height,
        animation_opts=opts.AnimationOpts(animation=False),
    ))
    pos_top_list, height_list = gen_pos_top_height(plot_list=bar_plot_list)
    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(
            pos_left="10%",
            pos_right="8%",
            pos_top=f"{pos_top_list[index]}%",
            height=f"{height_list[index]}%",
        ),
    )
    index += 1
    bar_plot_list = filter_bar_plot(bar_plot_list)
    for bar_plot in bar_plot_list:
        grid_chart.add(
            bar_plot,
            grid_opts=opts.GridOpts(
                pos_left="10%",
                pos_right="8%",
                pos_top=f"{pos_top_list[index]}%",
                height=f"{height_list[index]}%",
            ),
        )
        index += 1
    grid_chart.render(filename)
    return grid_chart
Ejemplo n.º 13
0
    def generate_kchart(self,MA=[5,10,21],renderfile=False) -> Grid:        
        if self.exists == False:
            return None
        # reassign cursor tick to trigger populate attributes like self.histBar and etc.
        self.cursorTick = self._cursorTick
        df_toPlot = self.allBars.loc[self.allBars['unit_intdate'] <= self.cursorTick['unit_intdate']]
        
        # 输入时间序列中带有未来日期,则取当下能取到的最新online数据模拟
        # if len(self.allBars.loc[self.allBars['unit_intdate'] == self.cursorTick['unit_intdate']]) == 0:        
        #     df_liveQuote = self.get_livebar(assign_timestamp=self.cursorTick['timeAxis'])
        #     if len(df_liveQuote) > 0:
        #         df_toPlot = df_toPlot.append(df_liveQuote, ignore_index = True, sort=False)    
        
        str_secname = self.sec_name
        str_plotname = '{} - {}'.format(self.ts_code,str_secname)

        '''-----------------画图部分---------------------'''
        lst_ohlcv=df_toPlot.loc[:,['open','close','low','high']].values.tolist()
        lst_vol=list(df_toPlot['vol'].values)
        lst_amount=list(df_toPlot['amount'].values)

        # 需从处理过的histbar中获得,由于长度比allbar短1,需将值list添加一个空值补齐
        lst_peaks=list(abs(self.histBars['peaks'].values))
        # lst_pivotdown=[*(float('nan') if i<0 else i for i in list(self.histBars['pivots'].values)),float('nan')]
        lst_pivotdown=[*(float('nan') if i<0 else i for i in list(self.histBars['valid_pivots'].values)),float('nan')]
        # lst_pivotup=[*(float('nan') if i>0 else abs(i) for i in list(self.histBars['pivots'].values)),float('nan')]
        lst_pivotup=[*(float('nan') if i>0 else abs(i) for i in list(self.histBars['valid_pivots'].values)),float('nan')]

        lst_xaxis=list(df_toPlot['unit_intdate'].astype(str)) # xaxis values has to be STRING type, int will not work

        def calculate_ma(day_count: int, d):
            result: List[Union[float, str]] = []
            for i in range(len(d)):
                if i < day_count:
                    result.append("-")
                    continue
                sum_total = 0.0
                for j in range(day_count):
                    sum_total += float(d[i - j][1])
                result.append(abs(float("%.3f" % (sum_total / day_count))))
            return result

        kline = (Kline()
            .add_xaxis(lst_xaxis)
            .add_yaxis(series_name=str_secname, y_axis=lst_ohlcv,
                        markpoint_opts=opts.MarkPointOpts(
                            data=[opts.MarkPointItem(type_="min",value_dim="close"),
                                opts.MarkPointItem(type_="max",value_dim="close")],
                            symbol_size = [20, 20], #表示标记宽为 20,高为 10
                        ),                           
                        itemstyle_opts=opts.ItemStyleOpts(
                            color="#ec0000",
                            color0="#00da3c",
                            border_color="#ec0000",
                            border_color0="#00da3c",
                        ),)
            .set_global_opts(
                title_opts=opts.TitleOpts(
                    title=str_plotname,
                    subtitle='MA='+str(MA),
                ),
                xaxis_opts=opts.AxisOpts(type_="category"),
                yaxis_opts=opts.AxisOpts(
                    is_scale=True,
                    splitarea_opts=opts.SplitAreaOpts(
                        is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
                    ),
                ),
                legend_opts=opts.LegendOpts(is_show=True, pos_top='10%', pos_left="center"),
                datazoom_opts=[
                    opts.DataZoomOpts(
                        is_show=False,
                        type_="inside",
                        xaxis_index=[0,1,2],
                        range_start=75,
                        range_end=100,
                    ),
                    opts.DataZoomOpts(
                        is_show=True,
                        xaxis_index=[0,1,2],
                        type_="slider",
                        pos_top="90%",
                        range_start=75,
                        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",font_size=10),
                ),
                # 阴量绿阳量红
                visualmap_opts=opts.VisualMapOpts(
                    is_show=False,
                    dimension=2,
                    series_index=list(map(lambda x: x+len(MA),[4,5])), #动态算出vol和amt柱状图的series index
                    is_piecewise=True,
                    pieces=[
                        {"value": 1, "color": "#ec0000"},
                        {"value": -1, "color": "#00da3c"},
                    ],
                ),  
                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",
                ),
            )
        )
        trendline = (
            Line()
            .add_xaxis(lst_xaxis)
            .add_yaxis('高低点', lst_peaks,
                        itemstyle_opts=opts.ItemStyleOpts(color="green"))
        )
        for i in MA:
            if i is not None:
                trendline.add_yaxis(
                        series_name='MA'+str(i),
                        y_axis=calculate_ma(day_count=i, d=lst_ohlcv),
                        is_smooth=True,
                        is_hover_animation=False,
                        linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5),
                        label_opts=opts.LabelOpts(is_show=False),
                )
        trendline.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        trendline.set_global_opts(legend_opts=opts.LegendOpts(is_show=False))
        
        keyPoints = (
            EffectScatter()
            .add_xaxis(lst_xaxis)
            .add_yaxis("末跌高", lst_pivotdown,symbol=SymbolType.ARROW,symbol_rotate=180,symbol_size=5,itemstyle_opts=opts.ItemStyleOpts(color="purple"))
            .add_yaxis("末升低", lst_pivotup,symbol=SymbolType.ARROW,symbol_size=5,itemstyle_opts=opts.ItemStyleOpts(color="blue"))
            .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        )
        vol_bar = (
            Bar()
            .add_xaxis(lst_xaxis)
            .add_yaxis(
                series_name="交易量",
                y_axis=[
                [i, lst_vol[i], 1 if lst_ohlcv[i][0] < lst_ohlcv[i][1] else -1]
                for i in range(len(lst_vol))
                ],
                xaxis_index=1,
                yaxis_index=1,
                label_opts=opts.LabelOpts(is_show=False),
            )
            .set_global_opts(
                xaxis_opts=opts.AxisOpts(
                    type_="category",
                    is_scale=True,
                    grid_index=1,
                    boundary_gap=False,
                    axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                    axistick_opts=opts.AxisTickOpts(is_show=False),
                    splitline_opts=opts.SplitLineOpts(is_show=False),
                    axislabel_opts=opts.LabelOpts(is_show=False),
                    split_number=20,
                    min_="最低",
                    max_="最高",
                ),
                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),
            )
            # .add_yaxis("交易量", lst_vol,itemstyle_opts=opts.ItemStyleOpts(color="#456A76"))
        )
        amnt_bar = (
            Bar()
            .add_xaxis(lst_xaxis)
            .add_yaxis(
                series_name="交易额",
                y_axis=[
                [i, lst_amount[i], 1 if lst_ohlcv[i][0] < lst_ohlcv[i][1] else -1]
                for i in range(len(lst_amount))
                ],
                xaxis_index=2,
                yaxis_index=2,
                label_opts=opts.LabelOpts(is_show=False),
            )
            .set_global_opts(
                xaxis_opts=opts.AxisOpts(
                    type_="category",
                    is_scale=True,
                    grid_index=2,
                    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_="最低",
                    max_="最高",
                ),
                yaxis_opts=opts.AxisOpts(
                    grid_index=2,
                    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),
            )
            # .add_yaxis("交易额", lst_amount,itemstyle_opts=opts.ItemStyleOpts(color="#456A76"))
        )
        priceChart = kline.overlap(trendline).overlap(keyPoints)
        gridChart = Grid()
        gridChart.add(
            priceChart,
            grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_bottom='40%'),
        )
        gridChart.add(
            vol_bar,
            grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="60%", height='15%'),
        )
        gridChart.add(
            amnt_bar,
            grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="75%"),
        )

        fname = '{}{}.html'.format(cfg.PATH_ANAFILE,'kline')
        gridChart.render(fname) if renderfile else None
        self.kchart = gridChart # 将结果输出到analytics对象属性中用于function以外的调用
        return self
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=False,
                                  type_="inside",
                                  xaxis_index=[0,
                                               0],
                                  range_end=100),
                opts.DataZoomOpts(is_show=True,
                                  xaxis_index=[0,
                                               1],
                                  pos_top="97%",
                                  range_end=100),
                opts.DataZoomOpts(is_show=False,
                                  xaxis_index=[0,
                                               2],
                                  range_end=100),
            ],
            # 三个图的 axis 连在一块
            # axispointer_opts=opts.AxisPointerOpts(
            #     is_show=True,
            #     link=[{"xAxisIndex": "all"}],
            #     label=opts.LabelOpts(background_color="#777"),
            # ),
        ))

    kline_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis(
        series_name="MA5",
        y_axis=calculate_ma(day_count=5),
        is_smooth=True,
        linestyle_opts=opts.LineStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
    ).set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="category",
            grid_index=1,
            axislabel_opts=opts.LabelOpts(is_show=False),
        ),
        yaxis_opts=opts.AxisOpts(
            grid_index=1,
            split_number=3,
            axisline_opts=opts.AxisLineOpts(is_on_zero=False),
            axistick_opts=opts.AxisTickOpts(is_show=False),
            splitline_opts=opts.SplitLineOpts(is_show=False),
            axislabel_opts=opts.LabelOpts(is_show=True),
        ),
    ))
    # Overlap Kline + Line
    overlap_kline_line = kline.overlap(kline_line)

    # Bar-1
    bar_1 = (
        Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(
            series_name="Volumn",
            y_axis=data["vols"],
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
            # 根据 echarts demo 的原版是这么写的
            # itemstyle_opts=opts.ItemStyleOpts(
            #     color=JsCode("""
            #     function(params) {
            #         var colorList;
            #         if (data.datas[params.dataIndex][1]>data.datas[params.dataIndex][0]) {
            #           colorList = '#ef232a';
            #         } else {
            #           colorList = '#14b143';
            #         }
            #         return colorList;
            #     }
            #     """)
            # )
            # 改进后在 grid 中 add_js_funcs 后变成如下
            itemstyle_opts=opts.ItemStyleOpts(color=JsCode("""
                function(params) {
                    var colorList;
                    if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) {
                        colorList = '#ef232a';
                    } else {
                        colorList = '#14b143';
                    }
                    return colorList;
                }
                """)),
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                grid_index=1,
                axislabel_opts=opts.LabelOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        ))

    # Bar-2 (Overlap Bar + Line)
    bar_2 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis(
        series_name="MACD",
        y_axis=data["macds"],
        xaxis_index=2,
        yaxis_index=2,
        label_opts=opts.LabelOpts(is_show=False),
        itemstyle_opts=opts.ItemStyleOpts(color=JsCode("""
                        function(params) {
                            var colorList;
                            if (params.data >= 0) {
                              colorList = '#ef232a';
                            } else {
                              colorList = '#14b143';
                            }
                            return colorList;
                        }
                        """)),
    ).set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="category",
            grid_index=2,
            axislabel_opts=opts.LabelOpts(is_show=False),
        ),
        yaxis_opts=opts.AxisOpts(
            grid_index=2,
            split_number=4,
            axisline_opts=opts.AxisLineOpts(is_on_zero=False),
            axistick_opts=opts.AxisTickOpts(is_show=False),
            splitline_opts=opts.SplitLineOpts(is_show=False),
            axislabel_opts=opts.LabelOpts(is_show=True),
        ),
        legend_opts=opts.LegendOpts(is_show=False),
    ))

    line_2 = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis(
        series_name="DIF",
        y_axis=data["difs"],
        xaxis_index=2,
        yaxis_index=2,
        label_opts=opts.LabelOpts(is_show=False),
    ).add_yaxis(
        series_name="DIF",
        y_axis=data["deas"],
        xaxis_index=2,
        yaxis_index=2,
        label_opts=opts.LabelOpts(is_show=False),
    ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False)))
    # 最下面的柱状图和折线图
    overlap_bar_line = bar_2.overlap(line_2)

    # 最后的 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="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%"),
    )
    grid_chart.render("Professional_kline_chart.html")
Ejemplo n.º 15
0
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),
            datazoom_opts=[opts.DataZoomOpts(type_="inside")],
            title_opts=opts.TitleOpts(title="股票价格增长对比",
                                      pos_left='10%',
                                      pos_top="40%"),
            # 把所有的x轴连接在一起
            axispointer_opts=opts.AxisPointerOpts(
                is_show=True,
                link=[{
                    "xAxisIndex": "all"
                }],
                label=opts.LabelOpts(background_color="#777"),
            ),
        ))
    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1400px",
        height="700px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))

    grid_chart.add(
        line,
        grid_opts=opts.GridOpts(pos_left="25%", pos_right="15%",
                                pos_top="10%"),
    )

    grid_chart.render('16个股票和医药生物指数增长对比.html')
    wb.open('16个股票和医药生物指数增长对比.html')
    print(data['300832.SZ'].tolist())
Ejemplo n.º 16
0
def show_xd_kline(kline_raw, show=True):
    freq = '5min'
    start_dt = kline_raw.iloc[0]["dt"]
    end_dt = kline_raw.iloc[-1]["dt"]

    x_data = kline_raw.dt.values.tolist()
    oclh = kline_raw[['open', 'close', 'low', 'high']].values.tolist()
    symbol = kline_raw.iloc[0]['symbol']

    kline = (
        Kline(init_opts=opts.InitOpts(theme=ThemeType.WHITE))
        .add_xaxis(xaxis_data=x_data)
        .add_yaxis(
            series_name=symbol,
            y_axis=oclh,
            itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title="缠论分析结果:%s-%s" % (symbol, freq),
                subtitle="时间区间:%s 至 %s" % (start_dt, end_dt)
            ),
            xaxis_opts=opts.AxisOpts(type_="category"),
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
                ),
            ),
            legend_opts=opts.LegendOpts(
                is_show=True, pos_top=10, pos_left="center"
            ),
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    xaxis_index=[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,
                ),
            ],
            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": "#ec0000"},
                    {"value": -1, "color": "#00da3c"},
                ],
            ),
            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",
            ),
        )
    )

    chan_fx = (
        Scatter(init_opts=opts.InitOpts(theme=ThemeType.WHITE))
        .add_xaxis(xaxis_data=x_data)
        .add_yaxis("分型标记", kline_raw.fx.values.tolist(),
                   label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
        )
    )

    chan_bi = (
        Scatter(init_opts=opts.InitOpts(theme=ThemeType.WHITE))
        .add_xaxis(xaxis_data=x_data)
        .add_yaxis("笔标记", kline_raw.bi.values.tolist(),
                   label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
        )
    )

    chan_xd = (
        Scatter(init_opts=opts.InitOpts(theme=ThemeType.WHITE))
        .add_xaxis(xaxis_data=x_data)
        .add_yaxis("线段标记", kline_raw.xd.values.tolist(),
                   label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
        )
    )

    bar = (
        Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
        .add_xaxis(xaxis_data=x_data)
        .add_yaxis(
            series_name="Volume",
            yaxis_data=kline_raw.vol.values.tolist(),
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

    # Kline And Line
    kline = kline.overlap(chan_fx)
    kline = kline.overlap(chan_bi)
    kline = kline.overlap(chan_xd)

    # Grid Overlap + Bar
    grid_chart = Grid(opts.InitOpts(width="1400px", height="800px", theme=ThemeType.WHITE))
    grid_chart.add(
        kline,
        grid_opts=opts.GridOpts(
            pos_left="8%", pos_right="8%", height="60%"
        ),
    )
    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(
            pos_left="8%", pos_right="8%", pos_top="70%", height="16%"
        ),
    )

    graph_path = os.path.join(cache_path, "%s_kline_%s.html" % (symbol, "fx"))
    grid_chart.render(path=graph_path)

    # 调用浏览器打开可视化结果
    if show:
        webbrowser.open(graph_path)
Ejemplo n.º 17
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.º 18
0
                                  xaxis_opts=opts.AxisOpts(name='商品'),
                                  yaxis_opts=opts.AxisOpts(name='单位:件')))
bar.render('柱状图.html')

# html转图片
from pyecharts.charts import Bar, Grid, Pie
from pyecharts.render import make_snapshot
from snapshot_selenium import snapshot

init_opts = opts.InitOpts(width="600px", height="360px")
path_html = '柱状图.html'
path_png = "E:/GZ/Django/Django_API-1/Django_baogao/DjangoWord/Python_docx/柱状图.png"

grid = Grid(init_opts=init_opts)
grid.add(bar, grid_opts=opts.GridOpts(pos_top='5'))  # 仅使用pos_top修改相对顶部的位置
grid.render(path_html)

make_snapshot(snapshot,
              grid.render(path_html),
              path_png,
              delay=2,
              pixel_ratio=2)

#直接生成图片
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot

from snapshot_selenium import snapshot

Ejemplo n.º 19
0
def draw_grow_chart(data):
    for i in ts_codes:

        data[i] = data[i].values
        # print(data[i])
        data[i] = data[i] / (data[i][data[i].notnull()].iloc[0])  #除以每一列的第一个非空值

    print(data)

    x = data.index.values.tolist()

    line = (
        Line().add_xaxis(x).add_yaxis(
            '医药生物指数',
            data['000808.SH'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '天宇股份',
            data['300702.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '凯普生物',
            data['300639.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '普利制药',
            data['300630.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '贝达药业',
            data['300558.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '健帆生物',
            data['300529.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '富祥药业',
            data['300497.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '万孚生物',
            data['300482.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '泰格医药',
            data['300347.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '智飞生物',
            data['300122.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '安科生物',
            data['300009.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '凯莱英',
            data['002821.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '长春高新',
            data['000661.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '硕世生物',
            data['688399.SH'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '健友股份',
            data['603707.SH'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '安图生物',
            data['603658.SH'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).add_yaxis(
            '新产业',
            data['300832.SZ'].tolist(),
            label_opts=opts.LabelOpts(is_show=False),
            is_symbol_show=False,
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(is_scale=True),
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),
            datazoom_opts=[opts.DataZoomOpts(type_="inside")],
            title_opts=opts.TitleOpts(title="股票价格增长对比",
                                      pos_left='10%',
                                      pos_top="40%"),
            # 把所有的x轴连接在一起
            axispointer_opts=opts.AxisPointerOpts(
                is_show=True,
                link=[{
                    "xAxisIndex": "all"
                }],
                label=opts.LabelOpts(background_color="#777"),
            ),
        ))
    grid_chart = Grid(init_opts=opts.InitOpts(
        width="1400px",
        height="700px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))

    grid_chart.add(
        line,
        grid_opts=opts.GridOpts(pos_left="25%", pos_right="15%",
                                pos_top="10%"),
    )

    grid_chart.render('股票增长对比.html')
Ejemplo n.º 20
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.º 21
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.º 22
0
    def generate_mchart(self,lst_tscode=[],lst_macro=['shibor.1w','pimon.nt_yoy','pimon.ppi_yoy','pimon.m1_yoy','pimon.m2_yoy','pimon.allstock_circ_mv_sum'],
            lst_findmedian=['pe',()],renderfile=False) -> Grid:
        if self.exists == False:
            return None
        ''' testing findmedian with a given index '''
        # df=self._dataagent.query('index_weight',index_code='000300.SH',start_date='20200630', end_date='20200630')
        # lst_findmedian=['pb',tuple(df['con_code'].values)]
        ''' ----------test end--------------------'''
        
        lst_tscode=list(set([self.ts_code,*lst_tscode]))
        # lst_findmedian[1] = tuple(self._dataagent.registry.loc[self._dataagent.registry['sec_type']=='stk']['ts_code']) if lst_findmedian[1] is None or len(lst_findmedian[1])==0 else lst_findmedian[1]
        dat_cursor = self.cursorTick['timeAxis']
        int_latestViewDate = self._dataagent.int_findClosestTradeDate(datetime.strftime(dat_cursor,'%Y%m%d') )
        df_baseCal = self._dataagent.df_calTbl.loc[self._dataagent.df_calTbl['cal_date']<=int_latestViewDate]['cal_date'].copy()
        lst_xaxis = ['{}/{}/{}'.format(i[:4],i[4:6],i[6:]) for i in df_baseCal.values.astype('str')] # xaxis values has to be STRING type, int will not work

        linechart = (
                Line()
                .add_xaxis(lst_xaxis)
        )
        # 生成主线,即目标证券/指数,及比较用的指数
        for str_tscode in lst_tscode:
            # str_tscode = DataAgent.formatCode(code)
            df_target = self._dataagent.query('load_alldaily',tpl_dateindex=tuple(df_baseCal),ts_code=str_tscode)
            if len(df_target)>0:
                df_toPlot = pd.merge(left=df_baseCal, right=df_target, how='left', left_on='cal_date', right_on='trade_date')
            else:
                continue
            
            '''=====主图画图部分包括主标的和副标的价格曲线,在主图中续把主图及后面叠加图的option,y轴等设置好==='''
            linename = '{} - {}'.format(str_tscode,self.sec_name)
            lst_values = list(df_toPlot['close'])
            lst_values = list(libs.normByRange(lst_values))
            
            linechart.add_yaxis(linename, lst_values,
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.3),
                label_opts=opts.LabelOpts(is_show=False),
                itemstyle_opts=opts.ItemStyleOpts(
                        color="#00da3c",
                ),
            )
            linechart.extend_axis( # 所有保持原比例的折线都放在linechart2里,使用右侧y轴
                yaxis=opts.AxisOpts(
                    name="倍数",
                    type_="value",
                    position="right",
                    axisline_opts=opts.AxisLineOpts(
                        linestyle_opts=opts.LineStyleOpts(color="black")
                    ),
                    axislabel_opts=opts.LabelOpts(formatter="{value}倍"),
                )
            )
            linechart.set_global_opts(
                title_opts=opts.TitleOpts(
                    title='宏观比较',
                ),
                xaxis_opts=opts.AxisOpts(type_="category"),
                yaxis_opts=opts.AxisOpts(name="等比例",
                    is_scale=True,
                ),
                legend_opts=opts.LegendOpts(is_show=True, pos_top='5%', pos_left="center"),
                datazoom_opts=[
                    opts.DataZoomOpts(
                        is_show=False,
                        type_="inside",
                        xaxis_index=[0],
                        range_start=75,
                        range_end=100,
                    ),
                    opts.DataZoomOpts(
                        is_show=True,
                        xaxis_index=[0],
                        type_="slider",
                        pos_top="90%",
                        range_start=75,
                        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",font_size=10),
                ),
                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",
                ),
            )
            '''=============================主图画图部分结束================='''
            '''=========叠加图1 尝试读取pe等股票才有的属性,如失败则说明不是股票,循环继续============='''
            try:
                lst_pe = df_toPlot['pe'].values.tolist()
                lst_pb = df_toPlot['pb'].values.tolist()
                lst_pepb = [round(lst_pe[index]/value,2) for index, value in enumerate(lst_pb) if value!=0]
                linechart.add_yaxis(str_tscode+"_PE", lst_pe, yaxis_index=1, #倍数使用右y轴
                    is_smooth=True,
                    is_hover_animation=False,
                    linestyle_opts=opts.LineStyleOpts(width=1),
                    label_opts=opts.LabelOpts(is_show=False),
                )
                linechart.add_yaxis(str_tscode+"_PE/PB", lst_pepb, yaxis_index=1, #倍数使用右y轴
                    is_smooth=True,
                    is_hover_animation=False,
                    linestyle_opts=opts.LineStyleOpts(width=1),
                    label_opts=opts.LabelOpts(is_show=False),
                )
            except:
                continue
            '''==========================叠加图1结束================================'''
        
        df_shibor = self._dataagent.query('load_shibor')
        # print('Supported shibor columns: {}'.format(df_shibor.columns))
        df_aggDay = self._dataagent.query('load_aggDayKPI')
        # print('Supported macro eco columns: {}'.format(df_aggDay.columns))
        df_pimon = self._dataagent.query('load_piMon')
        df_pimon = pd.merge(df_pimon, df_aggDay, how='left', left_on='date', right_on='trade_date') #与aggday按每月末日期合并以获得如“流通市值”等kpi
        # print('Supported macro eco columns: {}'.format(df_pimon.columns))

        '''=================叠加图2 所有股票的倍数类KPI,使用倍数类y轴============='''
        lst_aggDayKPIloop = ['allstock_pe_median','allstock_pe_ttm_median','allstock_pb_median','allstock_pepb_median']
        for kpi in lst_aggDayKPIloop:
            lst_values = df_aggDay[kpi].values.tolist()
            linechart.add_yaxis(kpi, lst_values, yaxis_index=1, #倍数使用右y轴
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=1),
                label_opts=opts.LabelOpts(is_show=False),
            )
        '''==========================叠加图2结束================================'''
        
        '''===========叠加图3 宏观数据如shibor,cpi,m1等,按“。”分割类别进行图表生成,使用等比类y轴 ========'''
        for item in lst_macro:
            try:
                topic,colname = item.split('.')
            except:
                print('WARNING! input code {} not recognized...'.format(item))
            if topic=='shibor':
                df_target = df_shibor
                maxarr = df_target.max(axis=0, skipna=True).values[1:]
                minarr = df_target.min(axis=0, skipna=True).values[1:]
                deltaRng = max(maxarr)-min(minarr) # overwrite the normalization function delta to put all shibor rates comparable
            elif topic=='pimon':
                df_target = df_pimon
                deltaRng = None
            else:
                print('WARNING! subject code {} is not recognized...'.format(topic))
            if len(df_target)>0:
                df_toPlot = pd.merge(df_baseCal, df_target, how='left', left_on='cal_date', right_on='date')
                df_toPlot[colname] = df_toPlot[colname].bfill()
            else:
                continue
            linename = item
            lst_values = list(df_toPlot[colname])
            lst_values = list(libs.normByRange(lst_values,delta=deltaRng))
            linechart.add_yaxis(linename, lst_values, # 所有等比例缩放的折线都放在linechart里,使用左侧y轴
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=1,opacity=0.5),
                label_opts=opts.LabelOpts(is_show=False),
            )
        '''==========================叠加图3结束================================'''

        
        '''========叠加图4 如参数给出需要寻找中位数的股票列表则读取相应所有本地文件后计算并生成叠加图标========'''
        if lst_findmedian[1] is not None and len(lst_findmedian[1])>0 :
            str_cat = lst_findmedian[0]
            df_result = pd.DataFrame()
            for str_tscode in lst_findmedian[1]:
                try:
                    df = self._dataagent.query('load_alldaily',tpl_dateindex=tuple(df_baseCal),ts_code=str_tscode)[['ts_code','trade_date',str_cat]]
                    print('{} csv file loaded for {} trend analysis...'.format(str_tscode,str_cat),end='\r')
                except Exception as e:
                    print('WARNING! {} csv file not found...'.format(str_tscode))
                    continue
                df_result = pd.concat([df_result,df])
            df_result.dropna(subset=[str_cat],inplace=True)
            df_result = df_result.loc[df_result['trade_date']>19940301]
            # libs.df_csv(cfg.PATH_BUGFILE,(df_result.groupby('trade_date')['ts_code'].count(),))
            # print(df_result.groupby('trade_date')['ts_code'].count())
            df_target = df_result.groupby('trade_date')[str_cat].median()
            if len(df_target)>0:
                df_toPlot = pd.merge(left=df_baseCal, right=df_target, how='left', left_on='cal_date', right_on='trade_date')
                linename = '{}-median'.format(str_cat)
                lst_values = list(df_toPlot[str_cat])
                lst_values = list(lst_values)
                linechart.add_yaxis(linename, lst_values, yaxis_index=1,
                    is_smooth=True,
                    is_hover_animation=False,
                    linestyle_opts=opts.LineStyleOpts(width=1),
                    label_opts=opts.LabelOpts(is_show=False),
                )
            else:
                pass
        '''==========================叠加图4结束================================'''
        # put everything in a grid for easy resizing and positioning
        gridChart = Grid()
        gridChart.add(
            linechart,
            grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top='25%'),
        )

        fname = '{}{}.html'.format(cfg.PATH_ANAFILE,'macro')
        gridChart.render(fname) if renderfile else None
        self.mchart = gridChart #输出至可访问对象属性中
        return self
Ejemplo n.º 23
0
    "lq",
    [0.3254],
    center=["25%", "50%"],
    label_opts=opts.LabelOpts(
        font_size=50,
        formatter=JsCode("""function (param){
						return (Math.floor(param.value * 10000)/100) + '%';  

					}"""),
        position="inside",
    ),
)

grid = Grid().add(l1, grid_opts=opts.GridOpts()).add(l2,
                                                     grid_opts=opts.GridOpts())
grid.render("multiple_liquid.html")

# Section2 平行坐标系
from pyecharts.charts import Parallel

data = [
    [1, 91, 45, 125, 0.82, 34, 23, "良"],
    [2, 65, 27, 78, 0.86, 45, 29, "良"],
    [3, 83, 60, 84, 1.09, 73, 27, "良"],
    [4, 109, 81, 121, 1.28, 68, 51, "轻度污染"],
    [5, 106, 77, 114, 1.07, 55, 51, "轻度污染"],
    [6, 109, 81, 121, 1.28, 68, 51, "轻度污染"],
    [7, 106, 77, 114, 1.07, 55, 51, "轻度污染"],
    [8, 89, 65, 78, 0.86, 51, 26, "良"],
    [9, 53, 33, 47, 0.64, 50, 17, "良"],
    [10, 80, 55, 80, 1.01, 75, 24, "良"],
Ejemplo n.º 24
0
    def createView(self, Clt, city_name):  # Clt客户端程序
        # self.day_datas, self.time_datas = SearchSQL().airDatas(city_name)
        air_datas = Clt.sendData(f"3 {city_name}")
        self.day_datas = air_datas["day"]
        self.time_datas = air_datas["time"]

        timepoint = [[], []]
        aqi = [[], []]
        so2 = [[], []]
        no2 = [[], []]
        co = [[], []]
        o3 = [[], []]
        pm2_5 = [[], []]
        pm10 = [[], []]

        for datas in self.day_datas:
            # 分割日期
            day = re.sub("^2.*?-", '', datas[2].split(' ')[0])  # 取出日期,将年份去掉

            timepoint[0].append(day)
            aqi[0].append(int(datas[4]))
            so2[0].append(int(datas[5]))
            no2[0].append(int(datas[6]))
            co[0].append(float(datas[7]))
            o3[0].append(int(datas[8]))
            pm2_5[0].append(int(datas[9]))
            pm10[0].append(int(datas[10]))
        # print(timepoint[0], aqi[0], so2[0], no2[0], co[0], o3[0], pm2_5[0], pm10[0])

        day_line = Line()
        day_line.add_xaxis(timepoint[0])  # 增加x轴
        day_line.add_yaxis(
            "AQI",
            aqi[0],
            is_smooth=True,  # 线条平滑
            areastyle_opts=opts.AreaStyleOpts(opacity=0),  # 曲线填充面积的透明度
            color="#4169E1")
        day_line.add_yaxis("SO2",
                           so2[0],
                           is_smooth=True,
                           areastyle_opts=opts.AreaStyleOpts(opacity=0),
                           color="#FF0033")
        day_line.add_yaxis("NO2",
                           no2[0],
                           is_smooth=True,
                           areastyle_opts=opts.AreaStyleOpts(opacity=0),
                           color="#4169E1")
        day_line.add_yaxis("CO",
                           co[0],
                           is_smooth=True,
                           areastyle_opts=opts.AreaStyleOpts(opacity=0),
                           color="#FF0033")
        day_line.add_yaxis("O3",
                           o3[0],
                           is_smooth=True,
                           areastyle_opts=opts.AreaStyleOpts(opacity=0),
                           color="#FF0033")
        day_line.add_yaxis("PM2.5",
                           pm2_5[0],
                           is_smooth=True,
                           areastyle_opts=opts.AreaStyleOpts(opacity=0),
                           color="#4169E1")
        day_line.add_yaxis("PM10",
                           pm10[0],
                           is_smooth=True,
                           areastyle_opts=opts.AreaStyleOpts(opacity=0),
                           color="#FF0033")
        day_line.set_global_opts(
            title_opts=opts.TitleOpts(title=city_name,
                                      subtitle="日报",
                                      padding=1,
                                      pos_left="center",
                                      item_gap=7),
            # 设置标题居中
            legend_opts=opts.LegendOpts(
                pos_right="right",  # 将标签设置为水平居右
                pos_top="center",  # 将标签设置为垂直居中
                padding=1,  # 标签与边界距离
                item_gap=16,  # 标签之间的间距
                item_height=12,  # 标签的高度
            ),
            xaxis_opts=opts.AxisOpts(
                axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
                is_scale=False,
                boundary_gap=False),  # 图像贴近y轴
            yaxis_opts=opts.AxisOpts(
                splitline_opts=opts.SplitLineOpts(is_show=True))  # 增加y轴分割线
        )
        day_line.set_series_opts(
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(
                        type_="max",
                        itemstyle_opts=opts.ItemStyleOpts("#e61b14")),
                    opts.MarkPointItem(
                        type_="min",
                        itemstyle_opts=opts.ItemStyleOpts("#14e66f")),
                ],  # 标注最大值最小值
                symbol_size=[30, 34],  # 标注样式的宽,高
                label_opts=opts.LabelOpts(
                    position="inside",
                    color="#fff",  # 标注内的字体颜色
                    font_size=9)),  # 标注内字体的大小
            label_opts=opts.LabelOpts(is_show=True)  # 显示每个坐标点的值

            # markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])  # 标注平均线
        )  # 系列配置项
        # 设置图表在页面居中:Anaconda3\Lib\site - packages\pyecharts\render\templates\macro
        # 添加margin:auto;top:8px;

        # 框架
        day_grid = Grid(init_opts=opts.InitOpts(width="800px", height="380px"))
        day_grid.add(day_line, grid_opts=opts.GridOpts(pos_top="70"))

        day_grid.render("./web/day_line.html")

        for datas in self.time_datas:
            temp_time = datas[2].split(' ')[1]  # 取出时间
            time = re.sub(":00$", '', temp_time)  # 删除秒

            timepoint[1].append(time)
            aqi[1].append(int(datas[3]))
            so2[1].append(int(datas[4]))
            no2[1].append(int(datas[5]))
            co[1].append(float(datas[6]))
            o3[1].append(int(datas[7]))
            pm2_5[1].append(int(datas[8]))
            pm10[1].append(int(datas[9]))
        # print(timepoint[1], aqi[1], so2[1], no2[1], co[1], o3[1], pm2_5[1], pm10[1])

        time_line = Line(
            init_opts=opts.InitOpts(width="800px", height="300px"))
        time_line.add_xaxis(timepoint[1])  # 增加x轴
        time_line.add_yaxis(
            "AQI",
            aqi[1],
            is_smooth=True,  # 线条平滑
            areastyle_opts=opts.AreaStyleOpts(opacity=0),  # 曲线填充面积的透明度
            color="#4169E1")
        time_line.add_yaxis("SO2",
                            so2[1],
                            is_smooth=True,
                            areastyle_opts=opts.AreaStyleOpts(opacity=0),
                            color="#FF0033")
        time_line.add_yaxis("NO2",
                            no2[1],
                            is_smooth=True,
                            areastyle_opts=opts.AreaStyleOpts(opacity=0),
                            color="#4169E1")
        time_line.add_yaxis("CO",
                            co[1],
                            is_smooth=True,
                            areastyle_opts=opts.AreaStyleOpts(opacity=0),
                            color="#FF0033")
        time_line.add_yaxis("O3",
                            o3[1],
                            is_smooth=True,
                            areastyle_opts=opts.AreaStyleOpts(opacity=0),
                            color="#FF0033")
        time_line.add_yaxis("PM2.5",
                            pm2_5[1],
                            is_smooth=True,
                            areastyle_opts=opts.AreaStyleOpts(opacity=0),
                            color="#4169E1")
        time_line.add_yaxis("PM10",
                            pm10[1],
                            is_smooth=True,
                            areastyle_opts=opts.AreaStyleOpts(opacity=0),
                            color="#FF0033")
        time_line.set_global_opts(
            title_opts=opts.TitleOpts(title=city_name,
                                      subtitle="时报",
                                      padding=1,
                                      pos_left="center",
                                      item_gap=7),
            legend_opts=opts.LegendOpts(
                pos_right="right",  # 将标签设置为水平居右
                pos_top="center",  # 将标签设置为垂直居中
                padding=1,  # 标签与边界距离
                item_gap=16,  # 标签之间的间距
                item_height=12,  # 标签的高度
            ),
            xaxis_opts=opts.AxisOpts(
                axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
                is_scale=False,
                boundary_gap=False),  # 图像贴近y轴
            yaxis_opts=opts.AxisOpts(
                splitline_opts=opts.SplitLineOpts(is_show=True))  # 增加y轴分割线
        )
        time_line.set_series_opts(
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(
                        type_="max",
                        itemstyle_opts=opts.ItemStyleOpts("#e61b14")),
                    opts.MarkPointItem(
                        type_="min",
                        itemstyle_opts=opts.ItemStyleOpts("#87CEFA"))
                ],  # 标注最大值最小值
                symbol_size=[30, 34],  # 标注样式的宽,高
                label_opts=opts.LabelOpts(position="inside",
                                          color="#fff",
                                          font_size=9)),  # 标注内字体的大小
            label_opts=opts.LabelOpts(is_show=True)  # 显示每个坐标点的值
            # markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")])  # 标注平均线
        )  # 系列配置项

        time_grid = Grid(
            init_opts=opts.InitOpts(width="800px", height="380px"))
        time_grid.add(time_line, grid_opts=opts.GridOpts(pos_top="70"))

        time_grid.render("./web/time_line.html")
Ejemplo n.º 25
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.º 26
0
def kline_viewer(ts_code, freq, end_date, asset='E', show=True):
    """

    :param show:
    :param ts_code:
    :param freq:
    :param end_date:
    :param asset:
    :return:

    example:

    >>> from chan.web.vis_kline import kline_viewer
    >>> kline_viewer(ts_code='002739.SZ', freq='1min', end_date="20190809", asset='E')
    """
    kline_raw = get_kline(ts_code,
                          freq=freq,
                          end_date=end_date,
                          asset=asset,
                          indicators=('ma', 'macd'))

    for col in ['open', 'close', 'high', 'low']:
        kline_raw[col] = kline_raw[col].apply(round, args=(2, ))

    kline_chan = find_xd(find_bi(find_fx(preprocess(kline_raw))))
    kline_chan = kline_chan[[
        'dt', 'fx', 'fx_mark', 'bi', 'bi_mark', 'xd', 'xd_mark'
    ]]
    kline_raw = kline_raw.merge(kline_chan, how='left', on='dt')

    start_dt = kline_raw.iloc[0]["dt"]
    end_dt = kline_raw.iloc[-1]["dt"]

    x_data = kline_raw.dt.values.tolist()
    oclh = kline_raw[['open', 'close', 'low', 'high']].values.tolist()
    symbol = kline_raw.iloc[0]['symbol']

    kline = (Kline(init_opts=opts.InitOpts(theme=ThemeType.WHITE)).add_xaxis(
        xaxis_data=x_data).add_yaxis(
            series_name=symbol,
            y_axis=oclh,
            itemstyle_opts=opts.ItemStyleOpts(color="#ec0000",
                                              color0="#00da3c"),
        ).set_global_opts(
            title_opts=opts.TitleOpts(title="缠论分析结果:%s-%s" % (symbol, freq),
                                      subtitle="时间区间:%s 至 %s" %
                                      (start_dt, end_dt)),
            xaxis_opts=opts.AxisOpts(type_="category"),
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True,
                    areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            ),
            legend_opts=opts.LegendOpts(is_show=True,
                                        pos_top=5,
                                        pos_left="center"),
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    xaxis_index=[0, 1],
                    range_start=0,
                    range_end=100,
                ),
                opts.DataZoomOpts(
                    is_show=True,
                    xaxis_index=[0, 1],
                    type_="slider",
                    pos_top="60%",
                    range_start=0,
                    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"),
            ),
            visualmap_opts=opts.VisualMapOpts(
                is_show=False,
                dimension=2,
                series_index=5,
                is_piecewise=True,
                pieces=[
                    {
                        "value": 1,
                        "color": "#ec0000"
                    },
                    {
                        "value": -1,
                        "color": "#00da3c"
                    },
                ],
            ),
            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(init_opts=opts.InitOpts(theme=ThemeType.WHITE)).add_xaxis(
        xaxis_data=x_data).add_yaxis(
            series_name="MA5",
            y_axis=kline_raw.ma5.values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA10",
            y_axis=kline_raw.ma10.values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA20",
            y_axis=kline_raw.ma20.values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA60",
            y_axis=kline_raw.ma60.values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA120",
            y_axis=kline_raw.ma120.values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="MA250",
            y_axis=kline_raw.ma250.values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")))

    chan_fx = (Scatter(init_opts=opts.InitOpts(
        theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis(
            "分型标记", kline_raw.fx.values.tolist()).set_global_opts(
                visualmap_opts=opts.VisualMapOpts(type_="size",
                                                  max_=150,
                                                  min_=20), ))

    chan_bi = (Scatter(init_opts=opts.InitOpts(
        theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis(
            "笔标记", kline_raw.bi.values.tolist()).set_global_opts(
                visualmap_opts=opts.VisualMapOpts(type_="size",
                                                  max_=150,
                                                  min_=20), ))

    chan_xd = (Scatter(init_opts=opts.InitOpts(
        theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis(
            "线段标记", kline_raw.xd.values.tolist()).set_global_opts(
                visualmap_opts=opts.VisualMapOpts(type_="size",
                                                  max_=150,
                                                  min_=20), ))

    # Kline And Line
    kline = kline.overlap(line)
    kline = kline.overlap(chan_fx)
    kline = kline.overlap(chan_bi)
    kline = kline.overlap(chan_xd)
    # ==========================================================
    macd_line = (Line(init_opts=opts.InitOpts(
        theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis(
            series_name="DEA",
            y_axis=kline_raw['dea'].values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).add_yaxis(
            series_name="DIFF",
            y_axis=kline_raw['diff'].values.tolist(),
            is_smooth=True,
            is_symbol_show=False,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")))

    macd_bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis(
        xaxis_data=x_data).add_yaxis(
            series_name="Volume",
            yaxis_data=kline_raw.macd.values.tolist(),
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        ))

    macd = macd_line.overlap(macd_bar)

    # ==========================================================

    bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis(
        xaxis_data=x_data).add_yaxis(
            series_name="Volume",
            yaxis_data=kline_raw.vol.values.tolist(),
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        ))

    # Grid Overlap + Bar
    grid_chart = Grid(
        opts.InitOpts(width="1500px", height="800px", theme=ThemeType.WHITE))
    grid_chart.add(
        kline,
        grid_opts=opts.GridOpts(pos_left="8%", pos_right="8%", height="50%"),
    )
    grid_chart.add(
        macd,
        grid_opts=opts.GridOpts(pos_left="8%",
                                pos_right="8%",
                                pos_top="60%",
                                height="16%"),
    )
    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(pos_left="8%",
                                pos_right="8%",
                                pos_top="70%",
                                height="16%"),
    )

    # 调用浏览器打开可视化结果
    if show:
        graph_path = os.path.join(cache_path,
                                  "%s_kline_%s.html" % (symbol, freq))
        grid_chart.render(path=graph_path)
        webbrowser.open(graph_path)
    return grid_chart
Ejemplo n.º 27
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.º 28
0
            is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1))
    )).set_global_opts(
        yaxis_opts=opts.AxisOpts(
            name='Game numbers',
            min_=0,
            max_=1500,
            position='right',
            offset=135,
            #                       axisline_opts=opts.AxisLineOpts(
            #                               linestyle_opts=opts.LineStyleOpts(color='#d14a61')
            #                               )
        ),
        title_opts=opts.TitleOpts(title='Why?'),
        tooltip_opts=opts.TooltipOpts(trigger='axis',
                                      axis_pointer_type='cross'),
        datazoom_opts=opts.DataZoomOpts(),
    ).set_series_opts(label_opts=opts.LabelOpts(is_show=False)))

bar2 = (Bar().add_xaxis(year_list).add_yaxis(
    'Mean Sales',
    mean_list,
    yaxis_index=2,
    label_opts=opts.LabelOpts(is_show=False)))

bar.overlap(bar2)
grid = Grid()
grid.add(bar,
         opts.GridOpts(pos_left='5%', pos_right='20%'),
         is_control_axis_index=True)
grid.render('Why total sales are growing when mean sales are reducing.html')
Ejemplo n.º 29
0
def draw_charts(x_axis_list, oclh_data_list, volume_list, tech_line_dict):
    upColor = '#ec0000'
    downColor = '#00da3c'
    upBorderColor = '#8A0000'
    downBorderColor = '#008F2'

    kline = (Kline().add_xaxis(x_axis_list).add_yaxis(
        series_name="kline",
        y_axis=oclh_data_list,
        markpoint_opts=opts.MarkPointOpts(
            data=gen_mark_points_data_list())).set_series_opts(
                itemstyle_opts=opts.ItemStyleOpts(
                    color=upColor,
                    color0=downColor,
                    border_color=upBorderColor,
                    border_color0=downBorderColor), ).set_global_opts(
                        legend_opts=opts.LegendOpts(pos_bottom=10,
                                                    pos_left="center"),
                        xaxis_opts=opts.AxisOpts(is_scale=True),
                        yaxis_opts=opts.AxisOpts(
                            is_scale=True,
                            splitarea_opts=opts.SplitAreaOpts(
                                areastyle_opts=opts.AreaStyleOpts(opacity=1)),
                        ),
                        tooltip_opts=opts.TooltipOpts(
                            trigger='axis',
                            axis_pointer_type='cross',
                            background_color='rgba(245,245,245,0.8)',
                            border_width=1,
                            border_color='#ccc',
                            textstyle_opts=opts.TextStyleOpts(color='#000')),
                        visualmap_opts=opts.VisualMapOpts(
                            is_show=False,
                            dimension=2,
                            series_index=5,
                            is_piecewise=True,
                            pieces=[
                                {
                                    "value": 1,
                                    "color": downColor
                                },
                                {
                                    "value": -1,
                                    "color": upColor
                                },
                            ],
                        ),
                        datazoom_opts=[
                            opts.DataZoomOpts(
                                type_="inside",
                                xaxis_index=[0, 1],
                                range_start=98,
                                range_end=100,
                            ),
                            opts.DataZoomOpts(
                                type_="slider",
                                xaxis_index=[0, 1],
                                range_start=98,
                                range_end=100,
                                pos_top='85%',
                            )
                        ],
                        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",
                        ),
                        title_opts=opts.TitleOpts(title="Kline")))

    if tech_line_dict:
        line = (Line().add_xaxis(xaxis_data=x_axis_list).set_global_opts(
            xaxis_opts=opts.AxisOpts(type_="category")))
        [
            line.add_yaxis(
                series_name=name,
                y_axis=value_list,
                is_smooth=True,
                is_hover_animation=False,
                linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
                label_opts=opts.LabelOpts(is_show=False),
            ) for name, value_list in tech_line_dict.items()
        ]
        kline = kline.overlap(line)

    bar = (Bar().add_xaxis(x_axis_list).add_yaxis(
        series_name="成交量",
        yaxis_data=volume_list,
        xaxis_index=1,
        yaxis_index=1,
        label_opts=opts.LabelOpts(is_show=False)).set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        ))

    grid_chart = Grid(init_opts=opts.InitOpts(
        width="2000px",
        height="800px",
        animation_opts=opts.AnimationOpts(animation=False),
    ))

    grid_chart.add(kline,
                   grid_opts=opts.GridOpts(pos_left="10%",
                                           pos_right="8%",
                                           height="50%"))
    grid_chart.add(bar,
                   grid_opts=opts.GridOpts(pos_left="10%",
                                           pos_right="8%",
                                           pos_top="63%",
                                           height="16%"))

    folder_path = get_folder_path("backtesting_result_pyecharts")
    file_path = f"{folder_path}/render.html"
    grid_chart.render(path=file_path)

    return file_path
Ejemplo n.º 30
0
    def draw_chart(df,
                   extend_field,
                   save_path="",
                   trade_list=None,
                   point_list=None,
                   area_list=None,
                   kline_title="买卖点K线图",
                   is_smooth=True,
                   is_connect_nones=False):
        datetime_array = df.datetime.tolist()
        volume_array = df.volume.tolist()
        # open close low high
        kline_data = df[["open", "close", "low", "high"]].values.tolist()

        # 绘制买卖点
        _point_list = []
        # 绘制标志点
        if point_list is not None and len(point_list) > 1:
            for point in point_list:
                if type(point["datetime"]) == str:
                    point_datetime = point["datetime"]
                else:
                    point_datetime = point["datetime"].strftime(
                        "%Y-%m-%d %H:%M:%S.%f")

                point_name = point.get("name", "")
                _point_list.append(
                    opts.MarkPointItem(
                        name=point_name,
                        coord=[point_datetime, point["y"]],
                        value=point_name if point_name else point["y"],
                        itemstyle_opts=opts.ItemStyleOpts(
                            color=point.get("color", "#ef232a"))))

        else:
            if trade_list is not None and len(trade_list) > 1:
                for trade in trade_list:
                    # 开多
                    if type(trade[0]) == str:
                        trade_datetime = trade[0]
                    else:
                        trade_datetime = trade[0].strftime(
                            "%Y-%m-%d %H:%M:%S.%f")

                    if trade_datetime < datetime_array[0]:
                        continue

                    if trade[1] == "多" and trade[4] == "开":
                        _point_list.append(
                            opts.MarkPointItem(
                                name="开多",
                                coord=[trade_datetime, trade[6]],
                                value="开多",
                                itemstyle_opts=opts.ItemStyleOpts(
                                    color="#ef232a")))
                    # 开空
                    elif trade[1] == "空" and trade[4] == "开":
                        _point_list.append(
                            opts.MarkPointItem(
                                name="开空",
                                coord=[trade_datetime, trade[6]],
                                value="开空",
                                itemstyle_opts=opts.ItemStyleOpts(
                                    color="#ef232a")))
                    # 平多
                    elif trade[1] == "多" and (trade[4] == "平" or trade[4]
                                              == "平今" or trade[4] == "平昨"):
                        _point_list.append(
                            opts.MarkPointItem(
                                name="平空",
                                coord=[trade_datetime, trade[6]],
                                value="平空",
                                itemstyle_opts=opts.ItemStyleOpts(
                                    color="#14b143")))
                    # 平空
                    elif trade[1] == "空" and (trade[4] == "平" or trade[4]
                                              == "平今" or trade[4] == "平昨"):
                        _point_list.append(
                            opts.MarkPointItem(
                                name="平多",
                                coord=[trade_datetime, trade[6]],
                                value="平多",
                                itemstyle_opts=opts.ItemStyleOpts(
                                    color="#14b143")))

        # 绘制矩形
        _area_list = []
        if area_list is not None and len(area_list) > 1:
            for item in area_list:
                _area_list.append(
                    opts.MarkAreaItem(
                        x=item["x"],
                        y=item["y"],
                        itemstyle_opts=opts.ItemStyleOpts(
                            color="transparent",
                            border_color=item.get("border_color", "#4D0099"),
                            border_width=3,
                            border_type="dashed"),
                    ))

        kline = (Kline().add_xaxis(xaxis_data=datetime_array).add_yaxis(
            series_name="Kline",
            y_axis=kline_data,
            itemstyle_opts=opts.ItemStyleOpts(
                color="#ef232a",
                color0="#14b143",
                border_color="#ef232a",
                border_color0="#14b143",
            ),
            markpoint_opts=opts.MarkPointOpts(data=_point_list),
        ).set_series_opts(markarea_opts=opts.MarkAreaOpts(
            data=_area_list, )).set_global_opts(
                title_opts=opts.TitleOpts(title=kline_title,
                                          pos_left="2%",
                                          pos_top="1%"),
                legend_opts=opts.LegendOpts(is_show=True,
                                            pos_top=10,
                                            pos_left="center"),
                datazoom_opts=[
                    opts.DataZoomOpts(
                        is_show=False,
                        type_="inside",
                        xaxis_index=[0, 1],
                        range_start=0,
                        range_end=100,
                    ),
                    opts.DataZoomOpts(
                        is_show=True,
                        xaxis_index=[0, 1],
                        type_="slider",
                        pos_top="88%",
                        range_start=0,
                        range_end=100,
                    ),
                ],
                yaxis_opts=opts.AxisOpts(
                    is_scale=True,
                    splitline_opts=opts.SplitLineOpts(is_show=True)),
                tooltip_opts=opts.TooltipOpts(
                    trigger="axis",
                    axis_pointer_type="cross",
                    background_color="rgba(245, 245, 245, 0.8)",
                    border_width=1,
                    border_color="#ccc",
                    textstyle_opts=opts.TextStyleOpts(color="#000"),
                ),
                visualmap_opts=opts.VisualMapOpts(
                    is_show=False,
                    dimension=2,
                    series_index=5,
                    is_piecewise=True,
                    pieces=[
                        {
                            "value": 1,
                            "color": "#00da3c"
                        },
                        {
                            "value": -1,
                            "color": "#ec0000"
                        },
                    ],
                ),
                axispointer_opts=opts.AxisPointerOpts(
                    is_show=True,
                    link=[{
                        "xAxisIndex": "all"
                    }],
                    label=opts.LabelOpts(background_color="#777"),
                ),
            ))

        bar = (Bar().add_xaxis(xaxis_data=datetime_array).add_yaxis(
            series_name="Volume",
            y_axis=volume_array,
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
        ).set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        ))

        if len(extend_field) > 0:
            line = (Line().add_xaxis(
                xaxis_data=datetime_array).set_global_opts(
                    xaxis_opts=opts.AxisOpts(type_="category"),
                    legend_opts=opts.LegendOpts(is_show=True),
                ))
            for field in extend_field:
                field_value_array = df[field].tolist()
                line.add_yaxis(
                    series_name=field,
                    y_axis=field_value_array,
                    is_smooth=is_smooth,
                    is_hover_animation=False,
                    linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8),
                    label_opts=opts.LabelOpts(is_show=False),
                    is_connect_nones=is_connect_nones,
                )

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

        # Grid Overlap + Bar
        grid_chart = Grid(init_opts=opts.InitOpts(
            width="100%",
            height="760px",
            animation_opts=opts.AnimationOpts(animation=False),
        ))
        grid_chart.add(
            kline,
            grid_opts=opts.GridOpts(pos_left="3.5%",
                                    pos_right="3.5%",
                                    height="60%"),
        )
        grid_chart.add(
            bar,
            grid_opts=opts.GridOpts(pos_left="3.5%",
                                    pos_right="3.5%",
                                    pos_top="70%",
                                    height="16%"),
        )

        grid_chart.render(os.path.join(save_path, "KLineChart.html"))