训练模型,预测彩票中奖信息。
训练模型的方式包括深度神经网络、卷积神经网络、transform训练;
其中transformer训练时,采用了bert的预训练模型,使用掩码词元的方式进行训练。
经过历史数据的训练,所有模型的历史数据拟合度都送到了90%以上,
即给出任意一期的历史数据预测,模型都能根据给出期次的前30次开奖记录、60次记录等准确预测出相关的开奖号码。
本项目主要训练了体育彩票的大乐透、排列3,以及福利彩票的双色球数据。
虽然历史数据拟合比较完美,但是由于彩票的随机性,未来的彩票预测还是不准确的,本项目仅做为研究人工智能的案例使用,不能做为生活中的真正彩票预测。
- 相关模型
- ANN - 深度神经网络,采用了6个隐藏层,一个输出层,用于训练和预测大乐透和双色球的数据。
- RNN - 循环神经网络,3个循环神经元加一个4层输入层处理,用于训练和预测排列3的数据。
- transformer - BERT,基于bert的预训练模型,微调参数,训练大乐透前区的5个数,由于输入长度限制,只训练了基于历史30期的输入预测。
- 人工神经网络的算法
- 激活函数使用 tanh
- 输出函数使用 sigmoid
- 损失使用交叉熵函数
- 梯度计算使用 adam
- 激活函数使用 tanh
本项目使用uv做为项目管理工具,使用方法如下: 进入项目根目录,执行如下命令。
# 安装项目管理工具
pip install uv
# 下载源码
git clone https://gitee.com/dunsk/caipiao_yuce.git
cd caipiao_yuce
# 下载依赖
uc sync
# 激活虚拟环境
source .venv/bin/activate
# 如果是windows环境,则运行下面这个脚本
# .venv/bin/activate.bat必须经过训练才能预测,本节先通过简单的方式训练,方便演示,更详细的信息后面章节有补充。 在此演示的是大乐透和双色球的训练过程
- 补充数据
- 打开data/ticai.csv文件,把大乐透开奖信息补充到最新。
- 打开data/fucai.csv文件,把双色球开奖信息补充到最新。
- 设置参数
打开main.py文件,进行如下修改# 设置大乐透的历史期数, # 根据历史多少期预测开奖号码,在此仅设置了30期和60期 history_ticai_array = [(60,60),(30,30)] # 双色球的历史期数 history_fucai_array = [(60,60),(30,30)] # 大乐透训练开关 ticai_predicate = True # 双色球训练开关 fucai_predicate = True
- 训练模型
执行如下命令,进行训练uv run main.py
彩票的mcp工具实现,目前主要实现了大乐透的查询和预测功能,可以通过类似“查询大乐透第2025066期的开奖信息”和“预测大乐透下期的开奖号码”的信息提示,让大模型调用mcp工具进行相关的回答。
具体操作步骤如下:
- 启动mcp服务
进入项目根目录,运行如下命令执行成功后,会输出如下日志代表启动成功fastmcp run adapter/mcp_server.py --transport "streamable-http" --port 9000[06/23/25 20:13:00] INFO Starting MCP server 'lottery_ticket' with transport 'streamable-http' on http://127.0.0.1:9000/mcp server.py:1219 INFO: Started server process [92586] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:9000 (Press CTRL+C to quit)
- 安装ollama
windows下面的安装比较简单,在此演示linux下面的安装步骤,为了避免有些发行版的系统目录为只读的,在此采用zip包的方式安装- 去官网下载安装包ollama-linux-amd64.tgz
- 解压压缩包到当前文件夹
- 进入文件夹,执行以下命令
# 启动ollama服务 nohup bin/ollama serve > ollama.log 2>&1 & # 拉取千问模型,当然其它模型也可以 bin/ollama pull qwen3:4b # 运行千问模型 bin/ollama run qwen3:4b # 运行成功后,会有 >>的提示符,提示输出,输入 /bye 退出即可 # >> /bye
- 安装5ire
- 下载
下载地址 https://5ireai.com/ - 服务商设置
- 点击左上角的“空间”->“服务商”
- 选择ollama,点击右侧的qwen3:4b模型,在展开的对话框中,把“工具”、“启用”、“默认”开关打开,如图3-1所示。
- 工具设置
- 点击左上角的“工具”,进入工具设置界面
- 点击右上角的下拉项,选择“远程”
- 在弹出的对话框中,设置如下(参见图3-2)
- url=http://127.0.0.1:9000/mcp
- 工具标识=caipiao
- 名称=体育彩票
- 保存工具后,把鼠标放在“体育彩票”列表所在的行,点击右侧的开关,使其处于开启状态
- 测试
- 点击左上角的“新对话”
- 在中部工具栏选择“ollama”,"qwen3:4b"
- 在聊天窗口输入“预测大乐透下期的开奖号码”,回车后就可以看到调用信息了,如图3-3所示。
- 如果调用成功,在窗口右侧可以看到调用工具的参数和返回结果;在思考过程中,可以看到调用工具的选择和思考过程。
- 下载
彩票的langchain的agent工具实现,
目前主要实现了大乐透的查询和预测功能,
可以通过类似“查询大乐透第2025066期的开奖信息”和“预测大乐透下期的开奖号码”的信息提示,让大模型调用mcp工具进行相关的回答。
langchain处理的优点除了可以屏蔽和模型的差异外,还可以对多个任务进行编排。
对大乐透的彩票查询和预测进行编排后,形成的逻辑处理图3-4如下所示:
图3-4 langchain流程图
该图是根据程序内容动态生成的,如果想生成图片内容,可运行如下命令
uv run adapter/langchain_server.py -showImage
调用langchain处理逻辑并输出结果的方法如下:
# 查询彩票开奖历史信息
uv run adapter/langchain_server.py -msg "查询大乐透第2025066期的开奖信息"
# 预测彩票未来的号码
uv run adapter/langchain_server.py -msg "预测大乐透下期的开奖号码"如果运行成功,则会输出如下信息:
查询信息输出
好的,用户让我查询大乐透第2025066期的开奖信息,我调用了get_ticket_info函数,返回的结果是红球15、18、27、28、34,蓝球3、6。现在需要把这些信息整理成用户容易理解的回答。 首先,我需要确认期号是否正确,2025066是否是有效的期号。大乐透的期号通常是按顺序排列的,比如2025066可能对应2025年的第66期。不过,实际中大乐透的期号可能有不同的格式,但用户提供的信息是明确的,所以直接按返回结果呈现。 接下来,要确保红球和蓝球的号码正确无误,没有输错或看错。用户给出的红球是五个数字,蓝球是两个,符合大乐透的规则。然后需要以清晰的方式展示这些号码,可能用逗号分隔,或者分红球和蓝球两部分。 另外,可能需要提醒用户,如果需要其他期数的信息,可以进一步查询,或者提供预测信息。但根据用户的问题,只需要回答查询结果即可。不过,用户可能有兴趣知道这期的开奖结果是否中奖,但如果没有购买彩票,可能不需要涉及中奖信息,所以保持中立。 最后,确保回答简洁明了,没有使用专业术语,让用户容易理解。可能需要检查是否有错别字或格式错误,比如号码之间的符号是否正确,期号是否正确显示。大乐透第2025066期的开奖号码为: 红球:15、18、27、28、34 蓝球:3、6
预测结果输出
好的,用户让我预测大乐透下期的号码,我调用了predict_ticket函数,返回了红球和蓝球的组合。现在需要把这些信息以自然的方式呈现给用户。首先,确认一下预测结。不过根据函数返回的结果,直接给出预测的号码即可。另外,可能需要提醒用户这是预测,仅供参考,实际以官方开奖为准。不过用户没有提到需要提醒,所以可能不需要额外信息。最后,确保回复清晰明了,数字用括号括起来,分红球和蓝球两部分。
根据模型预测,大乐透下期(2025071期)的开奖号码为:
红球:(06, 16, 29, 33, 34)
蓝球:(11, 12)
- 使用ANN模型预测大乐透号码
- 输入以下命令预测:
uv run ticai_yuce.py -mode "predict" -period 2025067
- 输出结果如下:
第2025067期预测结果是:红球[ 6 10 12 21 22],蓝球[1 6]
- 输入以下命令预测:
- 使用ANN模型预测双色球号码
- 输入以下命令预测:
uv run fucai_yuce.py -mode "predict" -period 2025068
- 输出结果如下:
第2025068期大乐透预测结果是:红球[ 5 7 8 19 20 31],蓝球[7]
- 输入以下命令预测:
- 使用RNN模型预测排列3号码
- 输入以下命令预测:
uv run arrange3_yuce.py -mode "predict" -period 2025088
- 输出结果如下:
|排列3|30期,第2025088期预测结果是: [2, 2, 2]
- 输入以下命令预测:
- 使用transformer模型预测大乐透前区号码
- 输入以下命令预测:
uv run transformer_yuce.py -mode "predict" -period 2025055
- 输出结果如下:
大乐透第2025055期的红球的预测结果是8,10,25,29,32
- 输入以下命令预测:
由于transformer需要较多的算力,而且本项目以技术研究为主要目的,因此只训练了大乐透的前区部分的5个球。 它是基于谷歌的“google-bert/bert-base-chinese”预训练模型进行训练的,由于本训练采用掩码词元的方式训练, 跟bert进行预训练的方式基本一致,因此没有采用LoRA、LoRI等训练方法,而采用了全量参数微调方式。 训练采用的掩码词元位置固定,采用类似如下的语法 “(14,23,29,30,33);(03,12,16,21,29);(08,10,25,29,32);下一组数据是:([MASK],[MASK],[MASK],[MASK],[MASK])” 训练时,可以在控制台输入如下命令启动
# t_count代表训练多少次,即epoch是多少
uv run transformer_yuce.py -mode "train" -t_count 16
# 训练完成后的模型checkpoint数据存储在项目的 "da_le_tou" 目录中
# 启动预测的命令是
uv run transformer_yuce.py -mode "predict" -period 2025055第一次启动项目时,需要使用“科学上网”法,因为需要从HuggingFace下载预训练模型到本地,HuggingFace网站一般在国内是不能直接访问的,或者下载离线下载数据(模型google-bert/bert-base-chinese)后,
放于本项目的model目录中去。目录存储内容如下:

