pyecharts最新版本绘制K线图

# author:

# datetime:2020/12/7 15:56

"""

文件说明:"""

#数据包

import tushareas ts

# 数据处理包

import numpyas np

# dataframe表格数据处理

import pandasas pd

# 计算各种金融数据技术分析指标

import talibas ta

# 绘图包

from pyecharts.chartsimport Kline, Bar, Line, EffectScatter, Page, Grid

from pyechartsimport optionsas opts

from pyecharts.commons.utilsimport JsCode

# 内置主题类型可查看pyecharts.globals.ThemeType

from pyecharts.globalsimport ThemeType,SymbolType

# 接口秘钥

token= ''

# 对api接口进行验证

pro= ts.pro_api(token)

# 指数代码

index= {

'上证综指': '000001.SH',

'深证成指': '399001.SZ',

'沪深300': '000300.SH',

'创业板指': '399006.SZ',

'上证50': '000016.SH',

'中证500': '000905.SH',

'中小板指': '399005.SZ',

'上证180': '000010.SH'

}

# 定义信息函数

def get_stock_info():

    stockInfos= pro.stock_basic(exchange='',list_status='L')

codes= stockInfos.ts_code.values

names= stockInfos.name.values

stock= dict(zip(names, codes))

return stock

# 获取原始日线行情数据

def get_daily(stock_name,startdate,enddate):

    code= get_stock_info()[stock_name]

if codein index:

        hisdata= pro.index_daily(ts_code=code,start_date=startdate,end_date=enddate)

else:

        hisdata= pro.daily(ts_code=code,start_date=startdate,end_date=enddate)

# 对数据进行处理,设置日期为索引

    hisdata.index= pd.to_datetime(hisdata.trade_date)

# 排序

    hisdata= hisdata.sort_index()

return hisdata

# 对数据进行处理,N1个交易日的最高点,N2个交易日的最低点,一般N1>N2

def my_strategy(data,N1,N2):

    # 获取前20日最高数据

    data['up']= ta.MAX(data.high,timeperiod=N1).shift(1)

# 获取前20日最低数据

    data['down']= ta.MIN(data.low,timeperiod=N2).shift(1)

# 当当天的【close】> 昨天的【最近N1个交易日的最高点】时,将【收盘发出的信号】设定为1

    buy_index= data[data['close']> data['up'].shift(1)].index

data.loc[buy_index,'buy']= 1

    # 当当天的【close】< 昨天的【最近N2个交易日的最低点】时,将【收盘发出的信号】设定为0

    sell_index= data[data['close']< data['down'].shift(1)].index

data.loc[sell_index,'buy']= 0

# ==========计算每年指数的收益以及海龟交易法则的收益

    data['turtle']= data['change']* data['CW']

# year_rtn = data.set_index('trade_date')[['change', 'turtle']].resample('A', how=lambda x: (x + 1.0).prod() - 1.0) * 100

    return data

# 画K线图

def draw_k(Kname,X,Y):

    kline= (

Kline()

.add_xaxis(X)

.add_yaxis(

Kname,# 标题名称

            Y,

itemstyle_opts=opts.ItemStyleOpts(

color="#ec0000",

color0="#00da3c",

border_color="#FF0000",# 阳线颜色

                border_color0="#32CD32",# 阴线颜色

            ),

)

.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)

),

),

# 数据缩放滑动,grid添加几个图,进行几条设置

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

            ],

# datazoom_opts=[opts.DataZoomOpts(type_="slider")],

            title_opts=opts.TitleOpts(title="左上角标题"),

)

)

return kline

# 画柱状图

def draw_bar(Bname,X,Y):

    bar= (

Bar()

.add_xaxis(X)

.add_yaxis(Bname,Y,label_opts=opts.LabelOpts(is_show=False),yaxis_index=1,xaxis_index=1,

# 改进后在 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(

datazoom_opts=[opts.DataZoomOpts(type_="slider")],

)

.set_global_opts(

xaxis_opts=opts.AxisOpts(

type_="category",

grid_index=1,

axislabel_opts=opts.LabelOpts(is_show=False),

),

legend_opts=opts.LegendOpts(is_show=False),

)

)

return bar

# 画折线图

def draw_line(lname,X,Y):

    line= (

Line()

.set_global_opts(

tooltip_opts=opts.TooltipOpts(is_show=False),

xaxis_opts=opts.AxisOpts(type_="category"),

yaxis_opts=opts.AxisOpts(

type_="value",

axistick_opts=opts.AxisTickOpts(is_show=True),

splitline_opts=opts.SplitLineOpts(is_show=True),

),

)

.add_xaxis(xaxis_data=X)

.add_yaxis(

series_name=lname,

y_axis=Y,

symbol="emptyCircle",

is_symbol_show=True,

label_opts=opts.LabelOpts(is_show=False),

)

)

return line

if __name__== '__main__':

    stock_name= '仁和药业'

    N1= 20

    N2= 10

    original_data= get_daily(stock_name,'20180101','20201208')

final_data= my_strategy(original_data, N1, N2)

# 日期-横坐标字符串格式化

    date= [str(t)for tin final_data.index.strftime('%Y%m%d')]

# K线图所需纵坐标

    data_k= final_data.loc[:, ['open','close','low','high']].values.tolist()

kline= draw_k("K线图", date, data_k)

# 折线图

    lup= final_data['up'].values.tolist()

ldown= final_data['down'].values.tolist()

lmoney= final_data['money'].values.tolist()

lincome= final_data['turtle'].values.tolist()

line_up= draw_line('20日均线', date, lup)

line_down= draw_line('10日均线', date, ldown)

line_money= draw_line('资金指数', date, lmoney)

line_income= draw_line('收益指数', date, lincome)

# k线图和折线图组合

    kline_ll= kline.overlap(line_up).overlap(line_down).overlap(line_money).overlap(line_income)

# 柱状图

    vol= final_data['vol'].values.tolist()

bar= draw_bar('成交量', date, vol)


    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_k))

# K线图和折线图

    grid_chart.add(

kline_ll,

grid_opts=opts.GridOpts(pos_left="3%",pos_right="1%",height="60%"),

)

# 柱状图

    grid_chart.add(

bar,

grid_opts=opts.GridOpts(

pos_left="3%",pos_right="1%",pos_top="51%",height="10%"

        ),

)


    grid_chart.render('grid.html')

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容