通过 Python 爬虫提高股票选股胜率

此贴为Python爬虫技术学习贴

在股票中,即便有了选股规则,从5000多只股票中筛选出符合规则的股票也是十分困难的,于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票

实现方案

1、指定两套规则,第一套弱约束,第二套强约束

2、每天3点收盘后,使用弱约束条件,筛一次全量的GP池,筛出的GP作为第二天的GP筛选池使用

3、集合竞价结束,9点25分,使用强约束,从前一天收盘后选出的GP池中进一步筛选,选出当日股票(通过不断优化强弱约束条件,此时选出的GP拥有高胜率)

我的约束(自己研究的规则,因人而异)

弱约束:收盘后,整体趋势向上,筹码集中度高

强约束:当天竞价完成后,竞价强势,交易量大,竞价涨跌幅大,等规则

爬虫实现

用到的是python中的akshare,ak中有很多数据接口,调用出来很方便,作为ak的补充,如果有些功能ak不具备,就需要手写请求,从东财、新浪财经等这些网站上抓取数据,手写请求一般会用到selenium,模拟通过浏览器访问(因为数据在这些网站上都是动态的,无法直接通过request请求到数据,使用selenium更方便)

运行环境

Python 3.10requests~=2.32.3
akshare~=1.15.83
pandas~=2.2.3
selenium~=4.28.1
bs4~=0.0.2
beautifulsoup4~=4.12.3
APScheduler~=3.11.0

实现代码(部分)

1、通过selenium配置浏览器

# 设置 Chrome 配置
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无头模式,不打开浏览器窗口
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")# 启动 Chrome 浏览器
service = Service(CHROME_DRIVER_URL)  # 替换为 chromedriver 的路径
driver = webdriver.Chrome(service=service, options=chrome_options)

2、获取筹码集中度

# 取90%筹码集中度
def get_ChouMa_Jizhongdu(driver, code):url = 'https://quote.eastmoney.com/concept/' + exchange_detector(code) + code + '.html#chart-k-cyq'# 打开网页driver.get(url)# 获取整个页面的文本try:# 获取分钟竞价情况app_element = driver.find_element(By.ID, 'app')maincharts_ele = app_element.find_element(By.CLASS_NAME, 'maincharts').textmatch = re.search(r'90%成本:.*?集中度:\s*(\d+\.\d+)%', maincharts_ele, re.DOTALL)if match:concentration_value = match.group(1)return float(concentration_value)else:return -1except Exception as e:print(f"发生错误: {e}")return -1

3、获取某只GP所在行业

def get_hangye(code):try:# test = ak.stock_individual_info_em(symbol=code)hy = ak.stock_individual_info_em(symbol=code).value[6]return hyexcept Exception as e:print(f"发生错误: {e}")return "未获取"

4、获取均线,用于判断整体走势

def get_today_ma(stock_code="000001", ma_periods=[5, 10, 20, 60]):"""获取股票当日均线价格:param stock_code: 股票代码(默认示例代码为平安银行 "000001"):param ma_periods: 均线周期列表(默认计算 5、10、20、60 日均线):return: 当日均线值的字典(若当日无数据,返回前一个交易日均线)"""# 获取股票历史行情数据(调整为最近 120 个交易日,确保足够计算长期均线)df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", adjust="qfq", timeout=(5, 10)).iloc[-120:]# 检查数据是否为空if df.empty:raise ValueError("未获取到股票数据,请检查代码或网络连接")# 计算均线for period in ma_periods:df[f'MA{period}'] = df['收盘'].rolling(window=period).mean()# 获取最新数据(当日或最近交易日)latest_data = df.iloc[-1]# 提取均线值ma_values = {f'MA{period}': round(latest_data[f'MA{period}'], 2)for period in ma_periods}return ma_values

5、获取某只GP今日开盘、昨日收盘情况

