Python查询成交量

server/2025/2/12 9:06:02/
#!/usr/bin/env python
# encoding: utf-8
'''
@author: yfh
@file: increaseVolumeModularSecond.py
@time: 2025/2/11 20:23
'''import baostock as bs
import pandas as pd
from datetime import datetime, timedelta# 登录baostock系统
def login_baostock():lg = bs.login()if lg.error_code != '0':print("登录失败:", lg.error_msg)exit()return lg# 获取最近一个交易日
def get_last_trade_date():today = datetime.now().strftime("%Y-%m-%d")trade_dates = bs.query_trade_dates(start_date=today, end_date=today).get_data()if trade_dates.empty or trade_dates.iloc[0]['is_trading_day'] == '0':# 如果当天不是交易日,向前推算last_trade_date = bs.query_trade_dates(start_date=(datetime.now() - timedelta(days=10)).strftime("%Y-%m-%d"),end_date=today).get_data()last_trade_date = last_trade_date[last_trade_date['is_trading_day'] == '1'].iloc[-1]['calendar_date']else:last_trade_date = todayreturn last_trade_date# 获取当前日期的前一个交易日
def get_last_trade_date_yesterday():# 获取昨天的日期yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')trade_dates = bs.query_trade_dates(start_date=yesterday, end_date=yesterday).get_data()if trade_dates.empty or trade_dates.iloc[0]['is_trading_day'] == '0':# 如果当天不是交易日,向前推算last_trade_date = bs.query_trade_dates(start_date=(datetime.now() - timedelta(days=10)).strftime("%Y-%m-%d"),end_date=yesterday).get_data()last_trade_date = last_trade_date[last_trade_date['is_trading_day'] == '1'].iloc[-1]['calendar_date']else:last_trade_date = yesterdayreturn last_trade_date# 获取所有A股股票代码
# def get_all_stock_codes(last_trade_date):
#     rs = bs.query_all_stock(day=last_trade_date)  # 使用最近一个交易日获取股票列表
#     stock_list = []
#     while (rs.error_code == '0') & rs.next():
#         stock_code = rs.get_row_data()[0]  # 股票代码格式如:sh.600000
#         stock_list.append(stock_code)
#     return stock_list# 获取所有A股股票代码(剔除指数代码)
def get_all_stock_codes(last_trade_date):rs = bs.query_all_stock(day=last_trade_date)  # 使用最近一个交易日获取股票列表stock_list = []while (rs.error_code == '0') & rs.next():stock_code = rs.get_row_data()[0]  # 股票代码格式如:sh.600000# 剔除指数代码(指数代码通常以 sh.000 或 sz.399 开头)if not (stock_code.startswith("sh.000") or stock_code.startswith("sz.399")):stock_list.append(stock_code)return stock_list# 获取股票名称
def get_stock_name(stock_code):stock_info = bs.query_stock_basic(code=stock_code).get_data()if stock_info.empty:return Noneif 'code_name' in stock_info.columns:  # baostock返回的字段可能是code_namereturn stock_info.iloc[0]['code_name']elif 'stock_name' in stock_info.columns:  # 也可能是stock_namereturn stock_info.iloc[0]['stock_name']return None# 剔除不符合条件的股票(北交所、科创板、ST股票)
def filter_stock(stock_code):# 剔除北交所股票(代码以 bj. 开头)if stock_code.startswith("bj."):return False# 剔除科创板股票(代码以 sh.688 开头)if stock_code.startswith("sh.688"):return False# 获取股票名称并剔除ST股票stock_name = get_stock_name(stock_code)if stock_name is None:return Falseif "ST" in stock_name or "*ST" in stock_name:return Falsereturn True# rs = bs.query_history_k_data_plus("sh.600000",
#     "date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
#     start_date='2025-02-10',
#     end_date='2025-02-10',
#     frequency="d",
#     adjustflag="3")# 计算成交量放大倍数
def calculate_volume_multiple(stock_code, target_date):# print(f"calculate_volume_multiple ====== stock_code is {stock_code}")# 查询目标日期的成交量k_data = bs.query_history_k_data_plus(code=stock_code,fields="date,volume",start_date=target_date,end_date=target_date,frequency="d",adjustflag="3").get_data()# print(f"calculate_volume_multiple ====== k_data is {k_data}")# 检查是否有数据,以及成交量是否为空if k_data.empty or k_data.iloc[0]['volume'] == '':return None  # 跳过无数据或停牌的股票current_volume = float(k_data.iloc[0]['volume'])current_date = k_data.iloc[0]['date']# 获取前5个交易日的平均成交量# 计算前5个交易日的起始日期(需手动调整,避免非交易日)start_date = (datetime.strptime(current_date, "%Y-%m-%d") - timedelta(days=10)).strftime("%Y-%m-%d")# print(f"calculate_volume_multiple ====== start_date is {start_date}")df_history = bs.query_history_k_data_plus(code=stock_code,fields="date,volume",start_date=start_date,end_date=current_date,frequency="d",adjustflag="3").get_data()# print(f"calculate_volume_multiple ====== df_history is {df_history}")# 过滤掉空值数据df_history = df_history[df_history['volume'] != '']# 取前5日(排除目标日期自身)# df_history = df_history[df_history['date'] < current_date]df_history = df_history[df_history['date'] <= current_date]if len(df_history) < 5:return None  # 忽略上市不足4日的新股# 计算前5日平均成交量avg_volume = df_history.tail(5)['volume'].astype(float).mean()# print(f"calculate_volume_multiple ====== avg_volume is {avg_volume}")# 计算成交量放大倍数if avg_volume == 0:return None  # 避免除以零volume_multiple = current_volume / avg_volume# 获取股票名称stock_name = get_stock_name(stock_code)if stock_name is None:return Nonereturn {"股票代码": stock_code,"股票名称": stock_name,"日期": current_date,"当日成交量": current_volume,"前5日平均成交量": avg_volume,"成交量倍数": round(volume_multiple, 2)}# 主函数
def main():# 登录baostocklogin_baostock()# 获取最近一个交易日last_trade_date = get_last_trade_date()print(f"last_trade_date is {last_trade_date}")target_dates = [last_trade_date]# 获取所有A股股票代码stock_list = get_all_stock_codes(last_trade_date)# 筛选符合条件的股票result = []for code in stock_list:if not filter_stock(code):continuefor date in target_dates:volume_data = calculate_volume_multiple(code, date)if volume_data and volume_data['成交量倍数'] >= 3:result.append(volume_data)# 将结果转换为DataFrame并排序if result:df_result = pd.DataFrame(result)df_result = df_result.sort_values(by="成交量倍数", ascending=False)  # 按成交量倍数倒序排序# 输出到Excel文件local_path = "E:/increaseVolume"output_file = f"{local_path}/成交量放大股票_{last_trade_date}.xlsx"df_result.to_excel(output_file, index=False)print(f"结果已保存到文件: {output_file}")else:print("未找到符合条件的股票。")# 登出系统bs.logout()def main2():# 登录baostocklogin_baostock()# yesterday = get_last_trade_date_yesterday()yesterday = "2025-02-06"print(f"yesterday trade date is {yesterday}")trade_dates = [yesterday]# 获取所有A股股票代码stock_list = get_all_stock_codes(yesterday)# 使用切片来获取前十条元素# 注意:如果列表长度小于10,这会返回整个列表first_ten = stock_list[:30]print(first_ten)result = []for code in first_ten:if not filter_stock(code):continuefor date in trade_dates:volume_data = calculate_volume_multiple(code, date)print(volume_data)# if volume_data and volume_data['成交量倍数'] >= 3:#     result.append(volume_data)# 登出系统bs.logout()# 程序入口
if __name__ == "__main__":main()

