最近在做一个涉及到股票数据清洗及预测的项目,项目中需要用到可视化股票数据这一功能,这里我与大家分享一下股票数据可视化的一些基本方法。
股票数据获取
目前,我已知的使用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())# 将数据转换为DataFramecolumns=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 dfstock_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())# 将数据转换为DataFramecolumns=rs.fields#列名为字段名称df=pd.DataFrame(data_list,columns=columns)bs.logout()return dfdef 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 dfdef 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可视化的专栏,记录各种数据类型的可视化已经各种可视化工具的详细使用方法。