python实现股票数据可视化

[复制链接]
发表于 2025-10-4 17:51:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

        迩来在做一个涉及到股票数据洗濯及猜测的项目,项目中须要用到可视化股票数据这一功能,这里我与各人分享一下股票数据可视化的一些根本方法。
股票数据获取

 现在,我已知的使用python来获取股票数据方式有以下三种:

  • 爬虫获取,实现较为复杂,除非对股票数据的及时性要求较高(分时)。
  • .通过一些现有的库,比如tushare,akshare等来获取。
  • 通过数据公司(wind,同花顺,alphavantage)给的API爬虫获取。
这里我们还用不到及时性的数据,因此只通过第二种方式来获取一下汗青数据即可。在颠末大量征采与查证后,我这里摆列出了以下常用的python股票数据库名称,它们中的一些已经不再可用:
名称特点现在是否可用
akshare爬虫获取股票数据不可用
easyquotation爬虫获取股票数据不可用
yfinance从雅虎财经获取股票数据2021年后不再可用
baostock只支持A股汗青行情,不须要API免费可用
tushare只支持A股行情(包罗及时),免费但须要API免费可用
示例 

这里我们以baostock为例,来获取A股个股的汗青行情 
baostock获取方式
  1. pip install baostock
复制代码
BaoStock获取个股汗青数据
  1. import baostock as bs
  2. import pandas as pd
  3. #获取股票历史数据
  4. def get_stock_data(stock_code:str,start_date:str,end_date:str,frequency:str="d",adjustflag:str="3"):
  5.     """
  6.     获取指定股票的历史数据
  7.     Args:
  8.         stock_code: 股票代码(格式:"sh.600000")
  9.         start_date: 起始日期(格式:YYYY-MM-DD)
  10.         end_date: 结束日期(格式:YYYY-MM-DD)
  11.         frequency: "d"(日),baostock只支持获取日线数据
  12.         adjustflag: "1":原始数据,"2":前复权,"3":后复权
  13.     returns:
  14.         Pandas DataFrame 格式的数据
  15.     """
  16.     #必须先登录baostock才能进行后续操作!
  17.     lg = bs.login()
  18.     if lg.error_code != "0":
  19.         print("登录失败:", lg.error_msg)
  20.         exit()
  21.     print("登录成功!")
  22.     rs=bs.query_history_k_data_plus(
  23.         stock_code,
  24.         fields="date,code,open,high,low,close,preclose,volume,amount,adjustflag",
  25.         start_date=start_date,
  26.         end_date=end_date,  
  27.         frequency=frequency,  
  28.         adjustflag=adjustflag  
  29.     )
  30.     data_list=[]
  31.     while rs.next():
  32.         data_list.append(rs.get_row_data())
  33.     # 将数据转换为DataFrame
  34.     columns=rs.fields#列名为字段名称
  35.     df=pd.DataFrame(data_list,columns=columns)
  36.     df['date']=pd.to_datetime(df['date'])         df[['open','high','low','close','preclose','volume','amount','adjustflag']].astype(float)
  37.     bs.logout()
  38.     return df
  39. stock_code = "sh.600000" #上证浦发银行
  40. start_date = "2020-11-01"
  41. end_date = "2025-03-30"
  42. stock_data=get_stock_data(stock_code=stock_code,start_date=start_date,end_date=end_date,frequency="d")
  43. print(f"{stock_code}历史数据:")
  44. stock_data
复制代码
效果

baostock美中不敷的是只能获取日线数据…… 
股票数据可视化

        既然拿到了股票数据,那么肯定还是要可视化一下的,究竟没人想翻来覆去的看一堆冷冰冰的数字,股票数据可视化无非就是绘制K线图。
K线图寄义


这是腾讯自选股中的上证指数K线图,细致观察不难发现,k线图实际上紧张由两部分构成,
 箱型图和均线图。图中的黄白紫三根线分别是5,10,20日均线(股票在这个周期内的均价),别的红绿相间的小柱子是箱型图:

        箱型图的颜色取决于开盘价与收盘价,当开盘价低于收盘价时股票代价上涨是阳线,一样平常是赤色。当开盘价高于收盘价股票代价下跌是阴线,一样平常是绿色。
K线图绘制工具

