【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现

前言:彩票是一个坑,千万不要往里面跳。任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已。

  已经3个月没写博客了,因为业余时间一直在研究彩票,发现还是有很多乐趣,偶尔买买,娱乐一下。本文的目的是向大家分享一个经典的数学预测算法的思路以及代码。对于这个马尔可夫链模型,我本人以前也只是听说过,研究不深,如有错误,还请赐教,互相学习。

1.马尔可夫链预测模型介绍

  马尔可夫链是一个能够用数学方法就能解释自然变化的一般规律模型,它是由著名的俄国数学家马尔科夫在1910年左右提出的。马尔科夫过程已经是现在概率论中随机过程理论的一个重要方面。经过了一百年左右的发展,马尔可夫过程已经渗透到各个领域并发挥了重要的作用,如在我们熟知的经济、通信领域,除此之外在地质灾害、医疗卫生事业、生物学等自然科学领域也发挥了非常重要的作用。

  人们在对实际问题的研究中会发现随着时间的持续发展变化会产生很多现象。还有一些现象或过程可以表述如下:在“现在”是已知的情况下,这种变化过程的“未来”与“过去”是毫无联系的。也就是说这种过程的未来所出现的情况不依赖于过去的发展变化,我们就把具有上述性质的过程称之为马尔可夫过程。马尔可夫过程可以描述现实生活中的很多现象。例如,我们熟知的液体中的颗粒所做的布朗运动、在商业活动中所要研究的每天销售情况、在数字通信中的语音信号、视频信号等。马尔可夫链在其他领域的应用还有很多,如在银行的不良资产的管理、机车管理、企业管理、生态环境演变、城市用水量仿真、信息处理等科学研究和生产生活中都有广泛应用。

2.马尔可夫链的数学概念和性质

        定义1:

  

    定义2:

       

     上面是2个最简单的马尔可夫链的数学定义,看不懂没关系,简单解释一下:

     1.从状态k到k+1与时间k无关,也就是说这个随机过程与时间k无关,而从k到k+1状态,有一个转移概率,马尔可夫链的核心其实也就是这个转移概率;

     2.根据马尔可夫链的思想,一步转移概率Pij很容易得到,但是预测的时候,往往要根据最近K期的数据来进行,所以要计算K步转移概率;

     3.任意步的转移概率可以根据C-K方程来计算,CK方程是一种计算转移概率的基本方法,简单的算法就是:通过一步转移概率矩阵P独自相乘m次,就可以得到m步转移概率。

     4.马尔可夫链的思想,就是根据历史的数据,统计得到转移概率,然后根据滞时权重对每个状态进行预测,概率最高的是最可能出现的。

     5.对于离散型马尔可夫链序列变量,一般计算之前需要对变量进行“马氏性”检验,统计量就是卡方分布。

     6.马尔可夫链的研究还有很多其他的方面,比如状态分类,极限概率,平稳分布等等,这些太高级,没时间去搞很懂,这些对预测过程的精度是有一定影响的。

3.离散型马尔可夫链变量预测步骤

3.1 状态分类

  对于离散型变量来说,首先要把目标的数据进行归类,对模型来说,一般状态都是有限的,比如说双色球,可以把16个篮球号码分为8个状态,2个一组。当然一些经济和实际生活数据的状态分类,就要根据实际情况了。

3.2 计算转移概率矩阵

  转移概率矩阵是可以根据历史数据的频率f(i,j)统计得到。f(i,j)是状态i到状态j转移的次数;然后概率转移矩阵

                    p(i,j) = f(i,j)/f(i.)  ;频数除以当前行的和值即为概率

3.3 "马氏性"检验

  对于离散型的变量,需要利用历史数据进行“马氏性”检验。检验公式为:

                                 

    然后根据显著性水平(程序中固定取0.05) ,查表求m自由度时的阀值,若 ,则满足 马氏性,可以进行下一步的预测,否则没有多大的意义。

3.4 计算自相关系数和各种步长的权重

  若满足马氏性,就可以对下一个状态进行预测了,预测根据滞时k,有权重调整,权重W(k)是根据自相关系数R(k)计算得到的,公式如下:

            

           

  k为滞时期,我程序测试里面选的5,L是总的历史数据次数,X是历史数据序列。

3.5 计算不同滞时期的转移概率矩阵

      根据C-K方程提供的算法,计算k步的转移概率矩阵 Pi(k) ,又一次转移概率矩阵自乘 k次得到。

