Market、Handicap BetType and Odds Type
========================
###### tags: `SBK`
https://wenku.baidu.com/view/5117b2ebf8c75fbfc77db214.html?sxts=1563157632315
https://wenku.baidu.com/view/1bbc3b2fcfc789eb172dc8c7.html
http://sb.vcbapi.com/SportsRules/OddsTypes?lang=zh_Hans
https://www.pinnacle.com/zh-cn/betting-articles/Betting-Strategy/staking-one-method-to-improve-your-betting/2962VHE9W3JPJ7X7
https://www.pinnacle.com/zh-cn/betting-resources/category/betting-strategy
http://bbs.aibovip.com/forum.php?mod=viewthread&tid=115482
https://www.slideshare.net/DusaneInfotech/house-edge-for-casino-sports-betting-and-lottery
https://wizardofodds.com/games/sports-betting/
https://sports.qq.com/a/20120604/000476.htm
https://www.jianshu.com/p/f775886446ca
https://baike.baidu.com/item/%E8%BF%94%E8%BF%98%E7%8E%87
https://baike.baidu.com/item/%E5%8D%9A%E5%BD%A9%E4%B8%9A/9422069
https://baike.baidu.com/item/%E6%AC%A7%E8%B5%94%E6%A0%B8%E5%BF%83%E6%80%9D%E7%BB%B4
https://baike.baidu.com/item/%E4%BA%9A%E7%9B%98%E5%88%86%E6%9E%90%E6%B3%95/10037540
http://op1.win007.com/
https://www.pinnacle.com/en/betting-resources/betting-tools/margin-calculator
https://blog.ch-wind.com/%E8%8F%A0%E8%8F%9C%E4%B8%8E%E6%A6%82%E7%8E%87/
http://www.sohu.com/a/288893958_460558
https://kknews.cc/zh-tw/finance/j8ve8zp.html
https://bac88.net/?cat=43
https://www.55555365.com/Home/Article/detail/id/485.html
http://sportsfunbet.pixnet.net/blog/post/86926172-%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%8E%A9%E5%8D%9A%E5%BD%A9%E5%B0%B1%E4%B8%8A%E6%89%8B%EF%BC%9A%E6%AC%A7%E8%B5%94%E3%80%81%E9%A6%99%E6%B8%AF%E8%B5%94%E7%8E%87%E3%80%81%E5%8D%B0%E5%BA%A6
http://bc.cc5.cc/bocaizhinan/201302/776.html
https://yibets.com/what-do-you-know-about-different-types-of-odds/
https://wenku.baidu.com/view/8e7db40dcf84b9d528ea7aae.html?re=view
https://baike.baidu.com/item/%E4%BA%9A%E6%B4%B2%E7%9B%98%E5%8F%A3
http://sportsfunbet.pixnet.net/blog/post/86832500


