当前位置: 首页 > article >正文

python实现股票数据可视化

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

股票数据获取

 目前,我已知的使用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
mplfinancematplotlib的extensionpip 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可视化的专栏,记录各种数据类型的可视化已经各种可视化工具的详细使用方法。


http://www.kler.cn/a/623261.html

相关文章:

  • 《Python实战进阶》No36: 使用 Hugging Face 构建 NLP 模型
  • 基于 GEE 利用 Landsat4、5、7、8、9 数据计算 MNDWI 指数实现 1990—2024 年研究区水体变化分析
  • Spring Boot 3.4.3 基于 Caffeine 实现本地缓存
  • Linux基础指令(一)
  • golang 的io与os包中的常用方法
  • VITA 模型解读,实时交互式多模态大模型的 pioneering 之作
  • HarmonyOs学习 实验六:tabs标签与Swiper轮播图页面设计
  • 2023年3月全国计算机等级考试真题(二级C语言)
  • 【算法】并查集基础讲解
  • TCP协议与wireshark抓包分析
  • 现代优雅杂志海报徽标设计手写英文字体安装包 Attomes – Brush Handwritten Font
  • 【Prompt实战】邮件意图分类助手
  • git | 版本切换的相关指令
  • 深度学习入门(二):从感知机到神经网络
  • (三)物理设备
  • 创作领域“<em >一</em><em>分</em><em>快</em><em>3</em><em>官</em><em>网
  • 关于参加CSP-J/S认证需符合年龄条件的公告(2025年起)
  • 漏洞挖掘---灵当CRM客户管理系统getOrderList SQL注入漏洞
  • 保存预测图像时出现的文件名错误
  • Kubernetes 存储