python实现股票数据可视化
最近在做一个涉及到股票数据清洗及预测的项目,项目中需要用到可视化股票数据这一功能,这里我与大家分享一下股票数据可视化的一些基本方法。
股票数据获取
目前,我已知的使用python来获取股票数据方式有以下三种:
- 爬虫获取,实现较为复杂,除非对股票数据的实时性要求较高(分时)。
- .通过一些现有的库,比如tushare,akshare等来获取。
- 通过数据公司(wind,同花顺,alphavantage)给的API爬虫获取。
这里我们还用不到实时性的数据,因此只通过第二种方式来获取一下历史数据即可。在经过大量搜寻与查证后,我这里罗列出了以下常用的python股票数据库名称,它们中的一些已经不再可用:
名称 | 特点 | 目前是否可用 |
akshare | 爬虫获取股票数据 | 不可用 |
easyquotation | 爬虫获取股票数据 | 不可用 |
yfinance | 从雅虎财经获取股票数据 | 2021年后不再可用 |
baostock | 只支持A股历史行情,不需要API | 免费可用 |
tushare | 只支持A股行情(包括实时),免费但需要API | 免费可用 |
示例
这里我们以baostock为例,来获取A股个股的历史行情
baostock获取方式
pip install baostock
BaoStock获取个股历史数据
import baostock as bs
import pandas as pd
#获取股票历史数据
def get_stock_data(stock_code:str,start_date:str,end_date:str,frequency:str="d",adjustflag:str="3"):
"""
获取指定股票的历史数据
Args:
stock_code: 股票代码(格式:"sh.600000")
start_date: 起始日期(格式:YYYY-MM-DD)
end_date: 结束日期(格式:YYYY-MM-DD)
frequency: "d"(日),baostock只支持获取日线数据
adjustflag: "1":原始数据,"2":前复权,"3":后复权
returns:
Pandas DataFrame 格式的数据
"""
#必须先登录baostock才能进行后续操作!
lg = bs.login()
if lg.error_code != "0":
print("登录失败:", lg.error_msg)
exit()
print("登录成功!")
rs=bs.query_history_k_data_plus(
stock_code,
fields="date,code,open,high,low,close,preclose,volume,amount,adjustflag",
start_date=start_date,
end_date=end_date,
frequency=frequency,
adjustflag=adjustflag
)
data_list=[]
while rs.next():
data_list.append(rs.get_row_data())
# 将数据转换为DataFrame
columns=rs.fields#列名为字段名称
df=pd.DataFrame(data_list,columns=columns)
df['date']=pd.to_datetime(df['date']) df[['open','high','low','close','preclose','volume','amount','adjustflag']].astype(float)
bs.logout()
return df
stock_code = "sh.600000" #上证浦发银行
start_date = "2020-11-01"
end_date = "2025-03-30"
stock_data=get_stock_data(stock_code=stock_code,start_date=start_date,end_date=end_date,frequency="d")
print(f"{stock_code}历史数据:")
stock_data
结果
baostock美中不足的是只能获取日线数据……
股票数据可视化
既然拿到了股票数据,那么肯定还是要可视化一下的,毕竟没人想翻来覆去的看一堆冷冰冰的数字,股票数据可视化无非就是绘制K线图。
K线图含义
这是腾讯自选股中的上证指数K线图,仔细观察不难发现,k线图实际上主要由两部分组成,
箱型图和均线图。图中的黄白紫三根线分别是5,10,20日均线(股票在这个周期内的均价),其余红绿相间的小柱子是箱型图:
箱型图的颜色取决于开盘价与收盘价,当开盘价低于收盘价时股票价格上涨是阳线,一般是红色。当开盘价高于收盘价股票价格下跌是阴线,一般是绿色。
K线图绘制工具
python中有很多可以用来绘制k线图的工具,这里我给大家罗列出来以下四种:
名称 | 特点 | 获取方式 |
Matplotlib | 老牌绘图神器,功能强大,灵活性高 | pip install matplotlib |
mplfinance | matplotlib的extension | pip install mplfinance |
Plotly | 使用前端绘图,代码复杂 | pip install plotly |
Bokeh | 使用前端绘图,代码相比其他两个简单一些 | pip instlall bokeh |
Pyecharts | 使用前端绘图,代码复杂 | pip install pyecharts |
这里我们分别以plotly和mplfinance为例来对个股历史数据进行可视化:
示例
plotly绘制k线
# import plotly
# import pandas_ta as ta
import webbrowser
import pandas as pd
import baostock as bs
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import webbrowser
import baostock as bs
import pandas as pd
#获取股票历史数据
def fetch_stock_data(stock_code:str,start_date:str,end_date:str,frequency:str="d",adjustflag:str="3"):
"""
获取指定股票的历史数据
Args:
stock_code: 股票代码(格式:"sh.600000")
start_date: 起始日期(格式:YYYY-MM-DD)
end_date: 结束日期(格式:YYYY-MM-DD)
frequency: "d"(日),baostock只支持获取日线数据
adjustflag: "1":原始数据,"2":前复权,"3":后复权
returns:
Pandas DataFrame 格式的数据
"""
#必须先登录baostock才能进行后续操作
lg = bs.login()
if lg.error_code != "0":
print("登录失败:", lg.error_msg)
exit()
# 打印登录信息
print("登录成功!")
rs=bs.query_history_k_data_plus(
stock_code, # 股票代码
fields="date,code,open,high,low,close,preclose,volume,amount,adjustflag",
start_date=start_date,
end_date=end_date,
frequency=frequency,
adjustflag=adjustflag
)
data_list=[]
while rs.next():
# 将每一行数据添加到列表中
data_list.append(rs.get_row_data())
# 将数据转换为DataFrame
columns=rs.fields#列名为字段名称
df=pd.DataFrame(data_list,columns=columns)
bs.logout()
return df
def calculate_indexs(stock_code,start_date,end_date):
df=fetch_stock_data(stock_code,start_date=start_date,end_date=end_date)
df['MAC5']=df['close'].rolling(5).mean()
df['MAC20']=df['close'].rolling(20).mean()
df['MAC60']=df['close'].rolling(60).mean()
return df
def create_kline_chart(stock_code,start_date,end_date):
"""
使用 Plotly 绘制股票 K 线图并保存为 HTML 文件
"""
# 获取股票数据
df=calculate_indexs(stock_code,start_date=start_date,end_date=end_date)
# 创建 K 线图
fig=make_subplots(
rows=2,
cols=1,
vertical_spacing=0.15,
shared_xaxes=True,
row_heights=[0.6,0.4])
# 添加 K 线图
fig.add_trace(go.Candlestick(
x=df.index,
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name="K线图"),
row=1,
col=1)
fig.add_trace(
go.Scatter(
x=df.index,
y=df['MAC5'],
mode='lines',
name='5日均线',
line=dict(color='yellow',width=1)),
row=1,
col=1)
fig.add_trace(
go.Scatter(
x=df.index,
y=df['MAC20'],
mode='lines',
name='20日均线',
line=dict(color='white',width=1)),
row=1,
col=1)
fig.add_trace(
go.Scatter(
x=df.index,
y=df['MAC60'],
mode='lines',
name='60日均线',
line=dict(color='purple',width=1)),
row=1,
col=1)
# 设置布局
fig.update_layout(
title=f"{stock_code} K线图",
xaxis_title="日期",
yaxis_title="价格",
xaxis_rangeslider_visible=True, # 添加范围滑块
template="plotly_dark"
)
# 保存为 HTML 文件
html_file=f"{stock_code}_kline_chart.html"
webbrowser.open(html_file)
fig.write_html(html_file)
return html_file
html_file=create_kline_chart('sh.600319',start_date='2023-06-25',end_date='2025-03-30')
webbrowser.open(html_file)
结果:
mplfinance绘制k线
import baostock as bs
import pandas as pd
import mplfinance as mpf
# 登录 baostock
lg = bs.login()
if lg.error_code != "0":
print("登录失败:", lg.error_msg)
exit()
# 获取股票历史数据
def get_stock_data(stock_code, start_date, end_date):
"""
获取指定股票的历史数据
:param stock_code: 股票代码(如 "sh.600000")
:param start_date: 起始日期(格式:YYYY-MM-DD)
:param end_date: 结束日期(格式:YYYY-MM-DD)
:return: Pandas DataFrame 格式的数据
"""
rs = bs.query_history_k_data_plus(
stock_code,
"date,code,open,high,low,close,preclose,volume,amount,adjustflag",
start_date=start_date,
end_date=end_date,
frequency="d",
adjustflag="3" #后复权
)
data_list = []
while rs.next():
data_list.append(rs.get_row_data())
df=pd.DataFrame(data_list, columns=rs.fields)
df["date"]=pd.to_datetime(df["date"])
df.set_index("date", inplace=True)
df["open"]=df["open"].astype(float)
df["close"]=df["close"].astype(float)
df["high"]=df["high"].astype(float)
df["low"]=df["low"].astype(float)
df['volume']=df['volume'].astype(float)
return df
# 绘制 K 线图和均线
def plot_kline(stock_code, start_date, end_date, ma_periods=[5, 10, 20]):
"""
使用 mplfinance 绘制股票的 K 线图和均线
:param stock_code: 股票代码(如 "sh.600000")
:param start_date: 起始日期(格式:YYYY-MM-DD)
:param end_date: 结束日期(格式:YYYY-MM-DD)
:param ma_periods: 均线周期列表(如 [5, 10, 20])
"""
#获取股票数据
df=get_stock_data(stock_code, start_date, end_date)
# 计算均线
for period in ma_periods:
df[f"ma{period}"]=df["close"].rolling(window=period).mean()
# 设置绘图样式
mc=mpf.make_marketcolors(up='g', down='r', edge='inherit', wick='inherit', volume='inherit')
s=mpf.make_mpf_style(marketcolors=mc)
apdict=[]
for period in ma_periods:
apdict.append(mpf.make_addplot(df[f"ma{period}"], panel=0, color='blue', width=1.5))
# 绘制 K 线图和均线
mpf.plot(
df,
type='candle',
style=s,
title=f"{stock_code}",
ylabel="price",
addplot=apdict,
figratio=(10, 6),
tight_layout=True
)
stock_code = "sh.600000"
start_date = "2023-01-01"
end_date = "2025-01-31"
plot_kline(stock_code, start_date, end_date, ma_periods=[5, 10, 20])
bs.logout()
结果:
不得不说,在画图这方面,还是使用前端工具绘制出的图像更加美观。
总结
以上便是python可视化股票数据的所有内容,后期我将开启一个python可视化的专栏,记录各种数据类型的可视化已经各种可视化工具的详细使用方法。