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())# 将数据转换为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
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())# 将数据转换为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可视化的专栏,记录各种数据类型的可视化已经各种可视化工具的详细使用方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75014.shtml

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

相关文章

【15】Selenium 爬取实战

一、selenium适用场景 二、爬取目标 三、爬取列表页 (1)初始化 (2)加载列表页 (3)解析列表页 (4)main 四、爬取详情页 (1)加载详情页 (2…

如何封装一个上传文件组件

#今天用el-upload感到很多不方便,遂决定自己封装一个。注:本文不提供表面的按钮样式和文件上传成功后的样式,需要自己创建。本文仅介绍逻辑函数# 1,准备几个表面用来指引上传的元素 2,创造统一的隐藏文件上传输入框&…

【计网】数据包

期末复习自用的,处理得比较草率,复习的同学或者想看基础的同学可以看看,大佬的话可以不用浪费时间在我的水文上了 1.数据包的定义: 数据包是网络通信中的基本单元,它包含了通过网络传输的所有必要信息。数据包的结构…

HTTP抓包Websocket抓包(Fiddler)

近期时常要和各个厂商的java云平台打交道:登录、上传、下载等,程序的日志虽必不可少,但前期调试阶段,免不了遇到问题,这时有一个称手的抓包工具就显得尤为重要了。 Fiddler Everywhere是一款跨平台的网络调试工具&…

Git和GitCode使用(从Git安装到上传项目一条龙)

第一步 菜鸟教程-Git教程 点击上方链接,完成Git的安装,并了解Git 工作流程,知道Git 工作区、暂存区和版本库的区别 第二步 GitCode官方帮助文档-SSH 公钥管理 点击上方链接,完成SSH公钥设置 第三步(GitCode的官方引…

基于 WebAssembly 的 Game of Life 交互实现

一、前言 在前期的实现中,我们使用 Rust 编写核心逻辑,并通过 WebAssembly 将其引入到 Web 环境中,再利用 JavaScript 进行渲染。接下来,我们将在这一基础上增加用户交互功能,使模拟过程不仅能够自动演化,…

【keil】单步调试

一、步骤 1、打开stc-isp软件 2.打开keil仿真设置,选择对应的单片机型号 3.点击将所选目标单片机设置为仿真芯片,点击下载,按一下单片机打下载按钮 4.此时已经将仿真程序下载到单片机 5.此时点击options,找到debug选择STC Montor 51 Driv…

c++弱指针实现原理

在 C 中,弱指针(std::weak_ptr)是一种特殊的智能指针,其核心目标是‌解决 std::shared_ptr 的循环引用问题‌,同时不增加对象的引用计数。它的实现原理基于与 std::shared_ptr 共享的 ‌控制块(Control Blo…

【ManiSkill】环境success条件和reward函数学习笔记

1. “PickCube-v1” info["success"]:用于指示任务是否成功完成 布尔型张量,在环境的evaluate()方法中计算并返回: "success": is_obj_placed & is_robot_static这确保了机器人不仅能将物体准确放置在目标位置&am…

用空闲时间做了一个小程序-二维码生成器

一直在摸鱼中赚钱的大家好呀~ 先向各位鱼友们汇报一下情况,目前小程序已经有900的鱼友注册使用过。虽然每天都有新的鱼友注册,但是鱼友增长的还很缓慢。自从国庆前的文字转语音的工具上线到现在已经将近有1个月没有更新小程序了。但是今天终终终终终于又…

31天Python入门——第14天:异常处理

你好,我是安然无虞。 文章目录 异常处理1. Python异常2. 异常捕获try-except语句捕获所有的异常信息获取异常对象finally块 3. raise语句4. 自定义异常5. 函数调用里面产生的异常补充练习 异常处理 1. Python异常 Python异常指的是在程序执行过程中发生的错误或异…

PyQt6实例_批量下载pdf工具_使用pyinstaller与installForge打包成exe文件

目录 前置: 步骤: step one 准备好已开发完毕的项目代码 step two 安装pyinstaller step three 执行pyinstaller pdfdownload.py,获取初始.spec文件 step four 修改.spec文件,将data文件夹加入到打包程序中 step five 增加…

Axure项目实战:智慧城市APP(完整交互汇总版)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧城市APP 主要内容:主功能(社保查询、医疗信息、公交查询等)、活动、消息、我的页面汇总 应用场景&#xff…

Appium Inspector使用教程

1.下载最新版本 https://github.com/appium/appium-inspector/releases 2.本地启动一个Appium服务 若Android SDK已安装Appium服务,则在任意terminal使用appium启动服务即可 3.Appium Inspector客户端配置连接到Appium服务 Configuring and Starting a Session…

Pycharm(七):几个简单案例

一.剪刀石头布 需求:和电脑玩剪刀石头布游戏 考察点:1.随机数;2.判断语句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.录入玩家手势 playerint(input(请输入手势:(1.剪刀 2.石头 3&…

Python Cookbook-4.13 获取字典的一个子集

任务 你有一个巨大的字典,字典中的一些键属于一个特定的集合,而你想创建一个包含这个键集合及其对应值的新字典。 解决方案 如果你不想改动原字典: def sub_dict(somedict,somekeys,default None):return dict([(k, somedict.get(k,default)) for k…

VMware Ubuntu 网络配置全攻略:从断网到畅通无阻

一、网络连接模式选择(先搞懂原理) VMware提供三种网络模式,就像手机的不同网络套餐: 模式适用场景特点类比NAT个人上网/新手首选虚拟机共享主机IP,能上网但隐身家用WiFi桥接服务器/需要被局域网访问虚拟机会获得独立…

链表(C++)

这是本人第二次学习链表,第一次学习链表是在大一上的C语言课上,首次接触,感到有些难;第二次是在大一下学习数据结构时(就是这次),使用C再次理解链表。同时,这也是开启数据结构学习写…

【SPP】蓝牙串口协议应用层深度解析:从连接建立到实战开发

目录 一、SPP应用层协议框架与角色模型 1.1 分层协议栈模型 1.2 设备角色模型(DevA 与 DevB 交互) 二、连接建立流程:从 SDP 到 RFCOMM 2.1 服务发现(SDP)流程(SDP 记录关键参数) 2.2 连接…

Giteki 认证:无线产品进入日本市场的关键保障

目录 适用产品认证范围 认证项目及技术要求 认证流程 认证周期 与其他认证的对比 常见问题 注意事项 Giteki 认证,其名称来源于日本语 “技適マーク”,罗马字拼写为 “GITEKI” ,在行业内也常被称为 Telec 认证、MIC 认证、RF 认证或技…