Pycharts股票K线图

1
2
3
4
5
6
7
8
9
10
11
12
import os, re
import random
import numpy as np
import pandas as pd
from datetime import date, datetime, timedelta

from pyecharts.charts import Kline, Line, Bar, Grid,Map,Pie,Timeline,Geo
from pyecharts.commons.utils import JsCode
from pyecharts import options as opts
from pyecharts.globals import CurrentConfig, NotebookType,ThemeType,ChartType, SymbolType
from pyecharts.faker import Faker

K线图

  1. 准备数据
  2. 设置kline K线图
  3. 设置line 均线图
  4. 设置bar 成交量
  5. 图表叠加 K线图和均线图
  6. 图表组合 叠加完成的图表与成交量条形图组合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## --------------绘图数据-----------------
file = r"D:\Stock_data\kdata\603956.csv"
code = re.findall(r'\d{6}',file)[0]
df = pd.read_csv(r"D:\Stock_data\kdata\603956.csv",
index_col="date",
parse_dates=["date"],
usecols=[0,1,2,3,4,5,6]
)
df["ma5"] = df["close"].rolling(5).mean()
df["ma10"] = df["close"].rolling(10).mean()
df["ma20"] = df["close"].rolling(20).mean()
df = df[df.index >= '2022-06-01']
df.dropna(inplace=True)
df['ma5'] = df['ma5'].map(lambda x :round(x,2))
df['ma10'] = df['ma10'].map(lambda x :round(x,2))
df['ma20'] = df['ma20'].map(lambda x :round(x,2))
df.head()
date = list(map(lambda x: x.strftime("%Y-%m-%d"), df.index.tolist()))
kl_data = df[["open", "close", "low","high"]].values.tolist()
l_data = df[["ma5", "ma10", "ma20"]].values.tolist()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#-------------设置kline-------------------
k = (Kline(init_opts=opts.InitOpts(width="100%", height="800px"))
.add_xaxis(date)
.add_yaxis("kline",kl_data).set_global_opts(
datazoom_opts=[
opts.DataZoomOpts(type_="inside",range_start=0,range_end=100),
opts.DataZoomOpts(type_="slider",xaxis_index=[0,1],is_show=True),
],
title_opts=opts.TitleOpts(
title="K线图",
subtitle=f"股票代码:{code}",
),
toolbox_opts=opts.ToolboxOpts(),

)

)
k.render_notebook()
k.render('1.html')
Awesome-pyecharts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# -----------------均线 折线图---------------
l =(Line(init_opts=opts.InitOpts(width="100%", height="800px")).add_xaxis(date)
.add_yaxis("ma5",
df['ma5'].values.tolist(),
symbol = None,
is_symbol_show=False,
label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(data=[
{"yAxis": 150}, # 增加自定义标记线
opts.MarkPointItem(type_="min"),
opts.MarkPointItem(type_="max"),
opts.MarkPointItem(type_="average")])
)
.add_yaxis("ma10",
df['ma10'].values.tolist(),
is_symbol_show=False,
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis("ma20",
df['ma20'].values.tolist(),
is_symbol_show=False,
label_opts=opts.LabelOpts(is_show=False),
)
)
l.render_notebook()
l.render('2.html')
Awesome-pyecharts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
v =  (Bar()
.add_xaxis(xaxis_data=date).add_yaxis(
series_name="volume",
y_axis=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),
),
legend_opts=opts.LegendOpts(is_show=False),
))
1
2
3
4
5
# ---------------------叠加图表----------------------
ov1 = k.overlap(l)
ov1.render_notebook()
ov1.render('3.html')

Awesome-pyecharts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 ov = k.overlap(l)

g = (Grid(init_opts=opts.InitOpts(
width="1600px",
height="800px",
animation_opts=opts.AnimationOpts(animation=False),
)
)
.add_js_funcs("var barData={}".format(df[["open", "close"]].values.tolist()))
.add(ov,
grid_opts=opts.GridOpts(
pos_top="2%",
height="70%",
),
)
.add(v,
grid_opts=opts.GridOpts(
pos_top="76%",
height="20%",
),)
)

g.render_notebook()
g.render("4.html")

Awesome-pyecharts