python实现股票数据可视化

发布于:2025-03-31 ⋅ 阅读:(20) ⋅ 点赞:(0)

        最近在做一个涉及到股票数据清洗及预测的项目,项目中需要用到可视化股票数据这一功能,这里我与大家分享一下股票数据可视化的一些基本方法。

股票数据获取

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

  1. 爬虫获取,实现较为复杂,除非对股票数据的实时性要求较高(分时)。
  2. .通过一些现有的库,比如tushare,akshare等来获取。
  3. 通过数据公司(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可视化的专栏,记录各种数据类型的可视化已经各种可视化工具的详细使用方法。