Paris tháng 5, cuối tuần lạnh lẽo, ở nhà khui bia, nghe Within Temptation và chuẩn bị viết về một vài thứ thú vị mới nghĩ đến.
Và đó là cờ bạc. Việc sử dụng máy tính trong các trò cờ bạc có lẽ đã có từ rất lâu rồi. Ở nhiều nước châu Âu, ngoài casino được điều hành bởi con người (nhưng bị hạn chế rất nhiều), thì các cửa hàng slot machine khá phổ biến, và có lẽ cũng thu được khá nhiều tiền. Tuy nhiên bài này sẽ không nói về việc làm thế nào để sản xuất những cái máy sao cho thu được càng nhiều tiền từ người chơi càng tốt, mặc dù đề tài đó chắc cũng khá thú vị. Bài này nói về một dạng cờ bạc đặc thù là cá cược.
Trong cá cược các môn thể thao, có 2 loại chính là kèo châu Âu và kèo châu Á. Nói chung kèo châu Á phức tạp hơn một chút, trong khi kèo châu Âu rất trực quan, dễ chơi và có phần “tổng quát” hơn. Bài này sẽ nói về kèo châu Âu, kèo châu Á sẽ trở lại trong một bài khác.
1. Từ toán phổ thông…
Bài toán cá cược kiểu kèo châu Âu có thể được mô hình hóa như sau: trước một sự kiện A nào đó có thể có các kết quả , nhà cái (bookmarker) ra tỉ lệ đặt cược cho mỗi outcome
một tỉ lệ khác nhau là
. Theo đó nếu người chơi đặt số tiền m vào cửa
thì nếu sự kiện A có kết quả
, người chơi sẽ thắng cược với số tiền
. Cách viết thông thường cho tỉ lệ cá cược này là
.
Trong bóng đá thì mỗi trận là một sự kiện, và có 3 kết quả là đội 1 thắng, hòa, hoặc đội 2 thắng. Ngoài ra các trận quan trọng còn có các sự kiện khác như thắng trong 90 phút hay hiệp phụ, cá cược tỉ số v.v… Đây là loại cá cược phổ biến nhất. Mô hình nói trên tương đối tổng quát vì có thể áp dụng trong hầu hết các trường hợp. Chẳng hạn với trò tài xỉu đơn thuần, thì tỉ lệ đều là 1:1 cho cả 2 trường hợp tài và
xỉu. Tuy nhiên các trò tài xỉu thực tế còn có thể dùng tỉ lệ 1:8 cho cửa hòa, và có thể trừ tiền hoa hồng nếu đặt cược vào cửa nhà cái v.v… Các trò khác như vé số, đánh đề… tuy số lượng outcome có thể nhiều hơn nhưng vẫn có thể mô hình hóa bằng mô hình trên.
Tất nhiên ta sẽ không sa đà vào các loại cá cược cụ thể (mà nếu viết đầy đủ thì có thể nhiều hơn vài quyển luận án). Ta sẽ stick với mô hình tổng quát bên trên và viết vài suy luận để thấy một số kết quả trực quan đến bất ngờ. Lưu ý là trong phần dưới đây, ta sẽ đơn giản hóa một chút, nhưng vẫn khá gần với thực tế. Các nhà cái trong thực tế, để tối đa hóa lợi nhuận, có nhiều cách khác mà ta sẽ bàn đến ở cuối đoạn này.
Tạm thời giả sử ta chỉ có 2 cửa, và tỉ lệ đặt cược lần lượt là 1:x và 1:y. Ta sẽ xét từ 2 góc độ.
1.1. Góc độ nhà cái
Xét từ góc độ nhà cái, bài toán đặt ra là làm thế nào chọn tỉ lệ x, y tốt nhất sao cho nó tối đa hóa lợi nhuận. Giả sử tổng số tiền của tất cả người chơi đặt vào 2 cửa lần lượt là a và b, thì lợi nhuận của nhà cái nếu cửa 1 xảy ra là và lợi nhuận nếu cửa 2 xảy ra là
. Điều này là hiển nhiên vì tổng số tiền nhà cái thu được là
, và nhà cái phải bỏ ra
hoặc
tùy vào kết quả.
Vậy tóm lại tỉ lệ đặt cược tốt nhất có thể tìm bằng cách giải bài toán tối ưu sau:
s.t.
Hai điều kiện đầu tiên là đảm bảo nhà cái lúc nào cũng có lãi, bất kể kết quả thực sự. Hai điều kiện cuối là để đảm bảo tỉ lệ cược lúc nào cũng lớn hơn 1 (thì mới có người đặt).
Như vậy cho trước số tiền mà người chơi đặt (a và b), nhà cái có thể chọn tỉ lệ tối ưu? Chuyện đời không dễ vậy, vì nó còn phụ thuộc vào cách định nghĩa hàm mục tiêu . Người viết bài này đã thử vài hàm đơn giản, nhưng bài toán trên vẫn ill-posed và không có lời giải tối ưu.
Tuy nhiên ta vẫn có thể xét trường hợp tệ nhất để tìm tỉ lệ đặt cược tốt. Xuất phát từ 2 điều kiện đầu tiên, ta có:
Như vậy để đảm bảo không lỗ trong bất kì trường hợp nào, nhà cái cần đặt tỉ lệ thỏa:
Đơn giản. Chỉ cần có người đặt cược cho cả 2 cửa (a, b > 0) thì sẽ có cách đặt tỉ lệ sao cho nhà cái không bao giờ thua!
Điều này thực ra khá dễ hiểu. Với trường hợp chỉ có 2 cửa thì sự ràng buộc giữa a và b làm cho lựa chọn của x, y khó hơn. Chẳng hạn nếu a rất lớn so với b thì có thể chọn y khá lớn (và thu hút nhiều người đặt vào cửa y, nghĩa là làm cho b tăng lên), nhưng x sẽ phải gần 1 hơn (giảm sự hứng thú của người chơi vào cửa a) . Tuy nhiên sự ràng buộc này sẽ lỏng hơn khi có nhiều cửa đặt cược. Một cách tổng quát, ta có thể viết lại các bất đẳng thức trên trong trường hợp nhiều cửa như sau:
Càng có nhiều cửa thì giới hạn của càng được nới rộng, do đó tỉ lệ thắng của nhà cái càng cao hơn.
Tuy nhiên, đây là cách làm nhà cái rất ngây thơ. Trong thực tế thì:
- Tỉ lệ đặt cược được nhà cái điều chỉnh liên tục trước khi sự kiện kết thúc, do đó tỉ lệ đặt cược không còn là hằng số như trong mô hình trên. Tuy nhiên có thể điều chỉnh phương pháp trên dễ dàng bằng cách sử dụng a, b là số tiền đặt cho tới thời điểm hiện tại, và thay đổi tỉ lệ một cách “greedy” sao cho nó tốt nhất, tính tới thời điểm hiện tại.
- Đó vẫn chưa phải là tất cả. Không có nhà cái nào lại chỉ muốn không lỗ trong mọi trường hợp, mà còn muốn maximize lợi nhuận trong mọi trường hợp (!) Dựa vào tri thức về sự kiện sắp diễn ra (phong độ các đội bóng v.v…) nhà cái có thể dự đoán kết quả thật của sự kiện, và đưa thông tin này vào mô hình như là một dạng prior. Việc dự đoán đương nhiên có thể do một đội ngũ chuyên gia đánh giá, hoặc do một mô hình máy học nào đó thực hiện. Việc xây dựng mô hình dự đoán kết quả là một việc khác và không bàn tới trong bài này, nhưng bản thân việc sử dụng tri thức prior như thế nào cũng xứng đáng dành nhiều thời gian xem xét. Ta sẽ trở lại tình huống này trong phần sau.
1.2. Góc độ người chơi
Một cách tương tự, từ góc độ người chơi, bài toán đặt ra là nếu ta có số tiền là N, làm thế nào để đặt cược sao cho không thua trong mọi trường hợp? Một cách tương tự, giả sử trong trường hợp chỉ có 2 cửa, ta có các bất đẳng thức sau:
Trong đó a, b là số tiền người chơi đặt cho mỗi cửa (thay vì tổng số tiền đặt của tất cả mọi người, như trong phần trước). Đương nhiên a, b có thể bằng 0. Cho trước tỉ lệ đặt cược của nhà cái, chỉ cần tìm a, b thỏa các bất đẳng thức trên thì ta sẽ đảm bảo không thua trong mọi tình huống. Trong trường hợp có 3 cửa (như bóng đá) thì:
Tuy nhiên chuyện đời không dễ dàng. Nhà cái cũng biết điều đó nên sẽ đặt tỉ lệ sao cho không thể tìm được a, b thỏa mãn các bất đẳng thức trên, nghĩa là làm cho hệ trên vô nghiệm. Ngoài ra có thể cấm một người đặt nhiều cửa (nhưng nói chung là khó làm trong trường hợp cá độ bóng đá). Vậy người chơi phải làm sao?
Trong lúc rảnh rỗi, người viết bài này đã viết một đoạn mã Python đơn giản cho trường hợp cá độ bóng đá. Chẳng hạn lấy tỉ lệ trận chung kết C1 Dortmund-Bayern tối nay là 4.80 – 4.20 – 1.79 (Dortmund thắng 1:4.8; Bayern thắng 1:179; Hòa 1:4.2), và ta có tối đa 100*3 = 300 EUR, khi chạy lệnh
$ python bestBet.py 4.8 4.2 1.79 100
thì chương trình sẽ cho cái hình như sau:
Trên hình ghi rõ nếu ta đặt tiền cho các cửa là 17.93, 26.69 và 7.31 thì nếu Dortmund thắng, ta được lãi 34.15EUR, nếu hòa thì lãi 60.15EUR, và lỗ 38.84 EUR khi Bayern thắng. Đương nhiên ta có thể thay đổi số tiền đặt cho Dortmund ở thanh slider ở góc dưới, và click vào đồ thị để chọn số tiền đặt cho 2 cửa còn lại. Mọi tính toán sẽ được cập nhật theo vị trí được chọn. Các đường thẳng trên đồ thị chính là các bất phương trình trên. Phần có gạch đứt nét là nửa mặt phẳng positive của phương trình tương ứng. Theo đó nếu ta chọn 1 điểm bên phải của đường màu xanh (tương ứng với trường hợp Hòa) thì ta sẽ có lãi khi 2 đội hòa.
Như vậy điểm “tối ưu” ta muốn chọn là phần giao của 3 nửa mặt phẳng positive của cả 3 đường, khi đó ta sẽ có lãi bất kể kết quả. Điểm được chọn càng xa các đường thẳng thì lãi càng nhiều. Tuy nhiên như đã nói, nhà cái thường biết tình huống này nên sẽ không bao giờ để chuyện đó xảy ra (nếu có thì chỉ xảy ra khi x=y=z=0, tức là không đặt cược).
Trong trường hợp trận chung kết C1 này thì quả thực không thể tìm ra phần “tối ưu” đó. Tuy nhiên ta có thể chọn 1 điểm nằm ở phần positive của 2 trong 3 đường trên, như vậy ta sẽ có lãi trong 2/3 trường hợp. Như vậy cũng đã khá tốt rồi, tốt hơn nhiều so với việc chỉ đặt 1 cửa. Kết hợp với tri thức khác (chẳng hạn ta tin rằng trong 90 phút hoặc Bayern thắng hoặc là hòa) thì ta sẽ chọn 2 đường thẳng tương ứng và maximize lợi nhuận trong khoản budget ta có.
Mặc dù vậy các trường hợp “tối ưu” không phải là không có. Chẳng hạn với tỉ lệ 5.55 – 2.5 – 3 và khoảng 1000 EUR vốn thì ta có cơ hội có lãi khoảng 100 EUR như trong hình sau:
Mã nguồn Python khá đơn giản và có thể xem trên github.
2. Đến xác suất và thống kê trong cá cược
Như đã nói ở trên, nhà cái thông thường muốn tối đa hóa lợi nhuận dựa trên tri thức về sự kiện sắp diễn ra. Cách mô hình hóa thông thường là xem tỉ lệ cá cược dưới ý nghĩa xác suất của nó. Tri thức của nhà cái sẽ được xem như là “chân lí” và quả thực sự kiện sẽ tuân theo phân bố xác suất “chân lí” đó. Khi đó người ta nghĩ ra nhiều cách để đặt kèo sao cho tối đa hóa lợi nhuận và ngăn chặn các trường hợp người chơi đặt cả 3 cửa để thắng chắc. Lý thuyết này không hẳn mới và đã có nhiều sách viết về nó. Tuy nhiên ta sẽ trở lại sau khi có dịp.
