Python实现A股实时行情看板:Streamlit + AkShare + 新浪备用接口
说明本文项目仅用于 Python 编程学习、数据接口调用、Pandas 数据处理和 Streamlit 可视化练习不构成任何投资建议也不能作为股票买卖依据。项目中的实时行情、涨跌幅、换手率、量比和“信号参考”等内容均来自公开数据接口或程序规则计算。数据可能存在延迟、缺失、错误或接口暂时不可用等情况。股市有风险投资需谨慎。一、项目介绍这次分享的是一个使用 Python 和 Streamlit 开发的 A 股实时行情看板。用户可以在侧边栏输入多个股票代码例如000001,600519,300750程序会获取这些股票的实时行情并展示股票名称、最新价格、涨跌幅、涨跌额、成交量、成交额、最高价、最低价、今开、昨收、换手率、量比、市盈率、市净率等数据。项目还支持自动刷新。用户可以设置 15 秒到 120 秒的刷新间隔打开自动刷新后页面会按照设定的时间重新获取行情。为了提高稳定性程序默认使用 AkShare 提供的东方财富实时行情接口。当东方财富接口请求失败时会自动切换到新浪实时行情接口。二、项目主要功能1. 支持输入多个自选股代码多个代码使用英文逗号分隔例如000001,600519,300750程序会自动去除空格和小数点并兼容中文逗号。2. 获取 A 股实时行情程序首先调用 AkShare 的 stock_zh_a_spot_em 方法获取东方财富 A 股实时行情。为了减少偶发网络错误程序最多尝试请求三次每次失败后等待 1.5 秒。3. 新浪实时行情备用接口当东方财富接口连续失败时程序会自动请求新浪行情接口。上海股票代码会转换成 sh 开头的格式例如600519 转换为 sh600519深圳股票代码会转换成 sz 开头的格式例如000001 转换为 sz0000014. 自定义自动刷新时间用户可以通过滑块设置刷新间隔范围为 15 秒到 120 秒默认值为 30 秒。开启自动刷新后程序使用 streamlit-autorefresh 定时刷新页面。5. 展示单股实时指标程序会为每只自选股展示股票名称和代码、最新价格、涨跌幅、成交量、成交额以及简单信号参考。6. 展示实时行情表格实时行情表主要包括代码、名称、最新价、涨跌幅、涨跌额、成交量、成交额、振幅、最高价、最低价、今开、昨收、量比、换手率、动态市盈率、市净率和信号参考。7. 涨跌幅横向对比图项目使用 Plotly 绘制自选股涨跌幅横向柱状图并按照涨跌幅从低到高排序。三、项目使用的技术Streamlit构建网页界面包括侧边栏、输入框、滑块、自动刷新开关、指标卡片、表格和图表。AkShare获取东方财富 A 股实时行情数据。Requests直接请求新浪实时行情接口作为备用数据源。Pandas处理实时行情数据、筛选自选股、添加信号列和整理展示字段。Plotly Express绘制股票涨跌幅横向柱状图。streamlit-autorefresh控制 Streamlit 页面自动刷新。四、项目文件结构项目目录可以写成a_stock_realtime_dashboardrealtime_app.pyrequirements.txt其中 realtime_app.py 是项目主程序requirements.txt 用于保存依赖库。五、安装项目依赖建议先创建虚拟环境python -m venv venvWindows PowerShell 激活虚拟环境.\venv\Scripts\Activate.ps1Windows CMD 激活虚拟环境venv\Scripts\activate安装依赖pip install streamlit akshare pandas plotly requests streamlit-autorefresh也可以使用 requirements.txtpip install -r requirements.txt六、运行项目在 realtime_app.py 所在目录执行streamlit run realtime_app.py如果提示 streamlit 不是内部或外部命令可以使用python -m streamlit run realtime_app.py运行成功后浏览器通常会打开http://localhost:8501七、核心代码说明1. 设置不经过代理的行情域名程序将东方财富相关域名加入 NO_PROXY 和 no_proxy 环境变量减少代理或 VPN 对行情接口的影响。2. 处理用户输入的股票代码normalize_codes 函数会把中文逗号替换成英文逗号然后分割字符串并去除空格和小数点。3. 获取东方财富实时行情load_realtime_quotes 函数使用 AkShare 获取实时行情并设置 8 秒缓存。当接口失败时程序会记录异常并重试三次。4. 构造新浪股票代码以 6 或 9 开头的代码使用 sh 前缀其他代码使用 sz 前缀。这是适合学习演示的简化规则。5. 解析新浪实时行情程序通过 requests.get 请求新浪行情接口并设置 Referer 请求头。接口返回 GBK 编码数据因此需要设置 response.encoding gbk。程序从返回字段中解析股票名称、开盘价、昨收价、最新价、最高价、最低价、成交量和成交额并计算涨跌额和涨跌幅。新浪备用接口中未完整处理量比、换手率、市盈率和市净率因此这些字段会使用 0 或空值占位。6. 筛选自选股filter_watchlist 函数根据用户输入的股票代码筛选实时行情。如果用户没有输入代码程序默认展示行情数据中的前 30 只股票。7. 生成简单信号参考项目根据涨跌幅、换手率和量比进行粗略分类。涨跌幅大于等于 5%并且量比大于等于 2 时显示“短线过热”。涨跌幅大于等于 2%并且换手率大于等于 3% 时显示“活跃偏强”。涨跌幅小于等于负 5% 时显示“风险释放”。涨跌幅绝对值小于 1% 时显示“波动较小”。其他情况显示“正常波动”。这些标签仅用于演示条件判断不属于专业交易策略不能作为投资依据。8. 设置自动刷新用户可以在侧边栏控制是否自动刷新并设置刷新间隔。程序把秒数乘以 1000 转换成毫秒后传给自动刷新组件。9. 显示实时行情指标程序使用 st.columns 创建多列布局每行最多显示三只股票。10. 绘制涨跌幅对比图程序先按照涨跌幅升序排列数据然后使用 Plotly Express 绘制横向柱状图。八、常见问题1. 页面提示实时行情获取失败可以检查网络、代理或 VPN、AkShare 版本、接口是否暂时不可用以及股票代码格式是否正确。更新 AkSharepip install -U akshare2. 提示缺少 streamlit_autorefresh执行pip install streamlit-autorefresh3. 输入代码后没有数据显示确认多个代码使用英文逗号隔开例如000001,600519,3007504. 新浪数据模式下部分字段为 0 或空值这是因为备用接口主要解析价格、成交量和成交额等字段其他部分字段没有完整处理。5. 为什么最短刷新时间设置为 15 秒第三方公开接口不适合过于频繁地请求。刷新过快可能增加请求失败概率也可能给接口造成不必要的压力。6. 为什么不是逐笔成交数据本项目展示的是公开接口返回的实时或准实时行情不是交易所级别的逐笔成交数据不同接口可能存在延迟。九、可以继续优化的方向可以增加股票名称搜索、自选股本地保存、历史分时图、指数行情、数据导出、异常日志、涨跌颜色设置以及更完整的市场代码识别。十、项目完整代码import os import time import akshare as ak import pandas as pd import plotly.express as px import requests import streamlit as st from streamlit_autorefresh import st_autorefresh def bypass_proxy_for_market_data() - None: hosts [ eastmoney.com, push2his.eastmoney.com, push2.eastmoney.com, quote.eastmoney.com, ] existing os.environ.get(NO_PROXY) or os.environ.get(no_proxy) or current_hosts [item.strip() for item in existing.split(,) if item.strip()] for host in hosts: if host not in current_hosts: current_hosts.append(host) os.environ[NO_PROXY] ,.join(current_hosts) os.environ[no_proxy] ,.join(current_hosts) bypass_proxy_for_market_data() st.set_page_config(page_titleA股实时行情看板, layoutwide) def normalize_codes(raw_codes: str) - list[str]: codes [] for item in raw_codes.replace(, ,).split(,): code item.strip().replace( , ).replace(., ) if code: codes.append(code) return codes st.cache_data(ttl8) def load_realtime_quotes() - pd.DataFrame: last_error None for _ in range(3): try: return ak.stock_zh_a_spot_em() except Exception as error: last_error error time.sleep(1.5) raise RuntimeError(f实时行情接口连续失败{last_error}) def sina_symbol(code: str) - str: if code.startswith((6, 9)): return fsh{code} return fsz{code} st.cache_data(ttl15) def load_sina_realtime_quotes(codes: list[str]) - pd.DataFrame: rows [] symbols ,.join(sina_symbol(code) for code in codes) if not symbols: return pd.DataFrame() response requests.get( fhttps://hq.sinajs.cn/list{symbols}, headers{Referer: https://finance.sina.com.cn/}, timeout10, ) response.encoding gbk response.raise_for_status() for line in response.text.splitlines(): if not in line: continue raw_symbol line.split(var hq_str_, 1)[1].split(, 1)[0] code raw_symbol[2:] payload line.split(, 1)[1].rstrip(;) fields payload.split(,) if len(fields) 32 or not fields[0]: continue name fields[0] open_price float(fields[1] or 0) prev_close float(fields[2] or 0) latest_price float(fields[3] or 0) high float(fields[4] or 0) low float(fields[5] or 0) volume float(fields[8] or 0) amount float(fields[9] or 0) change latest_price - prev_close if prev_close else 0 pct_change change / prev_close * 100 if prev_close else 0 rows.append( { 代码: code, 名称: name, 最新价: latest_price, 涨跌幅: pct_change, 涨跌额: change, 成交量: volume, 成交额: amount, 振幅: (high - low) / prev_close * 100 if prev_close else 0, 最高: high, 最低: low, 今开: open_price, 昨收: prev_close, 量比: 0, 换手率: 0, 市盈率-动态: None, 市净率: None, } ) return pd.DataFrame(rows) def filter_watchlist(data: pd.DataFrame, codes: list[str]) - pd.DataFrame: if not codes: return data.head(30) return data[data[代码].astype(str).isin(codes)].copy() def make_realtime_signal(row: pd.Series) - str: pct_change row.get(涨跌幅, 0) turnover row.get(换手率, 0) volume_ratio row.get(量比, 0) if pct_change 5 and volume_ratio 2: return 短线过热 if pct_change 2 and turnover 3: return 活跃偏强 if pct_change -5: return 风险释放 if abs(pct_change) 1: return 波动较小 return 正常波动 st.title(A股实时行情看板) st.caption(数据来自 AkShare 东方财富实时行情接口适合学习和观察不构成投资建议。) with st.sidebar: st.header(实时设置) raw_codes st.text_area(自选股代码, value000001,600519,300750, help多个代码用英文逗号隔开) refresh_seconds st.slider(刷新间隔秒, min_value15, max_value120, value30, step5) auto_refresh st.toggle(自动刷新, valueTrue) if auto_refresh: st_autorefresh(intervalrefresh_seconds * 1000, keyrealtime_refresh) codes normalize_codes(raw_codes) try: try: realtime load_realtime_quotes() watchlist filter_watchlist(realtime, codes) data_mode 东方财富实时行情 except Exception as realtime_error: st.warning(f东方财富实时行情暂时获取失败正在尝试新浪实时行情{realtime_error}) watchlist load_sina_realtime_quotes(codes) data_mode 新浪实时行情 if watchlist.empty: st.warning(没有获取到真实行情数据。请检查网络、代理/VPN或稍后再试。) st.stop() watchlist watchlist.copy() watchlist[信号参考] watchlist.apply(make_realtime_signal, axis1) display_columns [ 代码, 名称, 最新价, 涨跌幅, 涨跌额, 成交量, 成交额, 振幅, 最高, 最低, 今开, 昨收, 量比, 换手率, 市盈率-动态, 市净率, 信号参考, ] display_columns [column for column in display_columns if column in watchlist.columns] latest_time pd.Timestamp.now().strftime(%Y-%m-%d %H:%M:%S) st.info(f数据模式{data_mode}。最近刷新时间{latest_time}当前展示 {len(watchlist)} 只股票。) st.subheader(单股实时指标) metric_columns st.columns(min(len(watchlist), 3)) for index, (_, stock) in enumerate(watchlist.iterrows()): column metric_columns[index % len(metric_columns)] with column: st.markdown(f**{stock[名称]}{stock[代码]}**) st.metric(最新价, f{stock[最新价]:.2f}, f{stock[涨跌幅]:.2f}%) st.write(f信号参考{stock[信号参考]}) st.caption(f成交量{stock[成交量]:.0f} | 成交额{stock[成交额]:.0f}) st.subheader(实时行情表) st.dataframe(watchlist[display_columns], use_container_widthTrue, height360) st.subheader(涨跌幅对比) chart_data watchlist.sort_values(涨跌幅, ascendingTrue) fig px.bar( chart_data, x涨跌幅, y名称, color涨跌幅, color_continuous_scale[#16a34a, #e5e7eb, #dc2626], orientationh, height420, ) fig.update_layout(margindict(l20, r20, t20, b20)) st.plotly_chart(fig, use_container_widthTrue) st.subheader(信号说明) st.write( 这个实时信号只根据涨跌幅、换手率、量比做粗略分类。 它适合提醒你继续观察不适合作为买卖依据。 ) except Exception as error: st.error(f实时行情获取失败{error})十一、项目总结通过这个项目可以练习 Python 调用公开行情接口、AkShare 实时数据获取、Requests 请求解析、Pandas 表格处理、Streamlit 网页开发、页面自动刷新、Plotly 图表绘制、主备数据源切换和网络异常处理。这个项目代码量不大适合作为 Python 数据分析、Streamlit 和金融数据接口的入门练习。十二、免责声明本文和项目代码仅供 Python 编程学习、课程实践和技术交流使用。

