Skip to content

LJQ-HUB-cmyk/caipiao_yuce

Repository files navigation

AI彩票预测项目

1 项目简介

训练模型,预测彩票中奖信息。
训练模型的方式包括深度神经网络、卷积神经网络、transform训练; 其中transformer训练时,采用了bert的预训练模型,使用掩码词元的方式进行训练。 经过历史数据的训练,所有模型的历史数据拟合度都送到了90%以上, 即给出任意一期的历史数据预测,模型都能根据给出期次的前30次开奖记录、60次记录等准确预测出相关的开奖号码。
本项目主要训练了体育彩票的大乐透、排列3,以及福利彩票的双色球数据。
虽然历史数据拟合比较完美,但是由于彩票的随机性,未来的彩票预测还是不准确的,本项目仅做为研究人工智能的案例使用,不能做为生活中的真正彩票预测。

2 相关技术

  1. 相关模型
    1. ANN - 深度神经网络,采用了6个隐藏层,一个输出层,用于训练和预测大乐透和双色球的数据。
    2. RNN - 循环神经网络,3个循环神经元加一个4层输入层处理,用于训练和预测排列3的数据。
    3. transformer - BERT,基于bert的预训练模型,微调参数,训练大乐透前区的5个数,由于输入长度限制,只训练了基于历史30期的输入预测。
  2. 人工神经网络的算法
    1. 激活函数使用 tanh
    2. 输出函数使用 sigmoid
    3. 损失使用交叉熵函数
    4. 梯度计算使用 adam

3 快速开始

3.1 初始化项目

本项目使用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

3.2 训练模型

必须经过训练才能预测,本节先通过简单的方式训练,方便演示,更详细的信息后面章节有补充。 在此演示的是大乐透和双色球的训练过程

  1. 补充数据
    1. 打开data/ticai.csv文件,把大乐透开奖信息补充到最新。
    2. 打开data/fucai.csv文件,把双色球开奖信息补充到最新。
  2. 设置参数
    打开main.py文件,进行如下修改
    # 设置大乐透的历史期数,
    # 根据历史多少期预测开奖号码,在此仅设置了30期和60期
    history_ticai_array = [(60,60),(30,30)]
    # 双色球的历史期数
    history_fucai_array = [(60,60),(30,30)]
    # 大乐透训练开关
    ticai_predicate = True
    # 双色球训练开关
    fucai_predicate = True
  3. 训练模型
    执行如下命令,进行训练
    uv run main.py

3.3 mcp工具集成到开源模型

  彩票的mcp工具实现,目前主要实现了大乐透的查询和预测功能,可以通过类似“查询大乐透第2025066期的开奖信息”和“预测大乐透下期的开奖号码”的信息提示,让大模型调用mcp工具进行相关的回答。
具体操作步骤如下:

  1. 启动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)

  2. 安装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
      
  3. 安装5ire
    1. 下载
      下载地址 https://5ireai.com/
    2. 服务商设置
      1. 点击左上角的“空间”->“服务商”
      2. 选择ollama,点击右侧的qwen3:4b模型,在展开的对话框中,把“工具”、“启用”、“默认”开关打开,如图3-1所示。
    3. 工具设置
      1. 点击左上角的“工具”,进入工具设置界面
      2. 点击右上角的下拉项,选择“远程”
      3. 在弹出的对话框中,设置如下(参见图3-2)
      4. 保存工具后,把鼠标放在“体育彩票”列表所在的行,点击右侧的开关,使其处于开启状态
    4. 测试
      1. 点击左上角的“新对话”
      2. 在中部工具栏选择“ollama”,"qwen3:4b"
      3. 在聊天窗口输入“预测大乐透下期的开奖号码”,回车后就可以看到调用信息了,如图3-3所示。
      4. 如果调用成功,在窗口右侧可以看到调用工具的参数和返回结果;在思考过程中,可以看到调用工具的选择和思考过程。

图3-1
图3-1 ollama设置

图3-2
图3-2 添加工具

图3-3
图3-3 大乐透预测号码

3.4 使用langchain自定义agent代理

  彩票的langchain的agent工具实现, 目前主要实现了大乐透的查询和预测功能, 可以通过类似“查询大乐透第2025066期的开奖信息”和“预测大乐透下期的开奖号码”的信息提示,让大模型调用mcp工具进行相关的回答。 langchain处理的优点除了可以屏蔽和模型的差异外,还可以对多个任务进行编排。 对大乐透的彩票查询和预测进行编排后,形成的逻辑处理图3-4如下所示:
langchain
图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)

3.5 直接使用原生模型输出

  1. 使用ANN模型预测大乐透号码
    1. 输入以下命令预测:

      uv run ticai_yuce.py -mode "predict" -period 2025067

    2. 输出结果如下:

      第2025067期预测结果是:红球[ 6 10 12 21 22],蓝球[1 6]

  2. 使用ANN模型预测双色球号码
    1. 输入以下命令预测:

      uv run fucai_yuce.py -mode "predict" -period 2025068

    2. 输出结果如下:

      第2025068期大乐透预测结果是:红球[ 5 7 8 19 20 31],蓝球[7]

  3. 使用RNN模型预测排列3号码
    1. 输入以下命令预测:

      uv run arrange3_yuce.py -mode "predict" -period 2025088

    2. 输出结果如下:

      |排列3|30期,第2025088期预测结果是: [2, 2, 2]

  4. 使用transformer模型预测大乐透前区号码
    1. 输入以下命令预测:

      uv run transformer_yuce.py -mode "predict" -period 2025055

    2. 输出结果如下:

      大乐透第2025055期的红球的预测结果是8,10,25,29,32

4 训练数据

4.1 transformer模型微调和训练

由于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目录中去。目录存储内容如下:
模型存储目录

4.2 ANN神经网络模型训练

计算方法是首先进行归一化处理,首先将输入的数字进行二进制位置投影,投影之后转换成十进制,再把十进制值的范围映射到[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

4.3 RNN神经网络模型训练

循环神经网络主要用于生成顺序相关的一系列数据,本模型的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

About

预测彩票信息使用神经网络进行训练后,再对下期彩票信息进行预测

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors