python实现股票数据可视化

news2025/5/19 23:12:00

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

股票数据获取

 目前,我已知的使用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.coloradmin.cn/o/2325149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript DOM与元素操作

目录 DOM 树、DOM 对象、元素操作 一、DOM 树与 DOM 对象 二、获取 DOM 元素 1. 基础方法 2. 现代方法(ES6) 三、修改元素内容 四、修改元素常见属性 1. 标准属性 2. 通用方法 五、通过 style 修改样式 六、通过类名修改样式 1. className 属…

ARM向量表

向量表作用说明RVBAR在 AArch64 中,重置向量不再是异常向量表的一部分。 有复位向量的专用配置输入引脚和寄存器。在 AArch64 中,处理器从 IMPLEMENTAION‑DEFINED 地址开始执行, 该地址由硬件输入引 脚RVBARADDR定义, 可以通过 R…

leetcode刷题日记——除自身以外数组的乘积

[ 题目描述 ]: [ 思路 ]: 题目要求获取数组中每个元素除自己以外的各元素的乘积最简单的方法就是算出数组所有元素的乘积,然后除以自身,即可得到除自身外各元素的乘积 但要考虑到其自身为0的情况,即当期自身为0时&am…

【信奥一本通提高篇】基础算法之贪心算法

原文 https://bbs.fmcraft.top/blog/index.php/archives/22/ 贪心算法 概述 近年来的信息学竞赛试题,经常出现求一个问题的可行解或最优解的题目。这类问题就是我们通常所说的最优化问题。贪心算法是求解这类问题的一种常用算法。在众多的算法中,贪心…

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置: 步骤: step one 安装包 step two 获取股票代码 step three 敲代码,实现 step four 网址转pdf网址 视频 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本节讲…

KMeans算法案例

KMeans算法案例 案例介绍 已知:客户性别、年龄、年收入、消费指数 需求:对客户进行分析,找到业务突破口,寻找黄金客户 数据集共包含顾客的数据, 数据共有 4 个特征, 数据共有 200 条。接下来,使用聚类算法对具有相似…

IDApro直接 debug STM32 MCU

使用IDA pro 逆向分析muc 固件的时候, 难免要进行一些动态的debug,来进一步搞清楚一些内存的数据、算法等,这时候使用远程debug 的方式直接在mcu上进行debug 最合适不过了。 不过有个前提条件就是一般来说有的mcu 会被运行中的代码屏蔽 RDP、…

六十天前端强化训练之第三十六天之E2E测试(Cypress)大师级完整指南

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. E2E测试核心概念 2. Cypress框架特性 3. 工作原理 4. 测试金字塔定位 二、核心代码示例:用户登录全流程测试 三、实现效果展示 四、学习要…

20250330-傅里叶级数专题之离散傅里叶变换(5/6)

5. 傅里叶级数专题之离散傅里叶变换 推荐视频: 工科生以最快的速度理解离散傅立叶变换(DFT) 哔哩哔哩 20250328-傅里叶级数专题之数学基础(0/6)-CSDN博客20250330-傅里叶级数专题之傅里叶级数(1/6)-CSDN博客20250330-傅里叶级数专题之傅里叶变换(2/6)-CSDN博客20250330-傅里叶…

3.29:数据结构-绪论线性表-上

一、时间复杂度 1、ADT 2、定义法计算时间复杂度:统计核心语句的总执行次数 (1)例题1,与2022年的真题对比着写 此题关键在于求和公式的转化,类型为:线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…

大模型架构记录13【hr agent】

一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…

conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …

pycharm相对路径引用方法

用于打字不方便,以下直接手写放图,直观理解

新能源智慧灯杆的智能照明系统如何实现节能?

叁仟新能源智慧灯杆的智能照明系统可通过以下多种方式实现节能: 智能调光控制 光传感器技术:在灯杆上安装光传感器,实时监测周围环境的光照强度。当环境光线充足时,如白天或有其他强光源时,智能照明系统会自动降低路…

Jenkins教程(自动化部署)

Jenkins教程(自动化部署) 1. Jenkins是什么? Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行&…

行业智能体大爆发,分布式智能云有解

Manus的一夜爆红,在全球范围内引爆关于AI智能体的讨论。 与过去一般的AI助手不同,智能体(AI Agent)并非只是被动响应,而是主动感知、决策并执行的应用。Gartner预测,到2028年,15%的日常工作决策…

日语Learn,英语再认识(5)

This is a dedicated function — it exists solely to solve this case. This is a dedicated function. It’s a dedicated method for solving this case. 其他备选词(但没dedicated精准): special → 含糊,有时只是“特别”…

【区块链安全 | 第十四篇】类型之值类型(一)

文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址(Address)类型转换地址的成员balance 和 transfersendcall,delegatecall 和 staticcallcode 和 codehash 合约类型(Contract Types)固定大小字节数组&…

音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流

一、通过FFmpeg命令使用UDP发送TS流 通过以下FFmpeg命令可以将一个mp4文件转换为ts封装,并基于UDP发送(推流): ffmpeg.exe -re -i input.mp4 -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:1234 其中: “in…

Error in torch with streamlit

报错信息: This is the error which is a conflict between torch and streamlit: Examining the path of torch.classes raised: Tried to instantiate class path.path’, but it does not exist! Ensure that it is registered via torch::class Steps to reproduce: py…