http://www.ppmy.cn/server/167012.html

相关文章

京东商品评论数据采集并可视化

2 DrissionPage 在网页自动化操作场景中,使用 DrissionPage 实现一次登录后可在后续操作中复用登录状态,具有显著优势,下面详细介绍相关好处: 1. 节省时间与资源 减少登录操作时间:很多网站的登录流程可能涉及验证码输入、短信验证等步骤,这些操作不仅繁琐,还会消耗大…

如何借鉴GitHub开源项目进行LabVIEW开发

在设备开发过程中&#xff0c;许多开发者选择借鉴GitHub等平台上的开源项目&#xff0c;特别是当目标程序没有LabVIEW版本时。比如&#xff0c;在本例中&#xff0c;我们看到一个开源的Micro-Manager项目&#xff0c;它主要使用Java、C、Python等编程语言。对于LabVIEW开发者来…

【蓝桥杯嵌入式】2_LED

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 74HC573是八位锁存器&#xff0c;当控制端LE脚为高电平时&#xff0c;芯片“导通”&#xff0c;LE为低电平时芯片“截止”即将输出状态“锁存”…

游戏引擎学习第94天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾上周的渲染器工作 完成一款游戏的开发&#xff0c;完全不依赖任何库和引擎&#xff0c;这样我们能够全面掌握游戏的开发过程&#xff0c;确保没有任何细节被隐藏。我们将深入探索每一个环节&#xff0c;犹如拿着手电筒翻看床…

尚硅谷课程【笔记】——大数据之Zookeeper【一】

课程视频&#xff1a;【尚硅谷Zookeeper教程】 一、Zookeeper入门 概述 Zookeeper是一个开源的分布式的&#xff0c;为分布式应用提供协调服务的Apache项目。 Zookeeper从设计模式角度理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储…

攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图

引言 当我决定考取AWS认证机器学习工程师 - 助理(AWS Certified Machine Learning Engineer — Associate)级别证书时,我就预料到这将是一段充满挑战但回报颇丰的旅程。跟你说吧,它在这两方面都没让我失望。这项考试面向的是不仅理解机器学习原理,还对AWS生态系统有扎实基…

jvm 线程监控调试

文章目录 前言一、使用JDK工具转储线程文件(如jstack)1. 找到Java进程的PID:2. 使用jstack生成线程转储文件:3.验证生成的线程转储文件:二、分析文件1.使用在线工具进行分析上传thread-dump文件,等待解析完成2.查看分析结果总结前言 提示:使用jdk自带工具转储线程监控文…

三十三、网络及多线程

三十三、网络及多线程 以下界面设计基本全用ui文件设计 33.1 Qt网络编程 Qt 直接提供网络编程模块,基于TCP/IP 客户端和服务器相关各 种类&#xff61;TCP 通信(QTcpSocket/QTcpServer )&#xff61;UDP 通信 (QUdpSocket)&#xff61;还有部分实现HTTP&#xff64;FTP 等网络…