计算方法是首先进行归一化处理,首先将输入的数字进行二进制位置投影,投影之后转换成十进制,再把十进制值的范围映射到[0,1]值区间中。具体计算方法请参考代码处理过程 。 ANN模型主要用于训练和预测大乐透和双色球,其中红球和蓝球互相独立,因此需要区别单独的训练。 启动大乐透训练的方法如下(启动训练时,红球和蓝球将会一起训练):
# 训练大乐透的前区和后区球
# 下面这个命令用于训练基于历史30期预测开奖号码的模型,训练300次
uv run ticai_yuce.py -mode "train" -t_count 300 -his_len 30
# 训练双色球的红球和蓝球
# 下面这个命令用于训练基于历史30期预测开奖号码的模型,训练300次
uv run fucai_yuce.py -mode "train" -t_count 300 -his_len 30训练完成后,就可以对未来数据进行预测了,需要注意的是,预测只能预测未来的一期,不能预测未来的多期。 预测对应的命令如下:
# 基于历史的30期,预测大乐透未来第2025066期的开奖号码
uv run ticai_yuce.py -mode "predict" -period 2025066 -his_len 30
# 基于历史的30期,预测双色球未来第2025066期的开奖号码
uv run fucai_yuce.py -mode "predict" -period 2025066 -his_len 30循环神经网络主要用于生成顺序相关的一系列数据,本模型的RNN模型主要用于排列3的数据训练(也可以适当调整用于训练排列5)。 但是由于排列3的顺序没有关联性,因此使用三个循环神经元分别预测三个排列3数字,在此主要利用了循环神经元的多个输入的特性。 循环神经元的隐藏输入神经元,本模型并没有采用随机生成初始化的方式,而是采用历史数据的序列进行生成的。循环神经元的序列输入, 按照一区、二区、三区纵切后,形成的序列进行输入,最终生成相关数据输出的概率,进而转化成数字输出。 排列3的训练启动命令如下:
# 下面这个命令用于训练基于历史30期预测开奖号码的模型,训练300次
# batch_num的意思是将训练数据拆分成几个批次进行训练,如果batch_num=3,就是拆分成3批,比如一共1500的样本数据,则每批500个样本数据
# 排列3的历史数据较多,建议拆分成多个批次训练,以节省内存占用。
uv run arrange3_yuce.py -mode "train" -t_count 300 -his_len 30 -batch_num 3训练完成后,预测的命令如下:
# 基于历史的30期,预测排列3未来第2025066期的开奖号码
uv run arrange3_yuce.py -mode "predict" -period 2025066 -his_len 30