def get_today_open_and_yesterday_close(stock_code="000001"):"""获取股票今日开盘价和昨日收盘价:param stock_code: 股票代码(默认示例代码为平安银行 "000001"):return: 今日开盘价和昨日收盘价的字典"""# 获取历史行情数据(最近两个交易日)hist_data = ak.stock_zh_a_hist(symbol=stock_code, period="daily", adjust="qfq", timeout=(5, 10)).iloc[-2:]# 检查历史数据是否为空if hist_data.empty:raise ValueError(f"未找到股票代码为 {stock_code} 的历史数据")# 获取昨日收盘价yesterday_close = hist_data.iloc[0]["收盘"]today_open = hist_data.iloc[1]["开盘"]ratio = hist_data.iloc[1]["涨跌幅"]today_close = hist_data.iloc[1]["收盘"]return {"今开": today_open,"昨收": yesterday_close,"涨跌幅": ratio,"今收": today_close}

6、获取实时委差

def get_weicha(code, driver):symbol = codeurl = f'https://finance.sina.com.cn/realstock/company/{exchange_detector(symbol)}{symbol}/nc.shtml'# 打开网页driver.get(url)# 获取整个页面的文本try:# 获取竞价情况tabfive_element = driver.find_element(By.ID, 'fiveAmt')value = tabfive_element.textreturn int(value)except Exception as e:print(f"发生错误: {e}")return -1

7、获取9:25分的竞价量能

def get_ln(code, driver, today_date):symbol = codeurl = 'https://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradedetail.php?symbol=' + exchange_detector(symbol) + symbol + '&date=' + today_date + '&page=' + str(get_page_num(symbol, today_date))# 打开网页driver.get(url)# 获取整个页面的文本try:# 获取竞价情况tbody_element = driver.find_element(By.CLASS_NAME, 'dataOuter').find_element(By.TAG_NAME, 'tbody')last_tr = tbody_element.find_elements(By.TAG_NAME, 'tr')[-1].get_attribute('innerHTML')print(last_tr)# 使用字符串的split方法分割数据parts = last_tr.split("<td>")# 获取第5个<td>中的数据(索引为4,因为索引从0开始)value = parts[4].split("</td>")[0]return int(value)except Exception as e:print(f"发生错误: {e}")return -1

8、获取实时GP涨跌幅排序

def get_page(url):try:response = requests.get(url)return response.textexcept requests.ConnectionError as e:print('', e.args)# 获取股票代码、名称、PE,最高价,最小价,市净率,市盈率
def get_stock_data(text):# .* ?"f9": (?P < pe >.+?) 匹配市盈率  .*?"f23":(?P<pb>.+?) 匹配市净率 ,注意需要按照f1,f2...这样的顺序com = re.compile('"f2":(?P<end>.+?),.*?"f6":(?P<volume>.+?),.*?"f9":(?P<pe>.+?),.*?"f12":(?P<number>.+?),.*?"f14":(?P<name>.+?)'',.*?"f15":(?P<max>.+?),.*?"f16":(?P<min>.+?),.*?"f17":(?P<start>.+?),.*?"f23":(?P<pb>.+?),.*?"f24":(?P<a>.+?)',re.S)ret = com.finditer(text)for i in ret:yield {'number': i.group('number'),'name': i.group('name'),'start': i.group('start'),'max': i.group('max'),'min': i.group('min'),'end': i.group('end'),'pe': i.group('pe'),  # 解析获取市盈率'pb': i.group('pb'),  # 解析市净率'a': i.group('a'),'volume': i.group('volume')}# 开始页码,和结束解码
def get_code_pe(start=1, end=1):# 将所有的股票代码放入列表中b = []for i in range(start, end + 1):url = 'http://60.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112408744624686429123_1578798932591&pn=' \'%d&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:13,m:' \'0+t:80,m:1+t:2,m:1+t:23&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,' \'f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1586266306109' % icontent = get_page(url=url)data = get_stock_data(text=content)for j in data:# 定义获取股票代码,名字列表a = []number = j.get('number')# 加入股票代码a.append(number)name = j.get('name')# 加入股票名字a.append(name)start = j.get('start')max_price = j.get('max')min_price = j.get('min')end = j.get('end')volume = j.get('volume')pe = j.get('pe')# 加入市盈率a.append(pe)pb = j.get('pb')# 加入市盈率a.append(pb)if start == '"-"':start, max_price, min_price, end, volume, pe, pb = '0', '0', '0', '0', '0', '0', '0'b.append(a)print(len(b))return b# 返回:所有GP列表,列表按实时涨跌幅排序
def get_stock_codes(end):lt = get_code_pe(1, end)return lt

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

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

