python代码绘制某只股票最近90天的K线图、均线、量能图

运行代码,要求输入股票代码和名称,其他参数可省略

import akshare as ak
import matplotlib.pyplot as plt
import pandas as pd
import mplfinance as mpf
import matplotlib.dates as mdates
import numpy as np
import os
from datetime import datetime, timedelta# 设置中文字体
plt.rcParams["font.family"] = ["SimHei",  "Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def get_stock_data(stock_code, start_date=None, end_date=None, adjust="qfq"):"""使用 AkShare 获取股票数据参数:stock_code (str): 股票代码,如 'sh000001' 或 '000001.SZ'start_date (str): 开始日期,格式 'YYYYMMDD',默认为 3 个月前end_date (str): 结束日期,格式 'YYYYMMDD',默认为今天adjust (str): 复权类型,'qfq' 为前复权,'hfq' 为后复权,None 为不复权返回:DataFrame: 包含股票数据的 DataFrame"""# 处理默认日期if end_date is None:end_date = datetime.now().strftime('%Y%m%d')if start_date is None:start_date = (datetime.now() - timedelta(days=90)).strftime('%Y%m%d')# 格式化股票代码以适应 AkShareif not stock_code.startswith(('sh', 'sz')):market = 'sh' if stock_code.startswith(('6', '9')) else 'sz'stock_code = f'{market}{stock_code}'try:# 使用 AkShare 获取股票日线数据stock_data = ak.stock_zh_a_hist_tx(symbol=stock_code, start_date=start_date, end_date=end_date, adjust=adjust)# 重命名列以符合 mplfinance 要求# 检查并映射成交量列名volume_columns = ['成交量', '成交额', 'volume','amount']volume_col = next((col for col in volume_columns if col in stock_data.columns), None)if volume_col is None:print("警告: 数据中未找到成交量列,图表可能不完整")stock_data['volume'] = 0  # 添加默认成交量列else:stock_data = stock_data.rename(columns={volume_col: 'volume'})# 重命名其他必要列stock_data = stock_data.rename(columns={'日期': 'date', '开盘': 'open', '收盘': 'close', '最高': 'high', '最低': 'low'})# 转换日期格式stock_data['date'] = pd.to_datetime(stock_data['date'])# 确保数据按日期排序stock_data = stock_data.sort_values('date')# 检查是否有必要的列required_columns = ['date', 'open', 'high', 'low', 'close', 'volume']missing_columns = [col for col in required_columns if col not in stock_data.columns]if missing_columns:print(f"错误: 数据缺少必要的列: {', '.join(missing_columns)}")return Nonereturn stock_dataexcept Exception as e:print(f"获取股票数据时出错: {e}")return Nonedef plot_stock_daily_movement(stock_data, stock_name="股票", save_path=None, ma_periods=None):"""绘制股票日变动情况,包括 K 线图和成交量及均线参数:stock_data (DataFrame): 包含股票数据的 DataFrame,必须包含 'date', 'open', 'high', 'low', 'close', 'volume' 列stock_name (str): 股票名称,用于图表标题save_path (str): 图表保存路径,默认为 None 不保存ma_periods (list): 均线周期列表,默认为 [5, 10, 20]"""if stock_data is None or stock_data.empty:print("没有数据可绘制图表")return# 设置默认均线周期if ma_periods is None:ma_periods = [5, 10, 20]# 复制数据并准备 mplfinance 所需格式plot_data = stock_data.copy()plot_data = plot_data.set_index('date')# 添加均线for period in ma_periods:column_name = f'MA{period}'plot_data[column_name] = plot_data['close'].rolling(window=period).mean()# 设置 mplfinance 样式mc = mpf.make_marketcolors(up='r', down='g', inherit=True)# 自定义均线颜色ma_colors = ['blue', 'purple', 'orange', 'green', 'red', 'brown', 'gray']ma_colors = ma_colors[:len(ma_periods)]  # 确保颜色数量与均线周期数量匹配s = mpf.make_mpf_style(marketcolors=mc, gridstyle='--', y_on_right=False,rc={'font.family': ['SimHei', 'WenQuanYi Micro Hei', 'Heiti TC', 'Microsoft YaHei'],'lines.linewidth': 1.5  # 增加均线线条宽度})# 绘制 K 线图和成交量fig, axes = mpf.plot(plot_data,type='candle',style=s,title=f'{stock_name} 日变动情况',ylabel='价格 (元)',volume=True,ylabel_lower='成交量 (手)',mav=tuple(ma_periods),  # 传递均线周期returnfig=True,figsize=(14, 10),update_width_config=dict(candle_linewidth=1.2,  # K线实体边框宽度candle_width=0.6,      # K线宽度volume_width=0.8,      # 成交量柱宽度))# 调整标题位置fig.suptitle(f'{stock_name} 日变动情况', fontsize=16, y=0.98)# 添加均线图例ax = axes[0]  # K线图的轴for i, period in enumerate(ma_periods):ax.plot([], [], color=ma_colors[i], label=f'MA{period}', linewidth=1.5)ax.legend(loc='upper left')# 如果指定了保存路径,则保存图表if save_path:save_dir = os.path.dirname(save_path)if not os.path.exists(save_dir):os.makedirs(save_dir)plt.savefig(save_path, dpi=300, bbox_inches='tight')print(f"图表已保存至: {save_path}")plt.show()# 主函数
if __name__ == "__main__":# 用户输入股票代码和名称stock_code = input("请输入股票代码(例如 000001 或 sh000001): ").strip()stock_name = input("请输入股票名称(例如 平安银行): ").strip()# 获取股票数据print("正在获取股票数据...")stock_data = get_stock_data(stock_code)if stock_data is not None and not stock_data.empty:print(f"成功获取 {len(stock_data)} 天的股票数据")# 显示数据列名,用于调试print(f"数据列名: {', '.join(stock_data.columns)}")# 可选:自定义均线周期ma_input = input("请输入均线周期(用逗号分隔,默认 5,10,20): ").strip()if ma_input:try:ma_periods = [int(p.strip()) for p in ma_input.split(',')]except ValueError:print("无效的均线周期,使用默认值")ma_periods = [5, 10, 20]else:ma_periods = [5, 10, 20]# 绘制股票日变动情况plot_stock_daily_movement(stock_data, stock_name, ma_periods=ma_periods)else:print("未能获取股票数据,请检查股票代码是否正确")    

在这里插入图片描述

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

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

相关文章

Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用

一、FPGA 在线升级 FPGA 在线升级FLASH时,一般是通过逻辑生成SPI接口操作FLASH,当然也可以通过其他SOC经FPGA操作FLASH,那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA,只有CCLK是专用引脚,SPI接口均为普…

Azure 应用服务中的异常处理、日志记录和通知:综合指南

简介 Azure 应用服务是基于云的应用程序,使开发人员能够在云上构建、部署和管理应用程序。与任何应用程序一样,制定适当的异常处理、日志记录和通知实践至关重要,以确保应用程序平稳运行,并快速识别和解决任何问题。在本篇博文中&…

Java 应用如何实现 HTTPS:加密数据传输的实用指南

Java 应用如何实现 HTTPS:加密数据传输的实用指南 在当今的互联网环境中,数据安全至关重要,HTTPS 作为加密的数据传输协议,为 Java 应用提供了安全通信的保障。本文将深入探讨 Java 应用如何实现 HTTPS,通过详细代码实…

域名与DNS详解

域名与DNS详解 一、核心概念 域名(Domain Name) 定义:人类可读的网络地址标识(如 www.google.com)作用:替代复杂IP地址(类似"手机通讯录"功能) DNS(Domain …

c++20引入的三路比较操作符<=>

目录 一、简介 二、三向比较的返回类型 2.1 std::strong_ordering 2.2 std::weak_ordering 2.3 std::partial_ordering 三、对基础类型的支持 四、自动生成的比较运算符函数 4.1 std::rel_ops的作用 4.2 使用<> 五、兼容他旧代码 一、简介 c20引入了三路比较操…

计算机网络相关面试题

一、HTTP1.1和HTTP2的区别 HTTP/1&#xff08;主要指 HTTP/1.1&#xff09;和 HTTP/2 是 Web 协议发展中的两个重要版本&#xff0c;二者在性能、协议机制和功能特性上有显著差异。以下从多个维度对比分析&#xff0c;并结合具体案例说明&#xff1a; 一、连接与请求处理方式 1…

图论算法精解(Java 实现):从基础到高频面试题

一、图的基础表示方法 1.1 邻接矩阵&#xff08;Adjacency Matrix&#xff09; 邻接矩阵是表示图的一种直观方式&#xff0c;它使用一个二维数组来存储节点之间的连接关系。对于一个有 n 个节点的图&#xff0c;邻接矩阵是一个 nn 的矩阵&#xff0c;其中 matrix [i][j] 表示…

江科大TIM定时器hal库实现

定时器相关hal库函数 hal库的定时器函数相比于标准库&#xff0c;多了很多的中断回调函数&#xff0c;同时对于定时器的初始化也改成使用句柄一次性顺带连带DMA等功能一起初始化了 typedef struct {uint32_t Prescaler; /*定时器的预分频值*/uint32_t CounterMode; …

CentOS 10:启动telnet服务

参考&#xff0c; 鳥哥私房菜 - 第七章、網路安全與主機基本防護&#xff1a;限制埠口, 網路升級與 SELinux 7.3.3 埠口与服务的启动/关闭及开机时状态设定 我们知道系统的 Telnet 服务通常是以 super daemon 来控管的&#xff0c;请您启动您系统的 telnet 试看看。 1 要启动 …

Taro 安全区域

目录 一、问题描述 二、问题解决 1、顶部刘海区 2、底部小黑条 一、问题描述 安全区域主要是为了避免刘海屏或底部栏遮挡&#xff0c;而造成的不良显示效果。 本次将针对以下两点进行考量&#xff1a; 1、顶部刘海屏区 2、苹果X底部小黑条 二、问题解决 通过Taro.getS…

【Java微服务组件】分布式协调P1-数据共享中心简单设计与实现

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 目录 引言设计一个共享数据中心选择数据模型键值对设计 数据可靠性设计持久化快照 &#xff08…

在SpringBoot项目中,使用单元测试@Test

1.引入依赖 <!--单元测试Test的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>3.2.1</version> </dependency> 2.在src/test/java目录…

在Java中,将Object对象转换为具体实体类对象

在Java中&#xff0c;将Object对象转换为具体实体类对象可以通过以下几种方法实现&#xff1a; 1‌.使用instanceof关键字进行类型检查和转换‌&#xff1a; 首先&#xff0c;使用instanceof关键字检查Object对象是否为目标实体类的类型。 如果是&#xff0c;则进行强制类型…

JAVA学习-练习试用Java实现“音频文件的读取与写入 :使用Java音频库处理音频数据”

问题&#xff1a; java语言编辑&#xff0c;实现音频文件的读取与写入 &#xff1a;使用Java音频库处理音频数据。 解答思路&#xff1a; 在Java中处理音频文件通常需要使用第三方库&#xff0c;例如javax.sound.sampled包&#xff0c;它提供了处理音频文件的基本功能。以下是一…

Flink架构概览,Flink DataStream API 的使用,FlinkCDC的使用

一、Flink与其他组件的协同 Flink 是一个分布式、高性能、始终可用、准确一次&#xff08;Exactly-Once&#xff09;语义的流处理引擎&#xff0c;广泛应用于大数据实时处理场景中。它与 Hadoop 生态系统中的组件可以深度集成&#xff0c;形成完整的大数据处理链路。下面我们从…

linux 查看java的安装路径

一、验证Java安装状态 java -version正常安装会显示版本信息&#xff1a; openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)二、检查环境变量配置 若已配置JAVA_HOME&#…

2025-5-21 个人笔记篇matlab小笔记和clang基础使用(简单记录)

个人笔记篇 再不记录就找不到了&#xff0c;之前学的一点基础&#xff0c;看看就行,请不要提问,因为很久了>_<(至少我看来是这样的) matlab小笔记 % 开绘制(新建) figure % 设置绘制标题 title(标题); % 设置绘制的X轴Lable xlabel(x); % 设置绘制的y轴Lable ylabel(cos…

前端JavaScript-嵌套事件

点击 如果在多层嵌套中&#xff0c;对每层都设置事件监视器&#xff0c;试试看 <!DOCTYPE html> <html lang"cn"> <body><div id"container"><button>点我&#xff01;</button></div><pre id"output…

网感驱动下开源AI大模型AI智能名片S2B2C商城小程序源码的实践路径研究

摘要&#xff1a;在数字化浪潮中&#xff0c;网感已成为内容创作者与商业运营者必备的核心能力。本文以开源AI大模型、AI智能名片及S2B2C商城小程序源码为技术载体&#xff0c;通过解析网感培养与用户需求洞察的内在关联&#xff0c;提出"数据驱动-场景适配-价值重构"…

AG-UI:重构AI代理与前端交互的下一代协议标准

目录 技术演进背景与核心价值协议架构与技术原理深度解析核心功能与标准化事件体系典型应用场景与实战案例开发者生态与集成指南行业影响与未来展望1. 技术演进背景与核心价值 1.1 AI交互的三大痛点 当前AI应用生态面临三大核心挑战: 交互碎片化:LangGraph、CrewAI等框架各…