相关新闻

GitLab DevOps平台实战指南:从基础操作到企业级应用

GitLab DevOps平台实战指南:从基础操作到企业级应用

1. GitLab核心定位与核心价值解析作为从业近十年的DevOps工程师,我见证过从SVN到Git再到GitLab的技术演进历程。GitLab绝不仅仅是个代码仓库,而是一套完整的DevOps生命周期管理平台。与GitHub这类纯代码托管平台不同,GitLab原生集成了CI/CD流…

2026/8/3 7:59:35阅读更多 →
2026低代码平台市场趋势与选型指南

2026低代码平台市场趋势与选型指南

1. 2026年低代码平台市场全景扫描低代码开发平台正在经历前所未有的爆发期。根据最新行业数据显示,到2026年全球低代码市场规模预计突破300亿美元,年复合增长率保持在25%以上。这个曾经被视作"简易版开发工具"的领域,如今已经进化成…

2026/8/3 7:57:35阅读更多 →
SpringBoot+Vue构建高并发在线订餐系统实战

SpringBoot+Vue构建高并发在线订餐系统实战

1. 项目概述:在线餐饮订餐与商家管理平台这个基于SpringBootVue的网上订餐系统,本质上是一个连接消费者、商家和配送员的B2C电商平台。我在实际开发中发现,这类系统最核心的价值在于解决了传统电话订餐的三大痛点:订单易出错、高峰…

