曾经有一个买彩票发大财的梦想(好像不只我有这样的梦,很多人都有吧),那些年偶尔买些彩票,也中些5元的10元,去彩票销售处经常看到很多买彩票的人都在分析号码走势图,那个走势图那么多期,眼睛都看花了,能从中看出点规律来买了就中,估计只有赌神了。那时我天真的认为彩票估计还是有规律的,只是那个规律难以发现罢了。后来学习了概率论等数学方面的知识,这规律就是:随机的。再到后来,随着阅历增多和有关彩票的新闻等我逐渐认识到了在国内你想买彩票中大奖基本上就是白日做梦,原因......,你懂的,其实啦,我通过程序统计发现开奖号码近似成均匀分布,这个说了等于没有说,买彩票主要还是靠运气和人品的。后来学习了Matlab,在学习过程中,不知怎么想的,就想利用Matlab对彩票进行一下分析,说动手就动手,好在Matlab在处理数据这方面还是很简洁的,因此程序主体到没花多长时间就搭建好了,但是在后期去确定一个探索的目标或项目,例如当前期出现的号和前几期相关性比较大,每一期重复数字一般有几个等问题,倒是费了一些时间。下面就来说说。
我主要分析了七星彩,其实买彩票的双色球销量远超七星彩,因为奖池奖金高呀。分析七星彩主要是它的七个数字都是0-9,处理分方便些,双色球跨度大些,而且还有红号和蓝号,统计有些麻烦。当初想的是一个分析好了,另外一个也差不多。分析彩票主要分两步:一是获取原始数据,二是按预定的目标统计分析其规律。 最开始是我搭建好程序后,获取数据就用复制粘贴,想想要获得十几年的数据(好像是从2002开始发售的吧),这真不是棒法,不过就是这十几年的数据也就1800多组吧,因为这个彩票一周开两次,想想一年也就100组左右,双色球一样。这个对现在流行的大数据分析和神经网络训练简直不够晒牙缝。后面想到Matlab一定能处理这个从网上派去数据的功能。毕竟是牛逼的商业软件,这个都不能,估计在竞争中早挂了。我的这个坚定的想法是对的,后来我发现可以利用Matlab的正则表达式就可干这个事。这个可以参考我的:利用Matlab正则表达式爬取网页数据这篇博客。
下面就直接看程序吧,这样比较直观明了些。
%%2015/07/18 by DQ tic; clc; close all; clear all; load('SourceData.mat');%网页上爬去的七星彩数据 %A4=s(1:12,:);%仅供试验测试用 A4=s(4+12*12*8:end,:); Str1=pwd; for Month=5:12%months Str2=sprintf('result%d.xls',Month); PathNam=[Str1 '\' Str2]; Group=12*Month;%每月12期,k2为分析数据分析组数 Pk=Month-1;%预定的一个常数用来评判分析结构中的取舍Pk=Month; [rowA4,~]=size(A4); SheetNum=floor(rowA4/Group);%一共可以分几组 for Sheet=1:SheetNum%同一文件下含有多少张表 A=A4(Group*(Sheet-1)+1:Group*Sheet,:); [M,N]=size(A);%数据尺寸,取了m组数据,N=7 SheetCount=Sheet; RangeS=sprintf('sheet%d',SheetCount);%第几张表 %%%A B %%统计整体中0-9的情况。 RowCount=1;%行标 sfreq=tabulate(A(:)); [f,n]=sort(sfreq(:,2),'descend');%第二列为频数,按频数的从高到低排列 t=sfreq(:,1); Zp=[t(n),f]; Zp(Zp(:,2)<=Pk,:)=[]; [mZp,~]=size(Zp); if mZp<1 mZp=1; Zp=[0,0]; end Title={'整体中 ','0-9的情况'};%项目名称 RangeT=sprintf('A%d:B%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('A%d:B%d',RowCount,mZp+RowCount-1);%数据放置位置 xlswrite(PathNam,Zp,RangeS,RangeD); RowCount=RowCount+mZp; %%%A B %%统计每一列的情况 for i=1:7 sfreq=tabulate(A(:,i)); [f,n]=sort(sfreq(:,2),'descend'); t=sfreq(:,1); Zp=[t(n),f]; Zp(Zp(:,2)<=Pk,:)=[]; [mZp,~]=size(Zp); if mZp<1 mZp=1; Zp=[0,0]; end Title={['第',num2str(i),'列中'],'0-9的情况'};%项目名称 RangeT=sprintf('A%d:B%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('A%d:B%d',RowCount,mZp+RowCount-1);%数据放置位置 xlswrite(PathNam,Zp,RangeS,RangeD); RowCount=RowCount+mZp; end %%%D E %%行和值';'行方差';'行平方和'~'行七方和','1~7相乘','2~8相乘','3~9相乘' RowCount=1;%行标 kk1=1:7;k1=kk1'; kk2=2:8;k2=kk2'; kk3=3:9;k3=kk3'; Event={'行和值';'行方差';'行平方和';'行立方和';... '1~7相乘';'2~8相乘';'3~9相乘'}; Method={'sum(A,2)';'var(A,1,2)';'sum(power(A,2),2)';'sum(power(A,3),2)';... 'A*k1';'A*k2';'A*k3'}; for I=1:7 RowVal=eval(Method{I}); MinVal=min(RowVal); MaxVal=max(RowVal); Interval=(MaxVal-MinVal)/10; XIndex=zeros(10,1); XXIndex=cell(10,1); for i=1:11 XIndex(i)=floor(MinVal+(i-1)*Interval); if i>1 XXIndex(i-1)={sprintf('%d —%d',XIndex(i-1),XIndex(i))}; end end HistFreq=hist(RowVal); [SortHistFreq,HistFreqIndex]=sort(HistFreq,'descend'); Xaxle=XXIndex(HistFreqIndex); ReserveRowN=6; SortHistFreq(end-(10-ReserveRowN-1):end)=[]; Xaxle(end-(10-ReserveRowN-1):end)=[]; ResultVal=cell(ReserveRowN,2); ResultVal(:,1)=Xaxle; for i=1:ReserveRowN ResultVal{i,2}=SortHistFreq(i); end Title={Event{I},'频数'};%项目名称 RangeT=sprintf('D%d:E%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('D%d:E%d',RowCount,ReserveRowN+RowCount-1);%数据放置位置 xlswrite(PathNam,ResultVal,RangeS,RangeD); RowCount=RowCount+ReserveRowN; %%总计和当下组数 SumSortHistFreq=sum(SortHistFreq); Title={'总计/组数',[num2str(SumSortHistFreq),'/',num2str(M)]};%项目名称 RangeT=sprintf('D%d:E%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; end %%%G H %%行中的极小值 RowCount=1;%行标 rowmin=min(A,[],2);%提取每行中的最小值 rowmax=max(A,[],2);%提取每行中的最大值 freqrowmin=tabulate(rowmin);%极值的频率 [fj1,nj1]=sort(freqrowmin(:,2),'descend'); tj1=freqrowmin(:,1); Jx=[tj1(nj1),fj1]; Jx(Jx(:,2)<=Pk,:)=[]; [mJx,~]=size(Jx); if mJx<1 mJx=1; Jx=[0,0]; end Title={'极小值','频数'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,mJx+RowCount-1);%数据放置位置 xlswrite(PathNam,Jx,RangeS,RangeD); RowCount=RowCount+mJx; %%%G H %%总计和当下组数 SumJx=sum(Jx(:,2)); Title={'总计/组数',[num2str(SumJx),'/',num2str(M)]};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; %%%G H %%行中的极大值 freqrowmax=tabulate(rowmax); [fj2,nj2]=sort(freqrowmax(:,2),'descend'); tj2=freqrowmax(:,1); Jd=[tj2(nj2),fj2]; Jd(Jd(:,2)<=Pk,:)=[]; [mJd,~]=size(Jd); if mJd<1 mJd=1; Jd=[0,0]; end Title={'极大值','频数'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,mJd+RowCount-1);%数据放置位置 xlswrite(PathNam,Jd,RangeS,RangeD); RowCount=RowCount+mJd; %%%G H %%总计和当下组数 SumJd=sum(Jd(:,2)); Title={'总计/组数',[num2str(SumJd),'/',num2str(M)]};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; %%%G H %%整体中的奇偶性 t1=A(:); t2=mod(t1,2); OddNum=sum(t2); EvenNum=size(t1,1)-OddNum; Jo=[OddNum,EvenNum]; Title={'整体奇性','整体偶性'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,RowCount);%数据放置位置 xlswrite(PathNam,Jo,RangeS,RangeD); RowCount=RowCount+1; %%%G H %%行中奇偶性 t3=mod(A,2); OddNum=sum(t3,2); freqrowjs=tabulate(OddNum); [fjs,njs]=sort(freqrowjs(:,2),'descend'); tjs=freqrowjs(:,1); Js=[tjs(njs),fjs]; Js(Js(:,2)<=Pk,:)=[]; [mJs,~]=size(Js); if mJs<1 mJs=1; Js=[0,0]; end Title={'行中的','奇频数'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,mJs+RowCount-1);%数据放置位置 xlswrite(PathNam,Js,RangeS,RangeD); RowCount=RowCount+mJs; %%%G H %%总计和当下组数 SumJs=sum(Js(:,2)); Title={'总计/组数',[num2str(SumJs),'/',num2str(M)]};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; %%%G H %%整体中的质合性 CountP=0; for i=1:M for j=1:N if A(i,j)==1||A(i,j)==2||A(i,j)==3||A(i,j)==5||A(i,j)==7 CountP=CountP+1; end end end CountC=M*N-CountP; CountPC=[CountP,CountC]; Title={'整体质性','整体合性'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,RowCount);%数据放置位置 xlswrite(PathNam,CountPC,RangeS,RangeD); RowCount=RowCount+1; %%%G H %%行中的质合数 CountRowP=zeros(M,1); for i=1:M for j=1:N if A(i,j)==1||A(i,j)==2||A(i,j)==3||A(i,j)==5||A(i,j)==7 CountRowP(i)=CountRowP(i)+1; end end end freqprim=tabulate(CountRowP); [Val,Ind]=sort(freqprim(:,2),'descend'); t=freqprim(:,1); Prime=[t(Ind),Val]; Prime(Prime(:,2)<=Pk,:)=[]; [mPrim,~]=size(Prime); if mPrim<1 mPrim=1; Prime=[0,0]; end Title={'行中的','质频数'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,mPrim+RowCount-1);%数据放置位置 xlswrite(PathNam,Prime,RangeS,RangeD); RowCount=RowCount+mPrim; %%%G H %%总计和当下组数 SumPrime=sum(Prime(:,2)); Title={'总计/组数',[num2str(SumPrime),'/',num2str(M)]};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; %%%G H %%行中重复数字 NumCount0=0;NumCount1=0;NumCount2=0;NumCount3=0; NumCount4=0;NumCount5=0;NumCount6=0;NumCount7=0; NumCount8=0;NumCount9=0;CfCount=0; for i=1:M freqcf=tabulate(A(i,:)); [fcf,ncf]=sort(freqcf(:,2),'descend'); if fcf(1)>=2%如果最高频数大于等于2,则有重复的数字,可以统计 CfCount=CfCount+1;%又有一期是有重复号码的。 index=find(fcf>=2); t=freqcf(:,1); tt=t(ncf); ttt=tt(index); for j=1:length(index) switch ttt(j) case 0 NumCount0=NumCount0+fcf(j); case 1 NumCount1=NumCount1+fcf(j); case 2 NumCount2=NumCount2+fcf(j); case 3 NumCount3=NumCount3+fcf(j); case 4 NumCount4=NumCount4+fcf(j); case 5 NumCount5=NumCount5+fcf(j); case 6 NumCount6=NumCount6+fcf(j); case 7 NumCount7=NumCount7+fcf(j); case 8 NumCount8=NumCount8+fcf(j); case 9 NumCount9=NumCount9+fcf(j); otherwise error('this is wrong'); end end end end Title={'总体中','重复频数'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,RowCount);%数据放置位置 xlswrite(PathNam,[M CfCount],RangeS,RangeD); RowCount=RowCount+1; Cf=[[0:9]',[NumCount0;NumCount1;NumCount2;NumCount3;NumCount4;... NumCount5;NumCount6;NumCount7;NumCount8;NumCount9]]; Cf(Cf(:,2)<=Pk,:)=[]; [mCf,~]=size(Cf); if mCf<1 mCf=1; Cf=[0,0]; end Title={'0-9重复','频数'};%项目名称%此处频数为用重复数字行中数字总重复次数 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,RowCount+mCf-1);%数据放置位置 xlswrite(PathNam,Cf,RangeS,RangeD); RowCount=RowCount+mCf; %%%G H %%整体被3除的情况 Amod=mod(A,3); sfreq=tabulate(Amod(:)); [f,n]=sort(sfreq(:,2),'descend');%第二列为频数,按频数的从高到低排列 t=sfreq(:,1); Zp=[t(n),f]; Zp(Zp(:,2)<=Pk,:)=[]; [mZp,nZp]=size(Zp); if mZp<1 mZp=1; Zp=[0,0]; end Title={'整体中','除3的情况'};%项目名称 RangeS=sprintf('sheet%d',SheetCount);%第几张表 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,mZp+RowCount-1);%数据放置位置 xlswrite(PathNam,Zp,RangeS,RangeD); RowCount=RowCount+mZp; %%%G H %%每一列被3除的情况 for i=1:7 sfreq=tabulate(Amod(:,i)); [f,n]=sort(sfreq(:,2),'descend'); t=sfreq(:,1); Zp=[t(n),f]; Zp(Zp(:,2)<=Pk,:)=[]; [mZp,nZp]=size(Zp); if mZp<1 mZp=1; Zp=[0,0]; end Title={['第',num2str(i),'列中'],'除3的情况'};%项目名称 RangeT=sprintf('G%d:H%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('G%d:H%d',RowCount,mZp+RowCount-1);%数据放置位置 xlswrite(PathNam,Zp,RangeS,RangeD); RowCount=RowCount+mZp; end %%%J K %%行中相邻之间的差值 RowCount=1;%行标 Diff=zeros(M,N); for i=1:7 if i<=6 Diff(:,i)=A(:,i+1)-A(:,i);%没采用diff函数是因为考虑用for连续读写 else Diff(:,i)=A(:,i)-A(:,i-6); end freqerror=tabulate(Diff(:,i));%统计差值的频率 [fer,ner]=sort(freqerror(:,2),'descend'); t=freqerror(:,1); Cz=[t(ner),fer]; Cz(Cz(:,2)<=Pk,:)=[]; [mCz,~]=size(Cz); if mCz<1 mCz=1; Cz=[0,0]; end if i<=6 Title={['第',num2str(i+1),num2str(i)],'列之间差值的情况'};%项目名称 else Title={['第',num2str(i),num2str(i-6)],'列之间差值的情况'};%项目名称 end RangeT=sprintf('J%d:K%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('J%d:K%d',RowCount,mCz+RowCount-1);%数据放置位置 xlswrite(PathNam,Cz,RangeS,RangeD); RowCount=RowCount+mCz; %%%J K %%总计和当下组数 SumCz=sum(Cz(:,2)); Title={'总计/组数',[num2str(SumCz),'/',num2str(M)]};%项目名称 RangeT=sprintf('J%d:K%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; end %%%J K %%行中非零数 RowNonZeroN=zeros(M,1); for i=1:M RowNonZeroN(i)=nnz(A(i,:)); end RNZNfreq=tabulate(RowNonZeroN); [f,n]=sort(RNZNfreq(:,2),'descend'); t=RNZNfreq(:,1); Zp=[t(n),f]; Title={'行中非零数','数量'};%项目名称 RangeT=sprintf('J%d:K%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('J%d:K%d',RowCount,mZp+RowCount-1);%数据放置位置 xlswrite(PathNam,Zp,RangeS,RangeD); RowCount=RowCount+mZp; %%%J K %%总计和当下组数 SumZp=sum(Zp(:,2)); Title={'总计/组数',[num2str(SumZp),'/',num2str(M)]};%项目名称 RangeT=sprintf('J%d:K%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; %%%J K %%列中含零数 ColZeroN=zeros(N,1); for i=1:N ColZeroN(i)=M-nnz(A(:,i)); end tempk=1:7; Zp=[tempk',ColZeroN]; mZp=N; Title={'第i列中零数','数量'};%项目名称 RangeT=sprintf('J%d:K%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; RangeD=sprintf('J%d:K%d',RowCount,mZp+RowCount-1);%数据放置位置 xlswrite(PathNam,Zp,RangeS,RangeD); RowCount=RowCount+mZp; %%%J K %%总计和当下组数 SumZp=sum(Zp(:,2)); Title={'总计/组数',[num2str(SumZp),'/',num2str(M*N)]};%项目名称 RangeT=sprintf('J%d:K%d',RowCount,RowCount);%项目名称放置位置 xlswrite(PathNam,Title,RangeS,RangeT); RowCount=RowCount+1; %%当前进度 str = sprintf('Now the program has ran %d months %d sheets', Month, Sheet); disp(str); end end toc;由于其他文件独立于这个程序,它含有其他的目标分析,文件有点多我统一打包放在这里了:
http://download.csdn.net/download/lingyunxianhe/9963742