原文:【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】

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

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

1.马尔可夫链预测模型介绍[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,模型核心代码:

 /// <summary>离散型马尔可夫链预测模型</summary>
public class DiscreteMarkov
{
#region 属性
/// <summary>样本点状态时间序列,按照时间升序</summary>
public List<int> StateList { get; set; }
/// <summary>状态总数,对应模型的m</summary>
public int Count { get; set; }
/// <summary>概率转移矩阵Pij</summary>
public List<DenseMatrix> ProbMatrix { get; set; }
/// <summary>各阶的自相关系数</summary>
public double[] Rk { get; set; }
/// <summary>各阶的权重/summary>
public double[] Wk { get; set; }
/// <summary>频数矩阵/summary>
public int[][] CountStatic { get; set; }
/// <summary>目标序列是否满足"马氏性"/summary>
public Boolean IsMarkov { get; set; }
/// <summary>滞时期,K/summary>
public int LagPeriod { get; set; } /// <summary>预测概率</summary>
public double[] PredictValue { get; set; }
#endregion #region 构造函数
public DiscreteMarkov(List<int> data, int count,int K = )
{
this.StateList = data;
this.LagPeriod = K;
this.Count = count;
this.CountStatic = StaticCount(data, count);
this.ProbMatrix = new List<DenseMatrix>();
var t0 = DenseMatrix.OfArray(StaticProbability(this.CountStatic).ConvertToArray<double>());
ProbMatrix.Add(t0); for (int i = ; i < K; i++) //根据CK方程,计算各步的状态转移矩阵
{
var temp = ProbMatrix[i - ] * t0;
ProbMatrix.Add(temp);
}
if (ValidateMarkov())
{
CorrCoefficient();
TimeWeight();
PredictProb();
}
else
{
Console.WriteLine("马氏性 检验失败,无法进行下一步预测");
}
}
#endregion #region 验证
/// <summary>验证是否满足马氏性,默认的显著性水平是0.05,自由度25</summary>
/// <returns></returns>
public Boolean ValidateMarkov()
{
//计算列和
int[] cp1 = new int[Count];
int allcount = CountStatic.Select(n => n.Sum()).Sum();//总数 for (int i = ; i < Count; i++)
{
for (int j = ; j < Count; j++) cp1[i] += CountStatic[j][i];
}
double[] cp = cp1.Select(n => (double)n / (double)allcount).ToArray(); //计算伽马平方统计量
double gm = ;
for (int i = ; i < Count; i++)
{
for (int j = ; j < Count; j++)
{
if (CountStatic[i][j] != )
gm += * CountStatic[i][j] * Math.Abs(Math.Log(ProbMatrix[][i,j] / cp[j], Math.E));
}
}
//查表求a = 0.05时,伽马分布的临界值F(m-1)^2,如果实际的gm值大于差别求得的值,则满足
//查表要自己做表,这里只演示0.05的情况 卡方分布
return gm >= 37.65;
} /// <summary>计算相关系数</summary>
public void CorrCoefficient()
{
double mean = (double)StateList.Sum() /(double) StateList.Count;//均值 double p = StateList.Select(n => (n - mean)*(n-mean)).Sum(); Rk = new double[LagPeriod]; for (int i = ; i < LagPeriod; i++)
{
double s1 = ;
for (int L = ; L < StateList.Count - LagPeriod ; L++)
{
s1 += (StateList[L] - mean) * (StateList[L + i] - mean);
}
Rk[i] = s1 / p;
}
} /// <summary>计算滞时的步长</summary>
public void TimeWeight()
{
double sum = Rk.Select(n=>Math.Abs(n)).Sum();
Wk = Rk.Select(n => Math.Abs(n) / sum).ToArray();
} /// <summary>预测状态概率</summary>
public void PredictProb()
{
PredictValue = new double[Count];
//这里很关键,权重和滞时的关系要颠倒,循环计算的时候要注意
//另外,要根据最近几期的出现数,确定概率的状态,必须取出最后几期的数据 //1.先取最后K期数据
var last = StateList.GetRange(StateList.Count - LagPeriod, LagPeriod);
//2.注意last数据是升序,最后一位对于的滞时期 是k =1
for (int i = ; i < Count; i++)
{
for (int j = ; j < LagPeriod; j++)
{
//滞时期j的数据状态
var state = last[last.Count - - j] - ;
PredictValue[i] += Wk[j] * ProbMatrix[j][state ,i];
}
}
}
#endregion #region 静态 辅助方法
/// <summary>统计频数矩阵</summary>
/// <param name="data">升序数据</param>
public static int[][] StaticCount(List<int> data, int statusCount)
{
int[][] res = new int[statusCount][]; for (int i = ; i < statusCount; i++) res[i] = new int[statusCount]; for (int i = ; i < data.Count - ; i++) res[data[i]-][data[i + ]-]++; return res;
}
/// <summary>根据频数,计算转移概率矩阵</summary>
/// <param name="data">频率矩阵</param>
public static double[][] StaticProbability(int[][] data)
{
double[][] res = new double[data.Length][];
for (int i = ; i < data.Length; i++)
{
int sum = data[i].Sum();
res[i] = data[i].Select(n => (double)n / (double)sum).ToArray();
}
return res;
}
#endregion
}

调用方法很简单,如下代码:这里使用的是论文文献中的数据,单个号码的随机概率为8.3%,程序预测的概率可以到25-30%的样子,应该还有调整的空间。

  //历史状态数据
List<int> data = new List<int>(){
,,,,,,,,,, ,,,, , ,,,, , ,,,,,
,,,,,,,,,, ,,,, , ,,,, , ,,,,,
,,,,,,,,,, ,,,,, ,,,,, ,,,,,
,,,,,,,,,, ,,,,, ,,,,, ,,,,,
,,,,,,,,,, ,};//,6,4,3,6,2,5,5,5 var result = new DiscreteMarkov(data, ,);

5.实际案例

哈哈,请关注博客,年后将根据此算法,对高频彩快3和11选5进行实证分析。因为这个过程有点复杂,不是一下子可以搞定的。

本文的相关文字资料,公式和数据来源根据这篇文献:“马尔可夫链预测模型及一些应用”,2012.3 温海彬

文中的矩阵相乘用到了Math.NET组件。这里下载:http://www.kuaipan.cn/file/id_4279479643945457.htm?source=1

有玩高频彩(快3,11选5)的朋友,可以到群(群号:280182639),一起交流心得。

最后,彩票风险很大,购彩需谨慎。你的热情和推荐,是我的动力哦。

补充一下,其中有一个扩展方法,进行数组转换的,忘记贴上去了:

 public static T[,] ConvertToArray<T>(this T[][] data)
{
T[,] res = new T[data.Length, data[].Length];
for (int i = ; i < data.Length; i++)
{
for (int j = ; j < data[i].Length; j++) res[i, j] = data[i][j];
}
return res;
}

【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】的更多相关文章

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

    前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. 已经3个月没写博客了,因为业余时间一直在研究彩票,发现还是有很多乐趣,偶尔买买,娱 ...

  2. 数据预测算法-ARIMA预测

    简介 ARIMA: AutoRegressive Integrated Moving Average ARIMA是两个算法的结合:AR和MA.其公式如下: 是白噪声,均值为0, C是常数. ARIMA ...

  3. HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据

    本篇代码可在 http://download.csdn.net/detail/fansy1990/8502323下载. 前篇<HotSpot关联规则算法(1)-- 挖掘离散型数据>分析了离 ...

  4. 基于PySpark的网络服务异常检测系统 (四) Mysql与SparkSQL对接同步数据 kmeans算法计算预测异常

    基于Django Restframework和Spark的异常检测系统,数据库为MySQL.Redis, 消息队列为Celery,分析服务为Spark SQL和Spark Mllib,使用kmeans ...

  5. MATLAB分类与预测算法函数

    1.glmfit() 功能:构建一个广义线性回归模型. 使用格式:b=glmfit(X,y,distr),根据属性数据X以及每个记录对应的类别数据y构建一个线性回归模型,distr可取值为:binom ...

  6. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...

  7. [C#] 使用 Excel 和 Math.Net 进行曲线拟合和数据预测

    以前在工作中遇到了一个数据错误的问题,顺便写下 用 Math.Net 解决的思路. 1. 错误的数据 上图是同一组探测器在同一天采集到的 19 次数据,总体来说重复性不错,但很明显最后 8 个探测器出 ...

  8. 接受第三方app分享的数据

    前段时间公司项目需要一个需求: 把第三方的app分享的数据接受到自己的apk中, 涉及到的第三方app是: Youtube/Amazon/NetFlix, 这些app通过分享功能把当前的信息分享出去. ...

  9. STL基础--算法(已排序数据的算法,数值算法)

    已排序数据的算法 Binary search, merge, set operations 每个已排序数据算法都有一个同名的更一般的形式 vector vec = {8,9,9,9,45,87,90} ...

随机推荐

  1. 玩转web之json(五)---将表单通过serialize()方法获取的值转成json

    form表单有一个serialize()方法,可以序列化表单的值,但是jquery提供的这个方法会把数据序列化为类似下面的形式: a=1&b=2&c=3&d=4 jquery并 ...

  2. Google Protocol Buffers和java字符串处理控制

    大多数的操作码被从夜晚复制.懒得敲. 直接在源代码和测试结果如下. serabuffer.proto档.使用下面的命令来生成java代码. protoc -I=./ --java_out=./ ser ...

  3. [文学阅读] METEOR: An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments

    METEOR: An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments Satanje ...

  4. 11gR2更换OCR和VOTE

    11gR2开始,OCR和VOTE它们被存储在ASM磁盘组,因此,更换OCR有两种方法,第一是使用ASM磁盘组drop disk数据重组后,另一种方法是OCR迁移到另一个磁盘组 第一种:add disk ...

  5. SQL server 表数据改变触发发送邮件

    今天遇到一个问题,原有生产系统正在健康运行,现需要监控一张数据表,当增加数据的时候,给管理员发送邮件. 领到这个需求后,有同事提供方案:写触发器触发外部应用程序.这是个大胆的想法啊,从来没写过这样的触 ...

  6. 玩转Web之Json(四)---json与(Object/List/Map)的相互转化

    在做web应用时,经常需要将json转化成Object/list/map或者将Object/List/map转化成json,通过简单封装可以在写代码是减轻很多负担.本文将给出json转化的一系列方法. ...

  7. Hadoop-2.2.0中文文档—— MapReduce下一代- 可插入的 Shuffle 和 Sort

    简单介绍 可插入的 shuffle 和 sort 功能,同意在shuffle 和 sort 逻辑中用可选择的实现类替换.这个情况的样例是:用一个不是HTTP的应用协议,如RDMA来 shuffle 从 ...

  8. Directx11学习笔记【十三】 实现一个简单地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5510294.html 上一个教程我们实现了渲染一个会旋转的立方体, ...

  9. curl 命令详解(转)

    命令事例 1.读取网页,将网页内容全部输出 curl http://www.linuxidc.com 2.保存网页.下载文件 以page.html命名下载网页:curl –o page.html ht ...

  10. 九度OJ 1177 查找 (模拟)

    题目1177:查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5659 解决:1667 题目描写叙述: 读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共同拥有 ...