当前位置: 首页 > article >正文

通过 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

相关文章:

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

此贴为Python爬虫技术学习贴 在股票中&#xff0c;即便有了选股规则&#xff0c;从5000多只股票中筛选出符合规则的股票也是十分困难的&#xff0c;于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则&#xff0c;第一套弱约束&#xff0c;第…...

OpenEuler20.3 安装 Elasticsearch7.17

1、下载elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz.sha512 shasum -a 512 -c elasticsea…...

大数据学习(68)- Flink和Spark Streaming

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

Fastdata极数:中国民宿行业发展趋势报告2025

2024年&#xff0c;中国游客出行次数大幅上涨&#xff0c;旅游相关支出也复苏强劲。2025年中国旅游业还将持续稳健的复苏及增长。同时&#xff0c;中国旅游业将见证一场深刻的变革&#xff0c;这场变革的推动力是消费者对旅游期望的转变&#xff0c;经济因素和年轻人全新价值观…...

图论——广度优先搜索实现

99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)

1.问题描述&#xff1a; 使用华为内置的MapComponent&#xff0c; 发现显示不出来。查看日志&#xff0c; MapRender底层有报错。 解决方案&#xff1a; 麻烦按以下步骤检查下地图服务&#xff0c;特别是签名证书指纹那部分。 1.一般没有展示地图&#xff0c;可能和没有配置…...

【MySQL】B树和B+树的区别?MySQL为什么选用B+树作为索引数据结构?

B树和B树的区别&#xff1a; 结构方面&#xff1a; 1.节点存储内容&#xff1a; B树&#xff1a; 节点同时存储索引和数据。B树&#xff1a;只有叶子节点存储数据记录或指向数据记录的指针&#xff0c;非叶子节点只存键值&#xff0c;用于索引。 B 树的非叶子节点可以存储更…...

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中&#xff0c;配置useNormalizedOHMUrl属性为true (我这项目创…...

ERC-6909 最小多代币标准

ERC-6909 Token标准是 ERC-1155 Token标准的一种简化替代方案。 ERC-1155 标准引入了一种多Token接口&#xff0c;使得单个智能合约能够结合可替代的和不可替代的Token&#xff08;即&#xff0c;​ERC20 和 ERC721&#xff09;。 ERC-1155 解决了多个挑战&#xff0c;例如降…...

各省水资源平台 水资源遥测终端机都用什么协议

各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动&#xff0c;经过多年建设&#xff0c;基本都已经形成了稳定的通讯要求&#xff1b;河北瑾航科技 遥测终端机&#xff0c;兼容了大部分省市的通讯协议&#xff0c;如果需要&#xff0c;可以咨询和互相学习&…...

需求分析、定义、验证、变更、跟踪(高软47)

系列文章目录 需求分析、定义、验证、变更、跟踪 文章目录 系列文章目录前言一、需求分析二、需求定义三、需求验证四、需求变更五、需求跟踪六、真题总结 前言 本节讲明需求分析、定义、验证、变更、跟踪相关知识。 一、需求分析 二、需求定义 三、需求验证 四、需求变更 五、…...

从零开始 | C语言基础刷题DAY3

❤个人主页&#xff1a;折枝寄北的博客 目录 1.打印3的倍数的数2.从大到小输出3. 打印素数4.打印闰年5.最大公约数 1.打印3的倍数的数 题目&#xff1a; 写一个代码打印1-100之间所有3的倍数的数字 代码&#xff1a; int main(){int i 0;for (i 1; i < 100; i){if (i % …...

PostreSQL指南-内幕探索-学习笔记-01-数据库集簇的逻辑与物理结构

目录 一、环境信息 二、参考内容 三、逻辑结构概念 四、物理结构概念 五、逻辑映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 五、物理映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 六、数据库文件布局 1、表格 2、postmaster.pid文件解…...

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…...

Unity Shader - UI Sprite Shader之简单抠图效果

Sprite抠图效果&#xff1a; 前言 在PhotoShop中我们经常会用到抠图操作&#xff0c;现在就用Shader实现一个简单的抠图效果。 实现原理&#xff1a; 使用当前像素颜色与需要抠掉的颜色相减作比较&#xff0c;然后与一个指定的阈值比较以决定是否将其显示出来&#xff1b; U…...

本地仓库设置

将代码仓库初始化为远程仓库&#xff0c;主要涉及在服务器上搭建 Git 服务&#xff0c;并将本地代码推送到服务器上。以下是详细的步骤&#xff1a; 1. 选择服务器 首先&#xff0c;你需要一台服务器作为代码托管的远程仓库。服务器可以是本地服务器、云服务器&#xff0c;甚…...

30、Vuex 为啥可以进行缓存处理

Vuex 状态管理基础与缓存的关联 Vuex 的核心概念&#xff1a; Vuex 主要由五个部分组成&#xff1a;state、mutations、actions、getters和modules。其中&#xff0c;state是存储数据的地方&#xff0c;类似于一个全局的数据仓库。在这个菜谱 APP 的例子中&#xff0c;缓存的数…...