python中有许多可以用来绘制k线图的工具,这里我给各人摆列出来以下四种:
名称特点获取方式
Matplotlib老牌绘图神器,功能强盛,机动性高pip install matplotlib
​mplfinancematplotlib的extensionpip install mplfinance
​Plotly使用前端绘图,代码复杂pip install plotly
​Bokeh使用前端绘图,代码相比其他两个简朴一些pip instlall bokeh
​Pyecharts使用前端绘图,代码复杂pip install pyecharts
这里我们分别以plotly和mplfinance为例来对个股汗青数据举行可视化:
示例

plotly绘制k线
  1. # import plotly
  2. # import pandas_ta as ta
  3. import webbrowser
  4. import pandas as pd
  5. import baostock as bs
  6. import plotly.graph_objects as go
  7. from plotly.subplots import make_subplots
  8. import webbrowser
  9. import baostock as bs
  10. import pandas as pd
  11. #获取股票历史数据
  12. def fetch_stock_data(stock_code:str,start_date:str,end_date:str,frequency:str="d",adjustflag:str="3"):
  13.     """
  14.     获取指定股票的历史数据
  15.     Args:
  16.         stock_code: 股票代码(格式:"sh.600000")
  17.         start_date: 起始日期(格式:YYYY-MM-DD)
  18.         end_date: 结束日期(格式:YYYY-MM-DD)
  19.         frequency: "d"(日),baostock只支持获取日线数据
  20.         adjustflag: "1":原始数据,"2":前复权,"3":后复权
  21.     returns:
  22.         Pandas DataFrame 格式的数据
  23.     """
  24.     #必须先登录baostock才能进行后续操作
  25.     lg = bs.login()
  26.     if lg.error_code != "0":
  27.         print("登录失败:", lg.error_msg)
  28.         exit()
  29.     # 打印登录信息
  30.     print("登录成功!")
  31.     rs=bs.query_history_k_data_plus(
  32.         stock_code,  # 股票代码
  33.         fields="date,code,open,high,low,close,preclose,volume,amount,adjustflag",
  34.         start_date=start_date,
  35.         end_date=end_date,  
  36.         frequency=frequency,  
  37.         adjustflag=adjustflag  
  38.     )
  39.     data_list=[]
  40.     while rs.next():
  41.         # 将每一行数据添加到列表中
  42.         data_list.append(rs.get_row_data())
  43.     # 将数据转换为DataFrame
  44.     columns=rs.fields#列名为字段名称
  45.     df=pd.DataFrame(data_list,columns=columns)
  46.     bs.logout()
  47.     return df
  48. def calculate_indexs(stock_code,start_date,end_date):
  49.     df=fetch_stock_data(stock_code,start_date=start_date,end_date=end_date)
  50.     df['MAC5']=df['close'].rolling(5).mean()
  51.     df['MAC20']=df['close'].rolling(20).mean()
  52.     df['MAC60']=df['close'].rolling(60).mean()
  53.     return df
  54. def create_kline_chart(stock_code,start_date,end_date):
  55.     """
  56.     使用 Plotly 绘制股票 K 线图并保存为 HTML 文件
  57.     """
  58.     # 获取股票数据
  59.     df=calculate_indexs(stock_code,start_date=start_date,end_date=end_date)
  60.     # 创建 K 线图
  61.     fig=make_subplots(
  62.     rows=2,
  63.     cols=1,
  64.     vertical_spacing=0.15,
  65.     shared_xaxes=True,
  66.     row_heights=[0.6,0.4])
  67.     # 添加 K 线图
  68.     fig.add_trace(go.Candlestick(
  69.         x=df.index,
  70.         open=df['open'],
  71.         high=df['high'],
  72.         low=df['low'],
  73.         close=df['close'],
  74.         name="K线图"),
  75.         row=1,
  76.         col=1)
  77.    
  78.     fig.add_trace(
  79.         go.Scatter(
  80.         x=df.index,
  81.         y=df['MAC5'],
  82.         mode='lines',
  83.         name='5日均线',
  84.         line=dict(color='yellow',width=1)),
  85.         row=1,
  86.         col=1)
  87.    
  88.     fig.add_trace(
  89.         go.Scatter(
  90.         x=df.index,
  91.         y=df['MAC20'],
  92.         mode='lines',
  93.         name='20日均线',
  94.         line=dict(color='white',width=1)),
  95.         row=1,
  96.         col=1)
  97.    
  98.     fig.add_trace(
  99.         go.Scatter(
  100.         x=df.index,
  101.         y=df['MAC60'],
  102.         mode='lines',
  103.         name='60日均线',
  104.         line=dict(color='purple',width=1)),
  105.         row=1,
  106.         col=1)
  107.    
  108.   
  109.     # 设置布局
  110.     fig.update_layout(
  111.         title=f"{stock_code} K线图",
  112.         xaxis_title="日期",
  113.         yaxis_title="价格",
  114.         xaxis_rangeslider_visible=True,  # 添加范围滑块
  115.         template="plotly_dark"
  116.     )
  117.     # 保存为 HTML 文件
  118.     html_file=f"{stock_code}_kline_chart.html"
  119.     webbrowser.open(html_file)
  120.     fig.write_html(html_file)
  121.     return html_file
  122. html_file=create_kline_chart('sh.600319',start_date='2023-06-25',end_date='2025-03-30')
  123. webbrowser.open(html_file)
