小白量化彩票實戰(1)彩票分析及爬蟲雙色球彩票開獎資料
彩票選號碼有兩類:一是自主組號,二是軟體算號,
1、自主組號,主要用自己認為的吉祥號,例如生榷訓有特殊意義,特殊感覺的號碼,但是這些選出的號碼多于彩票號碼,,就需要依賴程式軟體進行條件過濾和縮水投注,
2、軟體算號,主要通過計算機統計,利用大數定理,概率統計,以及深度學習等工具,進行電腦選號,
如果直接選出中大獎的號碼,因為概率太低,例如雙色球中獎概率1700多萬分支一,基本不可能,但是我們分析開獎號碼條件,
一等獎:6+1
二等獎:6
三等獎:5+1
四等獎:5、4+1
五等獎:4、3+1
六等獎:2+1、1+1、0+1
我們發現只要中藍球,至少會得5元,因此我們以藍號為中獎目標,但是藍號有16個號,中獎概率為1/16,
一注彩票2元錢,假設我們一期開獎投注2注4元錢,投注2個藍號,如果任意一個選中,我們就獲得5元,贏利5-4=1元錢,
如何能夠選2個藍號,就能中5元錢,
首先要會“舍得”,不要每期都投注,這樣你必敗在大數定律中,因為長期統計,每個藍號出現的幾率,無限接近1/16,彩票機構就是賺大多數投注錯的人的錢,
寫《戰勝莊家》的索普是如何賭場賺錢的?1960年代初,一位名叫索普(Edward Thorp)的美國數學家利用剛出現不久的計算機找到了21點游戲中的機會,發展出一套通過計牌(card counting)打敗賭場的方法,索教授理論付諸實踐,用自己的計牌法連連大勝賭場,
索普計牌法的原理并不難, 先講講21點的規則:玩家和莊家(賭場)對賭,看誰手中牌的點數之和更接近(但不能超過)21點, 10,J,Q,K都算十點,2至9 按各自點數計算,A可以算1點也可以算11點, 例如下面的一手牌可以算8點,也可以算18點,
牌局開始,玩家和莊家各發兩張牌,莊家的牌一明一暗(例如下圖), 然后玩家先做決定:可以抓牌,做加倍等特殊行動,或在任何時候選擇“停”,如果玩家超過21點(爆牌)就直接輸了,否則“停”后輪到莊家行動, 莊家不能“見機行事”,只能按固定規則:手中的牌達到17點或以上必須“停”,否則必須抓,最后雙方比誰的牌更接近21點,
此外還有個特殊規定:一張A和一張十點牌(10,J,Q,K)叫“黑杰克”(Blackjack),拿到者直接取勝, 如果玩家拿到黑杰克,可贏取1.5倍籌碼,莊家拿到黑杰克只能贏取1倍籌碼,
很明顯,21點游戲中莊家和玩家各有優勢, 莊家的優勢在“后發制人”:玩家如果先爆牌,莊家可以不戰而勝,而玩家的優勢在于靈活機動,可以根據自己的牌和莊家暴露的那張牌決定戰術,此外,黑杰克3:2的賠率也有利于玩家,
十點牌和A越多,出現黑杰克的機會越多,也越容易爆牌,玩家“機動靈活”的優勢更有價值, 反之,3,4,5,6等小牌越多,爆牌的可能性越小,對莊家比較有利,索普時代的21點多用1副或2副撲克牌,當牌剛洗好時,賭場占據0.5%左右的概率優勢, 妙處在于,隨著牌局進行,某些時候大牌和A的比例會變高,概率會轉為對玩家有利, 索普戰勝賭場的方法就是:通過計牌估算概率,當形勢有利時下大賭注!
讀者要學會讀文抽象:只有對自己有利的情況下才下注,
既然雙色球藍號概率只有1/16,我們什么時候去買呢?
我們對彩票籃球號碼提取特征,藍號可以分大小號,1-8大號,9-16小號,又可以分奇偶號,號碼大小號和奇偶號出現的概率為1/2,因此根據大數定理,奇號和大號不會持續連出,
假定奇號和大號連出3期,我們藍球可以選擇偶數小號來買,我們只能選2,4,6,8號等4個號,仍然超出我們選擇的范圍,我們再提取特征,余三(即除3的余數,0,1,2),同樣依賴大數定理,同樣的模式出現只有1/3的概率,他們連出就要排排除,
假定我們發現有三期大號,奇數,余三2連出,排除后,我們的選擇只有:4,6號,是不是滿足了我們的要求,
假定前面3期開獎號如下,大號,奇數,余三2連出:
02 03 13 18 20 31, 11
06 10 13 25 26 32, 11
06 09 16 18 22 29, 11
我們藍號選擇只有:4,6號,我們選了這2個號投注,出現獎號“02 03 07 08 17 22, 15”沒有買中,藍15是大號,奇號,余三0,因此根據大數定理排除了藍6,只剩藍4號投注了,
我們再次投注2注藍4,結果開獎“07 09 14 26 30 31, 04”,我們獲利10-4-4=2元,
你會說,哪有那么巧,確實那么巧,上面5期是雙色球2021001-2021005的開獎號,
假如是1/2幾率贏后投注翻倍的游戲,例如比大小,想贏就要采用“馬丁策略”,只壓大或小單向,虧錢后,壓注翻倍,只要本金足夠多,贏1次,就全贏,
如果贏率只有40%的幾率的游戲,本金有限,怎么夠最佳自己投注呢?這就要使用“凱利公式”,
形勢有利時如何下注很需要技巧,押太少了浪費機會,押太多了“犧牲”的風險大增, 什么才是不多不少的合適賭注呢? 1956年,科學家凱利(John Kelly)就此發表了論文,提出了著名的凱利公式,
f* = (bp - q) / b
其中,f* = 投注金額占總資金的比例,p = 獲勝的概率,q = 失敗的概率,q = 1-p,b = 賠率,
例如在輪盤賭中押單個數字,b = 35,押紅黑,b = 1,
凱利公式指明了風險控制的至關重要性:即便是正期望值的游戲也不能押太大的賭注, 從數學上講,押注資金比例超過了凱利值,長期的贏錢速度反而下降, 舉個極端的例子,如果你每手都押上全部資金,那么不管你贏過多少錢,只要輸一次就立刻破產,正所謂:辛辛苦苦幾十年,一夜回到解放前,
投資和投注是一門科學,如同玩游戲,假定你玩帝國時代或者星際爭霸游戲,你打算把游戲中金錢全部造兵,去賭一把去分勝負?還是想造農民來種田挖礦?
把投資看作游戲,你會感覺賺錢很容易,感覺賺錢很容易,是從戰略上來說的,從整體上來說,要輕視它,從每一區域來說,要重視它,虧錢會讓你心痛,任何投資莫過如此,
后面文章,以雙色球為例,介紹如何通過小白量化金融模塊來分析彩票,
我們先用Python爬蟲資料,獲取全部雙色球彩票資料,下面給出雙色球爬蟲代碼,
import requests
from bs4 import BeautifulSoup
# 發起請求
basic_url = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
response = requests.get(basic_url, headers=headers, timeout=10)
response.encoding = 'utf-8'
htm = response.text
# 決議內容
soup = BeautifulSoup(htm, 'html.parser')
# 獲取頁數資訊
page = int(soup.find('p', attrs={"class": "pg"}).find_all('strong')[0].text)
url_part = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list'
ssq=''
ssqhm=[]
for i in range(1, page+1):
url = url_part + '_' + str(i) + '.html'
res = requests.get(url, headers=headers, timeout=10)
res.encoding = 'utf-8'
context = res.text
soups = BeautifulSoup(context, 'html.parser')
if soups.table is None:
continue
elif soups.table:
table_rows = soups.table.find_all('tr')
for row_num in range(2, len(table_rows)-1):
row_tds = table_rows[row_num].find_all('td')
ems = row_tds[2].find_all('em')
result = row_tds[0].string +', '+ row_tds[1].string +', '+ems[0].string+' '+ems[1].string+' '+ems[2].string+' '+ems[3].string+' '+ems[4].string+' '+ems[5].string+', '+ems[6].string
td2 = row_tds[3].find_all('strong')
ss=td2[0].string
ss=ss.replace(',','')
result=result+','+ss
td3 = row_tds[4].find_all('strong')
result=result+','+td3[0].string
td4 = row_tds[5].find_all('strong')
result=result+','+td4[0].string
ssq=result+'\n'+ssq
print(result)
def save_to_file(content):
with open('ssq.txt', 'w', encoding='utf-8') as f:
f.write(content + '\n')
save_to_file(ssq)
采集結果保存到ssq.txt檔案中了,
2020-12-31, 2020134, 02 09 10 20 22 26, 01,399565532,48,275
2021-01-03, 2021001, 02 03 13 18 20 31, 11,411170524,10,126
2021-01-05, 2021002, 06 10 13 25 26 32, 11,374374440,10,185
2021-01-07, 2021003, 06 09 16 18 22 29, 11,360514540,5,136
2021-01-10, 2021004, 02 03 07 08 17 22, 15,396531778,2,208
2021-01-12, 2021005, 07 09 14 26 30 31, 04,359757108,14,76
2021-01-14, 2021006, 06 08 22 24 25 26, 01,367900704,10,194
2021-01-17, 2021007, 02 04 12 21 25 32, 16,389232822,3,104
2021-01-19, 2021008, 01 05 07 14 18 33, 07,358122646,4,86
2021-01-21, 2021009, 02 04 07 24 25 32, 13,367324734,4,57
2021-01-24, 2021010, 01 04 11 19 32 33, 05,394795416,7,129
2021-01-26, 2021011, 05 10 16 23 27 33, 14,358439884,18,228
2021-01-28, 2021012, 03 06 14 18 20 26, 01,365486356,17,218
2021-01-31, 2021013, 06 09 12 16 27 31, 06,403024326,17,169
2021-02-02, 2021014, 04 15 21 25 29 33, 06,365029152,3,96
2021-02-04, 2021015, 06 14 16 26 28 29, 07,373264066,6,93
2021-02-07, 2021016, 03 08 09 13 15 18, 10,447622614,16,192
2021-02-21, 2021017, 09 15 18 29 32 33, 02,442443732,6,116
2021-02-23, 2021018, 02 08 14 23 25 32, 06,352299530,3,128
我們使用小白量化,必須使用pandas的DataFrame 物件來用仿通達信公式統計分析,一次我們再把ssq.txt檔案改為容易處理的ssq.csv格式,下面給出程式,
import math
import datetime as dt
import pandas as pd
import numpy as np
import random
df=pd.read_csv('ssq.txt' , encoding= 'gbk',header=None)
df.rename(columns={0:'date', 1:'qh', 2:'hh',3:'lh',4:'tz',5:'j1',6:'j2'}, inplace = True)
df['h1']=[int(x.strip().split(' ')[0]) for x in df.hh.astype(str)]
df['h2']=[int(x.strip().split(' ')[1]) for x in df.hh.astype(str)]
df['h3']=[int(x.strip().split(' ')[2]) for x in df.hh.astype(str)]
df['h4']=[int(x.strip().split(' ')[3]) for x in df.hh.astype(str)]
df['h5']=[int(x.strip().split(' ')[4]) for x in df.hh.astype(str)]
df['h6']=[int(x.strip().split(' ')[5]) for x in df.hh.astype(str)]
df['sumh']=df['h1']+df['h2']+df['h3']+df['h4']+df['h5']+df['h6']
df.to_csv('ssq.csv' , encoding= 'gbk')
print(df)
處理后的結果如下:
date qh hh lh ... h4 h5 h6 sumh
0 2003-02-23 2003001 10 11 12 13 26 28 11 ... 13 26 28 100
1 2003-02-27 2003002 04 09 19 20 21 26 12 ... 20 21 26 99
2 2003-03-02 2003003 01 07 10 23 28 32 16 ... 23 28 32 101
3 2003-03-06 2003004 04 06 07 10 13 25 3 ... 10 13 25 65
4 2003-03-09 2003005 04 06 15 17 30 31 16 ... 17 30 31 103
5 2003-03-13 2003006 01 03 10 21 26 27 6 ... 21 26 27 88
6 2003-03-16 2003007 01 09 19 21 23 26 7 ... 21 23 26 99
小白量化彩票模塊演示:
import math
import datetime as dt
import pandas as pd
import numpy as np
import HP_cp as hcp #小白量化彩票模塊
##排列型彩票
print('福彩3D的中獎概率:',1/hcp.cfpl(r=3))
print('福彩3D的全部號碼:\n',hcp.qplh2(m=3))
print('福彩雙色球的中獎號碼總數:',hcp.zh(r=6,n=33)*16)
print('隨機福彩雙色球5注號碼:')
for i in range(5):
for h in hcp.randhm(r=6,m=33,n=1):
print(h,end=' ')
print(' + ',hcp.randone(m=10,n=1))
#獲取本地ssq.csv雙色球資料
df=pd.read_csv('ssq.csv' , encoding='gbk')
print(df)
程式運行結果:
福彩3D的中獎概率: 0.001
福彩3D的全部號碼:
['000', '001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019', '020', '021', '022'
...
福彩雙色球的中獎號碼總數: 17721088
隨機福彩雙色球5注號碼:
4 10 12 15 25 29 + 7
3 8 13 16 22 23 + 4
2 4 9 13 25 33 + 9
4 11 19 20 26 33 + 10
1 3 7 21 27 28 + 1
Unnamed: 0 date qh ... h5 h6 sumh
0 0 2003-02-23 2003001 ... 26 28 100
1 1 2003-02-27 2003002 ... 21 26 99
2 2 2003-03-02 2003003 ... 28 32 101
3 3 2003-03-06 2003004 ... 13 25 65
后面文章將介紹彩票特征分析,統計,仿通達信指標分析,深度學習以及過濾和縮水等技術,
請點贊本文,你的鼓勵是我寫作的動力!
請持續關注我的博客,我的進步,就是你的進步!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263828.html
標籤:python