3.6 预测下一个状态

  下一个状态的预测概率通过相同状态的各个预测概率加权和得到,计算用到公式:

                       

       最后一步的时候要注意,要根据最后k期的历史数据所在状态值和步长的权值相乘。滞时期为1的数据,是最后1期数据(最新的数据),这个循环的时候要注意,很容易掉进坑里。

4.离散型马尔可夫链模型代码

  本文使用C#实现了简单的离散型马尔可夫链模型,在验证马氏性的时候,由于需要查表求值,所以暂时固定了自由度25,显著性水平0.05,模型核心代码:

 

  1 /// <summary>离散型马尔可夫链预测模型</summary>
  2     public class DiscreteMarkov
  3     {
  4         #region 属性
  5         /// <summary>样本点状态时间序列,按照时间升序</summary>
  6         public List<int> StateList { get; set; }
  7         /// <summary>状态总数,对应模型的m</summary>
  8         public int Count { get; set; }
  9         /// <summary>概率转移矩阵Pij</summary>
 10         public List<DenseMatrix> ProbMatrix { get; set; }
 11         /// <summary>各阶的自相关系数</summary>
 12         public double[] Rk { get; set; }
 13         /// <summary>各阶的权重/summary>
 14         public double[] Wk { 
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
C#实现马尔可夫链构建双色球预测模型,可以按照以下步骤进行: 1. 定义状态集合S,包括红球1~33和蓝球1~16,可以使用枚举类定义状态。 ```csharp enum Ball { Red1, Red2, Red3, Red4, Red5, Red6, Red7, Red8, Red9, Red10, Red11, Red12, Red13, Red14, Red15, Red16, Red17, Red18, Red19, Red20, Red21, Red22, Red23, Red24, Red25, Red26, Red27, Red28, Red29, Red30, Red31, Red32, Red33, Blue1, Blue2, Blue3, Blue4, Blue5, Blue6 } ``` 2. 定义转移概率矩阵P和初始概率向量π,可以使用二维数组和一维数组表示。 ```csharp double[,] P = new double[49, 49]; double[] pi = new double[49]; ``` 3. 读取历史双色球开奖数据,统计各个状态的出现次数,计算出转移概率矩阵P和初始概率向量π。 ```csharp // 读取历史双色球开奖数据 List<Ball[]> history = ReadHistoryData(); // 统计各个状态的出现次数 int[] count = new int[49]; for (int i = 0; i < history.Count; i++) { Ball[] balls = history[i]; for (int j = 0; j < balls.Length; j++) { count[(int)balls[j]]++; } } // 计算转移概率矩阵P和初始概率向量π for (int i = 0; i < 49; i++) { pi[i] = (double)count[i] / (6 * history.Count); for (int j = 0; j < 49; j++) { P[i, j] = (double)CountTransitions(history, (Ball)i, (Ball)j) / (6 * (history.Count - 1)); } } ``` 其中,ReadHistoryData()函数用于从文件或数据库中读取历史数据,CountTransitions()函数用于统计相邻两期双色球开奖号码的转移次数。 4. 根据当前状态和转移概率矩阵,可以计算下一期双色球开奖号码的概率分布,可以使用一维数组表示。 ```csharp double[] prob = new double[49]; Ball[] current = GetCurrentBalls(); // 获取当前期双色球开奖号码 // 计算下一期双色球开奖号码的概率分布 for (int i = 0; i < 49; i++) { double p = 0; for (int j = 0; j < current.Length; j++) { p += P[(int)current[j], i]; } prob[i] = pi[i] * p; } ``` 其中,GetCurrentBalls()函数用于获取当前期双色球开奖号码。 5. 根据概率分布,可以预测下一期双色球开奖号码。 ```csharp Ball[] predict = new Ball[7]; for (int i = 0; i < 6; i++) { int index = GetIndexByProbability(prob); predict[i] = (Ball)index; prob[index] = 0; } Array.Sort(predict, 0, 6); int indexBlue = GetIndexByProbability(prob); predict[6] = (Ball)indexBlue; ``` 其中,GetIndexByProbability()函数用于根据概率分布随机生成一个状态,预测结果存储在predict数组中。 需要注意的是,以上仅是一个简单的双色球预测模型,实际应用时需要结合更多的数据和方法进行分析,才能得到更准确的预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值