相关文章

SpringCloud带你走进微服务的世界

认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个…

FastAPI复杂查询终极指南:告别if-else的现代化过滤架构

title: FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 date: 2025/3/14 updated: 2025/3/14 author: cmdragon excerpt: 本文系统讲解FastAPI中复杂查询条件的构建方法,涵盖参数验证、动态过滤、安全防护等18个核心技术点。通过引入策略模式、声明式编程等技术,彻…

Ubuntu 22.04使用pigz多线程快速解压/压缩文件

最近搞项目&#xff0c;资料太大&#xff0c;解压时间太久&#xff0c;于是想办法解决。 开贴记录。 1.安装pigz sudo apt install pigz 2.解压资料 解压命令为 tar --use-compress-programpigz -xvpf ***.tar.gz 将最后的部分***.tar.gz换成你自己的文件即可 例如 ti…

Amazon Quantum Ledger Database (QLDB):革新数据可信记录的终极解决方案

在数字化浪潮中&#xff0c;企业数据的安全性与可信性成为核心挑战。无论是金融交易的透明审计、供应链的全程追踪&#xff0c;还是医疗记录的真实性验证&#xff0c;如何确保数据不可篡改且可追溯&#xff0c;已成为企业亟待解决的难题。Amazon Quantum Ledger Database (QLDB…

日本IT|AWS工作内容及未来性、以及转职的所需资质和技能

AWSとは AWSはAmazon Web Services&#xff08;アマゾンウェブサービス&#xff09;の略称です。 名称から分かるとおり、ネットを通じた通販などを事業として行っているAmazon.com社がクラウドサービスとして運営しています。 本来であれば自分たちでインフラ環境を構築する…

Conda+jupyterlab

文章目录 1、Conda1.1、基本介绍1.2、conda安装1.3、conda常用命令1.3.1、基本命令1.3.2、环境管理 2、Jupyterlab2.1、基本介绍2.2、安装使用 3、pycharm中使用conda 1、Conda 1.1、基本介绍 Conda 是一个开源的包管理和环境管理工具&#xff0c;适用于 Python 及其他编程语…

Vue 项目中 CDN 引入的利弊及解决方案

在Vue项目中&#xff0c;引入到工程中的所有js、css文件&#xff0c;编译时都会被打包进vendor.js&#xff0c;浏览器在加载该文件之后才能开始显示首屏。若是引入的库众多&#xff0c;那么vendor.js文件体积将会相当的大&#xff0c;影响首屏的体验。通过调试发送时间主要消耗…

拥有一台云服务器能做什么呢?

拥有一台云服务器就像拥有了一台24小时在线的远程电脑&#xff0c;你可以通过互联网随时随地管理它。它的用途非常广泛&#xff0c;无论是个人学习、开发测试&#xff0c;还是企业级应用部署&#xff0c;都能发挥重要作用。以下是常见的应用场景&#xff0c;按需求分类整理&…

PHP 在 if 判断时由于运算符优先级导致 false 的问题

首先来看一段代码&#xff1a; $price 187.50;if (!is_numeric($price) || $price < 0 || ($price * 100 > 1000000)) {echo "价格错误&#xff1a;$price\n"; } else {echo "价格正确&#xff1a;$price\n"; }乍一看是不是认为并没有什么问题&…

从零基础到能独立设计单片机产品,一般需要经历哪些学习阶段?

