打开默认显示半年线,可以通过可视化类型选择可视化k线图、高低点等。(目前只完成了初版,当查询的股票数据返回为空时,可能会有部分问题,后续有时间了会修改)
此web应用程序主要使用了以下Python第三方库:
Plotly – 数据可视化库(Plotly数据可视化方法)
Pandas – 数据处理及分析库
Tushare – 财经数据接口库
Flask – Web应用框架
整个的思路比较简单,股票数据的获取主要通过 ***Tushare***获取。
如下是获取000001.SZ整年的数据的方法。
import tushare as ts
ts.set_token('b94ecd1e37a3628890e89b90e0259b6db72b0ae0b17dadd2c28c5c4c')
pro = ts.pro_api()
df = pro.daily(ts_code='000001.sz', start_date='20200101', end_date='202001230')
df.head()
这里有一个小问题。数据中没有股票代码对应的公司名称。所以在此之前需要调用ts中的其他方法获取股票代码对应的相关信息。我将名称与公司信息获取之后保存在了本地,方便后续使用。调用方法和返回数据如下。
这里可视化主要用的是plotly,通过plotly绘制的图形有着更好的交互效果。可以通过ploytly的时间序列选择器鼠标拖动选择想要查看的具体内容。将每种不同的图形封装成绘图类的对应方法即可。
from datetime import datetime
import tushare as ts
import pandas as pd
import plotly as py
import plotly.graph_objs as go
pyplt = py.offline.plot
#读取股票代码与名称字典
ts.set_token('b94ecd1e37a3628890e89b90e0259b6db72b0ae0b17dadd2c28c5c4c')
pro = ts.pro_api()
df=pd.read_csv("stock_code.csv")
# df = pro.daily(ts_code='000001.sz', start_date='20190701', end_date='20190930')#直接保存
class Chart_Plot:
def __init__(self,start_date,end_date,stock1="000001",stock2="000002"):
#处理参数格式,符合tushare调用规范
self.start_date=start_date.replace("-","")
self.end_date=end_date.replace("-","")
#获取指定股票代码的名称
temp=df.loc[df.ts_code.str.contains(stock1)]
self.stock1_code=temp["ts_code"].values[0]
self.stock1=pro.daily(ts_code=self.stock1_code, start_date=start_date, end_date=end_date)
self.name1=temp['name'].values[0]
#获取要对比的股票代码的名称
temp = df.loc[df.ts_code.str.contains(stock2)]
self.stock2_code = temp["ts_code"].values[0]
self.stock2=pro.daily(ts_code=self.stock2_code, start_date=start_date, end_date=end_date)
self.name2=temp['name'].values[0]
def candle_stick(self,period="day"):#日K线图
#默认获取日k,如果period不为日k,则获取对应值
if period=="周k":
self.stock1=pro.weekly(ts_code=self.stock1_code,start_date=self.start_date,end_date=self.end_date)
elif period=="月k":
self.stock1 = pro.monthly(ts_code=self.stock1_code, start_date=self.start_date, end_date=self.end_date)
strdate =self.stock1['trade_date'].tolist()
#日期字符串转时间序列
date=[]
for i in strdate:
X = datetime.strptime(i, '%Y%m%d')
date.append(X)
candle_trace = go.Candlestick(x = date,
open = self.stock1.open,
high = self.stock1.high,
low = self.stock1.low,
close = self.stock1.close,
increasing=dict(line=dict(color= '#ff0000')),
decreasing=dict(line=dict(color= '#00ff00')),
name = self.stock1['ts_code'].values[0])
candle_data = [candle_trace]
candle_layout = {
'title': self.stock1['ts_code'][0],'yaxis': {
'title': '价格'}}
candle_fig = dict(data=candle_data, layout=candle_layout)
div = pyplt(candle_fig, output_type='div', include_plotlyjs=False, auto_open=False, show_link=False)
return div
def twoline_graph(self): #半年线图
#self.stock1['close']取出来的值都是带有索引值的两列的矩阵,具体看excl表格
#tolist函数则将他们变为列表,除去索引值
close = self.stock1['close'].tolist()
strdate = self.stock1['trade_date'].tolist()
date=[]
for i in strdate:
X = datetime.strptime(i, '%Y%m%d')
date.append(X)
# 画图语句:go.Scatter
trace = [go.Scatter(
x=date,
y=close
)]
#print (trace)
#[Scatter({'x': [2019-09-30 00:00:00, 2019-09-27 00:00:00.....
layout = dict(
title=self.stock1['ts_code'].values[0]+":"+self.name1,
xaxis=dict(title='日期'),
yaxis=dict(title='价格')
)
#print (layout)
#{'title': 'ETF50', 'xaxis': {'title': '日期'}, 'yaxis': {'title': '价格'}}
fig = dict(data=trace, layout=layout)
#print (fig)
div = pyplt(fig, output_type='div', include_plotlyjs=False, auto_open=False, show_link=False)
#print (div)
return div
def high_low(self):
high = self.stock1['high'].tolist()
low = self.stock1['low'].tolist()
strdate = self.stock1['trade_date'].tolist()
date = []
for i in strdate:
X = datetime.strptime(i, '%Y%m%d')
date.append(X)
# 画图语句:go.Scatter
trace = [go.Scatter(
x=date,
y=high
),
go.Scatter(
x=date,
y=low
)
]
# print (trace)
# [Scatter({'x': [2019-09-30 00:00:00, 2019-09-27 00:00:00.....
layout = dict(
title=self.stock1['ts_code'].values[0]+":"+self.name1,
xaxis=dict(title='日期'),
yaxis=dict(title='价格')
)
# print (layout)
# {'title': 'ETF50', 'xaxis': {'title': '日期'}, 'yaxis': {'title': '价格'}}
fig = dict(data=trace, layout=layout)
# print (fig)
div = pyplt(fig, output_type='div', include_plotlyjs=False, auto_open=False, show_link=False)
return div
在调用此方法后将返回结果传递给前端的图形展示区域即可。
在这里插入图片描述