2026/8/3 7:57:35阅读更多 →
从《超星神》水瓶赛沙吃瘪看战斗系统设计与角色成长逻辑

从《超星神》水瓶赛沙吃瘪看战斗系统设计与角色成长逻辑

最近在整理特摄剧《超星神》的经典战斗场面时,发现很多朋友对“水瓶赛沙吃瘪”这个桥段印象深刻,但讨论往往停留在“好惨”、“又被揍了”的层面。作为一部融合了星座神话与机甲战斗的作品,其战斗设计、角色能力平衡以及剧情推进的“吃瘪”逻…

2026/8/3 9:06:26阅读更多 →
三相电机核心参数测量指南:相电阻、电感与极对数的实用方法

三相电机核心参数测量指南:相电阻、电感与极对数的实用方法

1. 项目概述:从三个关键参数看透一台电机 干了这么多年电机驱动和维修,我越来越觉得,想真正“驯服”一台三相交流电机,不管是做矢量控制、直接转矩控制,还是简单的V/F变频,光知道铭牌数据是远远不够的。铭牌…

2026/8/3 9:06:26阅读更多 →
C# 学习总结:从泛型与集合到IO、多线程

C# 学习总结:从泛型与集合到IO、多线程

摘要:本文是 C# 进阶学习笔记,梳理了这几天学习的泛型、集合、异常处理、IO 流与多线程五大知识模块。文章从「类型复用与安全」「数据组织与存储」「错误处理」「数据持久化」「并发执行」五个方向出发,结合老师布置的作业案例和实际踩过的坑…