复制代码
效果: 


mplfinance绘制k线
  1. import baostock as bs
  2. import pandas as pd
  3. import mplfinance as mpf
  4. # 登录 baostock
  5. lg = bs.login()
  6. if lg.error_code != "0":
  7.     print("登录失败:", lg.error_msg)
  8.     exit()
  9. # 获取股票历史数据
  10. def get_stock_data(stock_code, start_date, end_date):
  11.     """
  12.     获取指定股票的历史数据
  13.     :param stock_code: 股票代码(如 "sh.600000")
  14.     :param start_date: 起始日期(格式:YYYY-MM-DD)
  15.     :param end_date: 结束日期(格式:YYYY-MM-DD)
  16.     :return: Pandas DataFrame 格式的数据
  17.     """
  18.     rs = bs.query_history_k_data_plus(
  19.         stock_code,
  20.         "date,code,open,high,low,close,preclose,volume,amount,adjustflag",
  21.         start_date=start_date,
  22.         end_date=end_date,
  23.         frequency="d",
  24.         adjustflag="3"  #后复权
  25.     )
  26.     data_list = []
  27.     while rs.next():
  28.         data_list.append(rs.get_row_data())
  29.     df=pd.DataFrame(data_list, columns=rs.fields)
  30.     df["date"]=pd.to_datetime(df["date"])  
  31.     df.set_index("date", inplace=True)      
  32.     df["open"]=df["open"].astype(float)   
  33.     df["close"]=df["close"].astype(float)  
  34.     df["high"]=df["high"].astype(float)   
  35.     df["low"]=df["low"].astype(float)      
  36.     df['volume']=df['volume'].astype(float)
  37.     return df
  38. # 绘制 K 线图和均线
  39. def plot_kline(stock_code, start_date, end_date, ma_periods=[5, 10, 20]):
  40.     """
  41.     使用 mplfinance 绘制股票的 K 线图和均线
  42.     :param stock_code: 股票代码(如 "sh.600000")
  43.     :param start_date: 起始日期(格式:YYYY-MM-DD)
  44.     :param end_date: 结束日期(格式:YYYY-MM-DD)
  45.     :param ma_periods: 均线周期列表(如 [5, 10, 20])
  46.     """
  47.     #获取股票数据
  48.     df=get_stock_data(stock_code, start_date, end_date)
  49.     # 计算均线
  50.     for period in ma_periods:
  51.         df[f"ma{period}"]=df["close"].rolling(window=period).mean()
  52.     # 设置绘图样式
  53.     mc=mpf.make_marketcolors(up='g', down='r', edge='inherit', wick='inherit', volume='inherit')
  54.     s=mpf.make_mpf_style(marketcolors=mc)
  55.     apdict=[]
  56.     for period in ma_periods:
  57.         apdict.append(mpf.make_addplot(df[f"ma{period}"], panel=0, color='blue', width=1.5))
  58.     # 绘制 K 线图和均线
  59.     mpf.plot(
  60.         df,
  61.         type='candle',
  62.         style=s,
  63.         title=f"{stock_code}",
  64.         ylabel="price",
  65.         addplot=apdict,
  66.         figratio=(10, 6),
  67.         tight_layout=True
  68.     )
  69. stock_code = "sh.600000"  
  70. start_date = "2023-01-01"
  71. end_date = "2025-01-31"
  72. plot_kline(stock_code, start_date, end_date, ma_periods=[5, 10, 20])
  73. bs.logout()
复制代码
效果: 

不得不说,在绘图这方面,还是使用前端工具绘制出的图像更加雅观。
总结


        以上便是python可视化股票数据的全部内容,后期我将开启一个python可视化的专栏,记载各种数据范例的可视化已经各种可视化工具的详细使用方法。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表