书接上回《A股短线交易之AI自动化选股》。
从三月份开始,A股市场的走势真让人看不懂了,特别是中东地区冲突,特朗普手搓K线图,A股也跟着上下波动,买的股票稳中有跌,恐高的股票越涨越高,太难玩了。而我这几个月主要做了一件事就是验证自动卖出策略,现在就将所有的买入和卖出策略讲一遍,以下就开始献丑了。
股票数据
股票数据直接来自上交所和深交所,每天都会更新数据,主要处理新上市的股票、变成ST的股票、摘帽(去掉ST)的股票,ST股票和退市的股票默认直接剔除。
行情数据
股票行情数据来源国内的财经网站。实时行情数据主要来自腾讯财经、新浪财经、雪球,主力资金净流入数据来自腾讯财经,其他的数据来源还有东方财富、同花顺、搜狐财经等。对于实时行情数据获取,由于股票数量很多,为了避免被系统检测出来拉黑,采用了多台不同公网IP的服务器分布式获取实时行情数据。(后来发现其实没必要实时更新行情数据,但至少每天收盘后要更新一次数据)
主要关注的数据:价格、成交量、量比、5/10/20日均线、主力资金净流入、换手率、MACD、布林带、KDJ、TRIX。这些数据都是原始不复权的数据。
选股策略
每天14:48开始从主力资金净流入排行榜获取股票数据,过滤掉净流入小于500万的数据,价格过高、涨幅过高的股票也会过滤掉。然后获取这些股票的实时行情数据,计算出各指标值。
通过代码快速筛选所有股票:通过评分制,计算各种场景并打分,场景包括:是否大幅低开、5/10日均线趋势、价格在5日均线上、成交量放大、MACD出现金叉且diff大于0、上影线占比,必须所有指标都满足才会被初选出来。
获取主力资金数据,包括主力资金净流入数据,主动性买卖盘占比(主动性买盘必须大于主动性卖盘)。
然后把所有数据喂给AI,第一次调用AI使用的是 GPT-5-mini 模型,如果模型判断可以买入,则会第二次调用AI,使用 Gemini-3.0-Flash 模型,如果模型判断可以买入,就是最终选出来的股票了。
股票选出后写入数据库,限制每天最多选出10支股票,通过发送邮件通知选出来哪些股票。
缩量下跌选股
这是最近新增的一个选股策略,但是效果不太好,如果条件苛刻,则选不出来股票,如果条件宽松,胜率就很低很低,一直没有调试好,这里就不介绍了。
卖出策略
每天开盘后开始执行,每隔10分钟执行一次。首先获取股票的实时行情数据和当天的分钟级数据(价格、成交量、均价),计算出各个指标的值。
通过代码快速初筛股票,只设置止损位,如果股票疯狂上涨,就让它一直涨,具体策略如下:触及涨停就坚定持有、硬止损位(阴跌到10%)、跳空低开、放量下跌、MACD死叉、分钟级数据跳水、从买入后的最高点回撤3%(盈利状态下),只要触发任一个止损点,股票就会被选出来。
然后把所有数据喂给AI,这次只使用Gemini-3.0-Flash 模型判断,如果判断卖出,就立即卖出,如果判断继续持有,则20分钟内不再处理这只股票(以AI决策为主,代码决策为辅)
股票卖出数据写入数据库。
操盘数据
模拟数据
当前正在运行的选股和卖出策略只是模拟,还不敢实盘,最近的股票模拟情况如下:
从4月1日开始,截至到6月26日收盘,自动买入卖出策略模拟炒股盈利 -59.95元。一顿操作猛如虎,真不如股票选出来后无脑持有四五天然后收盘前卖掉。
实盘数据
光有模拟数据还是不够的,必须还要验证卖出策略是不是真的比人工决策要好。于是我选择性的买入了选出来的股票,实盘验证我的决策和AI决策哪个好。
表头中的“卖出价A”和“卖出日期A”是指AI自动决策的卖出价和卖出时间;“卖出价M”和“卖出日期M”是指我自己决策卖出价和卖出时间;差值是指人工操作的盈利和AI卖出的盈利的差值,我卖出的价格比AI卖出的价格低就是负数,反之就是正数。
这个实操对比实验,我可以确定自己的决策不受AI决策的影响,AI决策是卖出还是持有不影响我的决策。从数据来看,并没有明显的区别,算是半斤八两吧,看来卖出策略还是不行,需要继续调整策略。
问题分析
最大的问题是这是纯技术面分析,没有个股的基本面分析,也没有行业、板块、大盘的分析,很容易误判走势;且K线图、资金流入流出等数据很容易被人为手搓出来,这种情况技术分析就没啥用了。
其次为了节省成本,使用了免费的AI;为了能够使用免费的AI,选股策略和卖出策略加入了大量的硬编码,用代码快速筛选股票确实不错,但是全部无脑的按照设置的条件和指标判断,非常容易误判,因为股票走势是有趋势的,不能只看单点数据。
这套框架没有回测能力,没有办法获取历史分钟级数据,且卖出策略如果按照分钟级回测,有点太复杂了,不想做了。现在是修改了策略就直接拿来用,直接在实践中验证策略。
一个好的点
我看过其他一些选股策略,在市场趋势明显走坏、市场情绪低点时,仍然频繁买入卖出股票,这肯定会导致亏损。现在的这套选股策略,在市场低迷和上下波动时,是不会选出股票的。例如3月份中东打仗,经常没有选出一只股票,截至到6月,能选出股票的时候也只是选出两三只股票,不像年前经常一次能选出10只股票(限制最多10只),这就可以在市场不好的情况下尽可能减少亏损。
接下来的计划
作为一个爱折腾的人,我想在我还有精力没变成老登之前再折腾折腾。后续决定全面拥抱AI,先花钱买Token(舍不得孩子套不到狼),接入Openclaw,对股票进行基本面分析和技术面分析,同时也要对市场和行业进行分析,到时再看整个策略的盈利情况。
项目框架
项目地址:https://github.com/leeyoshinari/stock。
本项目有2个服务:一个是web服务(main.py),一个是纯后台获取数据、选股服务(getStock.py),详细请看 startup.sh 文件。
请求转发服务
因为股票行情数据都是国内网站,所以服务器就在国内,但是调用ChatGPT和Gemini需要梯子,怎么绕过这个呢?这就需要请求转发服务,代码:https://github.com/leeyoshinari/one-api。这使用的是nextjs框架,只用于请求转发,可直接部署在vercel平台或境外服务器上。同时由于股票数量太多,为了尽可能快的获取实时行情数据,避免被拉黑,也可以用这个项目转发获取行情数据的请求,实现分布式获取股票数据。
配置文件
配置文件是.env.example文件,需要先复制这个文件并重命名为.env,然后修改.env文件中的配置。需要重点关注以下配置:
batchSize = 30 # 实时行情数据单次请求的股票数量
allStockDataSize = 5 # 获取实时行情的线程数
batchInterval = 12 # 每次获取实时行情数据的时间间隔
HTTPHost1、HTTPHost2、HTTPHost3分别是部署 请求转发服务 的地址,如果你没有部署,可以忽略这个配置,如果你部署了更多的服务,可以自行增加配置。
这里使用的是ChatGPT和Gemini模型,如果你使用其他模型,可自行修改配置文件和调用模型的地方。
web服务
主入口是 main.py 文件,主要提供web服务,页面可视化查看数据。同时启动了2个定时任务,分别是压缩数据库并移动到静态文件目录,方便通过访问静态文件的方式下载数据库,实现备份;另一个是卖出策略定时任务。
该web页面支持PWA。
后台服务
主入口是 getStock.py 文件,启动了很多个定时任务,用于定时获取、更新数据。
最重要的是启动了很多个获取股票行情数据的协程,就是 getStockFromxxx 方法,特别注意:这里启动了多少个获取股票行情数据的协程,配置文件中的 allStockDataSize 就配置多少。HTTPHost1、HTTPHost2、HTTPHost3也必须可以使用,不能使用的话就会报错,如果没有,可以把这些代码注释掉并修改配置文件。(PS:我启动了11个协程,把所有股票数据获取一遍的时间不到4分钟)
以上,本人能力有限,策略肯定不好,仅供大家学习交流。
股市有风险,入市需谨慎