2026/8/3 9:06:26阅读更多 →
Azure Sphere与Grove套件:快速构建安全物联网原型

Azure Sphere与Grove套件:快速构建安全物联网原型

1. 项目概述:当Grove遇见Azure Sphere如果你手头正好有一块Azure Sphere MT3620开发板,看着它强大的安全特性和云端连接能力,却苦于不知道从哪里开始动手,或者觉得连接各种传感器、执行器太麻烦,那么今天聊的这个“Gro…

2026/8/3 9:06:26阅读更多 →
MSK调制解调技术原理与Matlab仿真实现

MSK调制解调技术原理与Matlab仿真实现

1. MSK调制解调技术基础解析MSK(Minimum Shift Keying)是一种高效的连续相位频移键控调制技术,本质上属于FSK的特殊形式。其核心特征是通过保持相位连续性和最小频偏(0.5倍符号速率)来实现频谱效率最大化。在无线通信系…

2026/8/3 9:06:26阅读更多 →
最好用的AI数据大屏生成工具推荐免费开源与付费版对比分析

最好用的AI数据大屏生成工具推荐免费开源与付费版对比分析

在做数据大屏这件事上,我算是个“反复折腾”的用户。最早用Excel硬凑,后来用过开源方案,再后来试过各种免费和付费的SaaS工具,可以说市面上主流的工具我基本都摸过一遍。 今天这篇,我想从“免费开源”和“付费商用”这…

2026/8/3 9:04:26阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/3 2:32:59阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/3 2:33:01阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/3 2:33:04阅读更多 →