ngx_http_conf_ctx_t

定义在 src/http/ngx_http_config.h typedef struct {void **main_conf;void **srv_conf;void **loc_conf; } ngx_http_conf_ctx_t; ngx_http_conf_ctx_t 是 Nginx 中用于管理 HTTP 配置上下文的核心结构体&#xff0c;其设计体现了 Nginx 多级配置&…...

vllm-openai多服务器集群部署AI模型

服务器配置是两台ubantu系统电脑,每台电脑安装两张4090-48G显存的显卡,共计192G显存。 服务器1 服务器2 准备工作: 1.两台电脑都已经安装了docker 2.两台电脑都已经安装了nvidia驱动 参考vllm官方资料 https://docs.vllm.ai/en/latest/serving/distributed_serving.html…...

Cluster Computer(SCI1区)投稿常见问题

Cluster Computer(SCI1区)投稿常见问题 目录 Cluster Computer(SCI1区)投稿常见问题怎么查询sci投稿的详细时间节点怎么查看sci投稿期刊邀请几个审稿人,几个审稿接受邀请**一、格式问题:作者简介与照片添加****二、审稿周期长:催稿邮件模板****三、查重超标(阈值通常20…...

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek&#xff1f;2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代&#xff0c;企业越来越重视数据的价值。为了…...

STM32---FreeRTOS事件标志组

一、简介 事件标志位&#xff1a;用一个位&#xff0c;来表示事件是否发生 事件标志组&#xff1a;一组事件标志位的集合&#xff0c;可以简单的理解时间标志组&#xff0c;就是一个整体。 事件标志租的特点&#xff1a; 它的每一个位表示一个时间&#xff08;高8位不算&…...

Word 小黑第40套

对应大猫43 主题 -浏览主题 -选择W样式标准文件就行 1级段落和2级段落&#xff08;用项目符号不影响原本段落文字符号 颜色修改为自动&#xff09; 整段变红的 不是把光标定位到红色字体那里 要选择几个红色字体 再创建样式 插入的空白页一定要是下一页&#xff0c;不能插空白…...

【Linux我做主】浅谈Shell及其原理

浅谈Linux中的Shell及其原理 Linux中Shell的运行原理github地址前言一、Linux内核与Shell的关系1.1 操作系统核心1.2 用户与内核的隔离 二、Shell的演进与核心机制2.1 发展历程2.2 核心功能解析2.3 shell的工作流程1. 用户输入命令2. 解析器拆分指令3. 扩展器处理动态内容变量替…...

【JDK17】开源应用服务器大比对

接着 next-public 源代码分析&#xff0c;Java 应用服务器选用 jetty。但是之前普遍使用 Tomcat&#xff0c;那为什么要用 jetty 么&#xff0c;除了这两个&#xff0c;Java 应用服务器开源现状并不了解&#xff0c;故而又是一篇科普性的笔记&#xff0c;以下是 又小又快的 Jav…...

CI/CD构建与注意事项

1. CI/CD 概述 1.1 定义 CI&#xff08;Continuous Integration&#xff0c;持续集成&#xff09;&#xff1a;是一种软件开发实践&#xff0c;开发团队成员频繁地将代码集成到共享的代码仓库中。每次集成都会通过自动化的构建&#xff08;包括编译、打包等&#xff09;和测试…...

数据结构篇——二叉树的存储与遍历

一、引入 书接上文&#xff0c;文于此续。上文我们学到了树的存储结构&#xff0c;那么今天&#xff0c;我们来学习下几种特殊的二叉树以及关于它的各种遍历&#xff0c;让我们一起加油吧。 二、特殊的二叉树 二叉树的特殊形式这里介绍3种&#xff0c;其中需要着重记忆的有…...

分而治之:用于 RGB-T 显著目标检测的 Confluent Triple-Flow 网络(问题)

摘要 问题一&#xff1a;RGB-thermal显著对象检测这是什么&#xff1f; RGB图像是可见光的三通道图像&#xff0c;而thermal是热红外图像&#xff0c;通常为单通道&#xff0c;记录物体的热辐射信息。结合RGB和thermal两种模态的数据&#xff0c;可以利用两者的互补信息&…...

求职招聘网站源码,找工作招工系统,支持H5和各种小程序

招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…...

18.使用读写包操作Excel文件:xlrd、xlwt 和 xlutils 包

一 xlrd、xlwt 和 xlutils 包的介绍 OpenPyXL 和 xlrd、xlwt 、xlutils 的区别在笔记 15 。 二 如何使用 xlrd 读取文件 1.获取所有工作表的名称 book.sheet_names()&#xff1a;得到一个列表。 import xlrd import xlwt from xlwt.Utils import cell_to_rowcol2 import xluti…...