相信很多人&#xff0c;内心都有“钢铁侠”的幻想&#xff0c;成为能写程序&#xff0c;能设计硬件&#xff0c;能设计结构&#xff0c;能焊接的全能型人才。 上次徐工问我&#xff0c;如果你财富自由了&#xff0c;想去做啥&#xff1f; 我说出来&#xff0c;可能大家都不信&a…

Liunx启动kafka并解决kafka时不时挂掉的问题

kafka启动步骤 先启动zookeeper&#xff0c;启动命令如下 nohup ./zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties > /home/kafka/kafka/zookeeper.log 2>&1 &再启动kafka&#xff0c;启动命令如下 nohup ./kafka-server-start.sh…

使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)

说明&#xff1a; 本案例采用的定时器3&#xff08;TIM3&#xff09;实现&#xff0c;使用其他定时器是一样配置。 如何新建一个工程以及如何配置LED的端口&#xff0c;请查看前面文章&#xff1a;使用STM32CubeMX实现LED灯每秒闪烁一次&#xff08;STM32G070CBT6单片机&…

暴力破解Excel受保护的单元格密码

暴力破解Excel受保护的单元格密码 分享一个暴力破解Excel受保护的单元格密码的方法 第一步 在Excel中按下Alt F11&#xff0c;打开Visual Basic for Applications&#xff08;VBA&#xff09;编辑器。 第二步 在VBA编辑器中&#xff0c;点击插入菜单&#xff0c;选择模块…

Git常用操作之GitLab

Git常用操作之GitLab 小薛博客官网&#xff1a;小薛博客Git常用操作之GitLab官方地址 1、GitLab安装 https://gitlab.cn/install/ 1、Docker安装GitLab https://docs.gitlab.cn/jh/install/docker.html 1、设置卷位置 在设置其他所有内容之前&#xff0c;请配置一个新的…

pgsql创建新用户并赋只读权限

在 PostgreSQL 中&#xff0c;为新用户赋予只读权限的步骤如下&#xff1a; —### 1. 创建新用户首先&#xff0c;创建一个新用户&#xff08;角色&#xff09;&#xff0c;并设置密码&#xff1a;sqlCREATE ROLE 用户名 WITH LOGIN PASSWORD 密码;例如&#xff1a;sqlCREATE R…

数据结构与算法——算法3 面试常用排序算法

首先了解排序算法性能和优缺点 然后了解快排 和堆排序的方法。 可以参考如下的博客 八大排序(超详解附动图源码)

linux root丢失修改密

在RHEL7下重置密码 第一种方式&#xff1a;光驱进入急救模式 //做之前最好 selinuxdisabled Conntinue 然后chroot /mnt/sysimag 然后编辑/etc/shadow文件 第二种方式&#xff1a; 1&#xff1a;编辑启动菜单按e,找到linux16行&#xff0c;在行尾加入 init/bin/sh,同时在…

数据类设计_图片类设计之3_半规则图类设计(前端架构基础)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇讨论半规则图类型的设计 半规则图的定义 什么是半规则图?笔者看见了一些似乎规则又不是太规则的图形,例如带圆角的矩阵,在页面上找一个圆角框 为了…

Qt 信号与槽机制

1. 信号 和 槽 Qt 信号与槽机制 是一种用于对象间通信的低耦合设计模式&#xff0c;核心思想是&#xff1a;当某个信号触发&#xff0c;自动调用预先关联的处理函数&#xff08;槽函数&#xff09;。 在 Qt 中&#xff0c;如果一个类需要使用信号与槽机制&#xff0c;则该类必…

实验8 搜索技术

实验8 搜索技术 一、实验目的 &#xff08;1&#xff09;掌握搜索技术的相关理论&#xff0c;能根据实际情况选取合适的搜索方法&#xff1b; &#xff08;2&#xff09;进一步熟悉盲目搜索技术&#xff0c;掌握其在搜索过程中的优缺点&#xff1b; &#xff08;3&#xff09;…