# 歐賠
各大家娛樂網的分析結果
* 歷史紀錄的統計
* 人氣形勢
* 歷史淵源
* 戰意、球隊凝聚力
* 主客場戰績
* 近況
* 過往戰績
* 核心球員受傷、心理、生理等狀況
* 聯賽特性
* 排名
* 突發事件
[Poisson線上計算](https://sinceawin.com/data/tools/poisson)
根據上面各家自己算出來的主勝、客勝、和局的機率。

再把各機率取倒數, 得到賠率(期望值)
主勝賠率: 1/0.5198 = 1.92
客勝賠率: 1/0.2339 = 4.2753
和局賠率: 1/0.2462 = 4.0617
但這跟圖上的會不同,因為同上的會有margin做細微調整.
# 毛利 margin / 抽水(house edge)
其中 100 / 93.57% = 106.861
則margin = 6.861%
上面的各選項機率 * 106.861 會得到
0.5198 * 106.861 = 55.546%
0.2339 * 106.861 = 24.994%
0.2462 * 106.861 = 26.309%
主勝賠率 : 1 / 55.546% = 1.80
和賠率 : 1 / 24.99% = 4.00
客勝賠率 : 1 / 26.309% = 3.80
**得到跟Bet360一樣的賠率了**
用機率表示的原因?
因為 賠率(期望值)的倒數應該是和對應的投注成正比的.
因為表示發生的機會越高. 玩家勝出的機會也是越高的.
應該會有很多人來投注該選項, 對應的投注量也就很大.
表示莊家要賠錢的風險也越高.
Margin = 106.86%
其中的1是本金, 莊家要返還給玩家的, 剩下的才是莊家要賺的部份.
所以 1 / 106.86% = 93.57% 就是一場比賽的理論返還率.
[top 100 bookmakers ranking](https://www.top100bookmakers.com/profit-margin/)
[margin calculator](https://www.pinnacle.com/en/betting-resources/betting-tools/margin-calculator)
#### 操盤
同盤口的margin鮮少會在期間作異動, 因為賠率代表著風險, 也代表著銷量.
所以大的莊家幾乎margin不會改變, 變得是該盤的賠率.
# 凱利指數
公式?(各莊家的平均勝率*陪率 來計算) 怎來的? 不重要!
目的在於體現 冷門出現的可能性
凱利指數越低的, 莊家覺得越容易出現 ;
越高的表示月不容易開出 換言之 > 1 都不容易開出
# Handicap / Spread (讓分盤)
盤口 = 讓球
把假設的入球數字加給比較不被看好的隊伍上 ;
換句話說就是被看好的隊伍最後分數扣掉該數字.
只開出一個讓球盤, 俗稱單票
多個讓球盤, 俗稱套票

8種讓分的盤口

2種讓分的盤口
[亞洲盤](https://zh.wikipedia.org/wiki/%E4%BA%9E%E6%B4%B2%E7%9B%A4)
讓分有分成
* 讓半顆跟整數顆的讓分盤
* 目的 -> 沒有平手 ; 平手要去別的玩法(ex 1x2, double chance)
* 平手則投注作廢, 退回本金
* 讓0 : 賭輸贏
* 讓半球 : 讓球方以任何分數勝出, 就算贏(1:0) ; 平手,輸掉都算輸(1:1)
* 讓一球 : 讓球方以兩球以上勝出, 就算贏(3:1) ; 讓球方分數-1而平手, 退回本金(2:1) ; 其餘都是輸(1:1/0:1)
* 讓0.25跟0.75顆的亞洲讓分盤
* 0.25 : 平手退回本金/2 (基本不影響球隊輸贏)
* 0.75 : 讓球隊伍分數-1, 為平手退回本金/2
* 輸半: 只拿回本金/2
* 贏半: 賠率/2 * 本金
舉例 :
讓分盤口|比賽結果|主隊盤口贏|客隊盤口贏
------ |------|--------|---------
0(平手盤)| 1:0 | 主贏 | 客輸
0| 1:1 | **refund(走盤)** | **refund**
0| 0:1 | 主輸 | 客贏
-0.25(平手/半球) | 1:0(淨勝 >= 1) | 主贏 | 客輸
-0.25 | 1:1 | **贏半** | **輸半**
-0.25 | 0:1 | 主輸 | 客贏
-0.5(半球) | 1:0(淨勝 >= 1) | 主贏 | 客輸
-0.5 | 1:1 | 主輸 | 客贏
-0.5 | 0:1 | 主輸 | 客贏
-0.75(半球/1球) | 2:0(淨勝 >= 2) | 主贏 | 客輸
-0.75 | 1:0(淨勝 = 1) | **贏半** | **輸半**
-0.75 | 1:1 | 主輸 | 客贏
-0.75 | 0:1 | 主輸 | 客贏
-1(1球) | 2:0(淨勝 >= 2) | 主贏 | 客輸
-1 | 1:0(淨勝 = 1) | **refund** | **refund**
-1 | 0:0 | 主輸 | 客贏
-1 | 0:1 | 主輸 | 客贏
-1.5(球半)| | |
-2 (2球) | | |
# 亞洲盤
透過讓球盤, 讓兩個相差懸殊的球隊, 有機會在一個相對公平的平台上較勁, 從而拉平了雙方客觀上的實力差距.
主要是基於歐洲賠率為基礎開發出來的玩法.
早期由澳門博彩公司開發出來的, 後來印尼為主的沙巴體育, 菲律賓的明升, 歐洲的BET365、立博等陸續開出了讓分盤, 而為了拓展亞洲市場所以稱為亞洲盤.
### 上盤/下盤
* 上盤 : 讓球的一方 (主場球隊/比較被看好的球隊)
* 下盤 : 受讓的一方
### 升盤/降盤
* 升盤 : 該場從讓1.5變成 讓1.5/2, 上升了一個盤口
* 降盤 : 該場從最初的1.5變成了1/1.5, 下降了一個盤口
盤口來回震盪, 表示兩邊投注金額變化很大
盤口幾乎沒震盪, 表示兩邊payoff是平衡的.
最常發生在快開踢前, 表示場外較量異常激烈.
### 水位
雙方的獲勝賠率, 一組比例數據, 莊家獲取利潤的手段
雙方水位和 正常都< 2, 大概在1.8-1.9之間, 這距離1-2的差額就是莊家的直觀利潤.
舉例要是水位和=1.9; 兩邊賠率一樣
兩邊各被下注1000萬, 則最後比賽結束時, 莊家能收入100萬元.
# 初盤
一開始在早盤所開出的1x2和odds
最能體現兩隊之間的實力差距; 或是莊家對於兩隊的態度
# 即時
開踢前的1x2其賠率走勢

# 終賠(最終賠率)
就賽果反應在賠率上囉
也是最終人會買的時刻, 因為幾乎可以胸有成竹的去投注.
但也可能提早關盤.
終盤幾乎各家都會對齊, 只差在水位策略的細微調整.
# 賠率種類
* HongKong Odds [0, 100]
* \> 0 的正數, 不包含本金
* HK -> ML
* \> 1 : -1 / (odds)
* <= 1 : odds
* HK -> DEC
* odds + 1
* HK -> INDO
* \> 1 : odds
* <= 1 : -1 * (1/odds)
* HK -> American
* < 1 : -1 * (100 / odds)
* \>= 1 : 100 * odds
* MalaY Odds : [-1, 1]玩弱隊
* 負數(輸少) : 從餘額扣除 期望金額*(-1*賠率)的錢, 贏就是贏回跟期望金額一樣的錢 ; 換句話說, 我如果想要贏得期望金額這樣的金錢, 我需要投注 期望金額*(-1*賠率), 如果贏了, 返回期望金額
* 正數(贏少) : 跟HK一樣 返還投注金額*賠率
* ML -> HK :
* 負數 : 1 / (-1 * odds)
* 正數 : -1 * 1/odds-1_
Stake|Odds|Win|Lose |Draw
-----|----|---|-----|----
100 | 0.8 | 80 | -100 | 0
100 | -0.71| 100 | -71 | 0
* Decimal Odds (歐洲賠率) [1, 100]
*> 1 的正數, 包含本金
* DEC -> HK
* odds -1
* Indo Odds : 玩強隊 [-100, -1] , [1, 100]
* \>= 1 (贏多) : 投注100$, 贏了, 返還金額 = 投注金額*賠率 ; 輸了賠100\$
*
* < -1 (輸多) : 賠率-1.25 , 期望金額100$, 要從餘額扣除100*1.25 = 125\$, 這樣贏了才能獲得 100\$的期望金額; 輸掉就賠125\$, 125 > 100\$, 所以叫輸多
* Fractional Odds
* American Odds
* < 1 : 賠率113, 想淨勝100$, 要投入113\$
* [Myanmar Odds](https://onlinebettingservicemyanmar.blog/2019/05/30/how-to-bet-myanmar-odds-betting-lines/)
* +60
* -50
#### [Odds Converter](https://www.sportsbookreview.com/picks/tools/odds-converter/)
# Settle
------------------
專有名詞
https://yibets.com/betting-english-chinese-ultimate-glossary/
https://www.sporttery.cn/football/jcjq/2014/0109/89509.html
https://baike.baidu.com/item/%E5%8D%9A%E5%BD%A9%E4%B8%9A/9422069
https://bti-io.gitlab.io/betting-rules/zh/
------------------------
-------亂寫的東西-------------
mongo bson
## sport
sport : {
_id : objectId
src_code : string
src_id : int
src_nm : string
ps_id : int
ps_name : string
created : timestamp
modified : timestamp
}
## country
country {
_id : objectId
src_code : string
src_id : int //todo
code: string // ESP
nm : string //Spain
ps_id : int
ps_name : string
created : timestamp
modified : timestamp
}
## league
league: {
_id : objectId
src_code : string
src_id : int
src_sport_id : int
src_sport_nm : string
src_country_nm : string
src_country_code : string
src_nm : string
ps_id : int
created : timestamp
modified : timestamp
}
## competitor
competitor: {
_id : objectId
src_code : string
src_id : int
src_sport_id : int
src_sport_nm : string
src_nm : string
ps_id : int
created : timestamp
modified : timestamp
}
## player
player: {
_id : objectId
src_code : string
src_id : int
src_sport_id : int
src_sport_nm : string
src_nm : string
ps_id : int
created : timestamp
modified : timestamp
}
## venue
venue: {
_id : objectId
src_code : string
src_id : int
src_nm : string
ps_id : int
created : timestamp
modified : timestamp
}
## round
round: {
_id : objectId
src_code : string
src_nm : string
src_sport_id : int
src_sport_nm : string
ps_id : int
created : timestamp
modified : timestamp
}
## match
match: {
_id : objectId
src_code : string
src_id : int
src_sport_id : int
src_sport_nm : string
src_tournament_id : int
src_tournament_name : string
src_competitor_home_id: int
src_competitor_home_nm: string
src_competitor_away_id: int
src_competitor_away_nm: string
src_nm : string
src_scheduled_time: dateTime
neutral : bool // todo:是否中立場 預設 false
ps_id : int
ps_name: string
created : timestamp
modified : timestamp
}
## odds list
odds_list :{
_id : objectId
src_code : string
src_market_id : int
src_market_name : string
src_match_id : int
ps_match_id : int
ps_market_id : int
handicap : string // 讓分盤: 主隊(受)讓球數 大小:球頭
timestamp : timestamp
odds : [
{
selection_id : int
selection_nm : string // 高於低於 , 波膽:1:0
odds : double
active : bool
}
]
}
## alias list
alias_list :{
_id : objectId
type : string
locale : string
alias : string
ps_name : string
ps_id : int
}
## protobuf
```json
{
type : string
sendTime : uint64
amount: uint16
data: bytes
}
```
---
launch cli -> 砍黨
league 打完寫黨
team打完血黨
player打完血黨
---
GROUP A
""
3. HNL: South
```
message Match {
int64 src_id=1;
string nm=2; // outright name
int64 src_sport_id = 3;
string src_sport_name = 4;
int64 src_league_id=5;
string src_league_name = 6;
int64 src_home_id =7;
string src_home_name =8;
int64 src_away_id=9;
string src_away_name=10;
int64 src_venue_id=11;
int64 src_round_id=12;
int64 src_round=13;
int64 src_group_id=13;
string src_group = 14;
int64 schedule_time=15; // UTC
int64 schedule_end; // UTC for outright
bool neutral=16;
enum type =17; // match, outright, virtual
int status = 18; // not-started, started, completed, cancel, delay, live
enum has_live ; //not available, available
string info ; // additional information, free text, delayed info, cancel reason
}
```
```
syntax = "proto3";
package broker;
// import "common.proto";
option go_package="build";
message Matches {
repeated Match matches = 1;
// repeated Common.data data = 1;
}
message Match {
int64 src_id=1;
string name = 2;
MatchTypes type =3;
MatchStatus status=4;
int64 src_sport_id=5;
string src_sport_name=6;
int64 src_league_id =7;
string src_league_name=8;
int64 src_home_id=9;
string src_home_name=10;
int64 src_away_id=11;
string src_away_name=12;
bool neutral=13;
bool has_live=14;
int64 schedule_time=15;
int64 schedule_end=16;
int64 src_venue_id=17;
int64 src_round_id=18;
string src_round=19;
string src_group=20;
string info=21;
}
enum MatchTypes {
match=0;
outright=1;
virtual=2;
}
enum MatchStatus {
not_started=0;
started=1;
live=2;
finish=3;
cancel=4;
delay=5;
}
```
```
- match :
{
"id": bigint,
"name": "string",
"matchType": uint8 enum, // 0 : match ; 1: outright:1 ; 2 : virtual
"sport_id": int,
"sport_name": "string",
"country_id": int,
"country_name": "string",
"league_id": int,
"league_name": "string",
"kickoff_time": "date time",
"season" : season,
"round" : round,
"competitors" : competitor array,
"has_live": boolean,
"status": int enum , // 0 : not_started; 1: started, 2: live; 3: finish; 4: cancel ; 5: delay
"market_set": market array,
"is_neutral" : boolean,
"matchStats": {
},
"timeInfo" : {
},
}
- season :
{
"id" : uint,
"name": string
}
- competitor :
{
"competitor" : team,
"home_away": uint8, // 0 : home ; 1: away
"type" : uint8 // 0 : team, 1 : person; 2 : doublesPartnership
}
- team :
{
"id" : bigint, // an immutable identifier for a teams
"name" : string,
}
- market_type :
{
"id": uint,
"name": string,
}
- market :
{
"id": bigint, // an immutable identifier for a market
"market_type": market_type,
"match_id": bigint,
"sequence": int, // sequence number for the same market
"trading_status": int, // 0 : open ; 1 :suspend ; 2 : closed
"handicap": decimal , // hdp, ou, total,
"specifier": string , // for other sports or player name or ???
"is_live": boolean,
"selections: selection array,
"timestamp" : bigint
}
- selection :
{
"outcome": outcome,
"trading_status": int, // 0 : open ; 1 :suspend ; 2 : closed
"odds": decimal, // original price for 100% margin
}
- outcome:
{
"id" : int, // an immutable identifier for the outcome
"name" : string,
}
```