Gambler's Ruin Problem and 3 Solutions
In my stochastic processes class, Prof Mike Steele assigned a homework problem to calculate the ruin probabilities for playing a game where you with 1 dollar with probability p and lose 1 dollar with probability 1-p. The probability of winning is not specified, so it can be a biased game. Ruin probabilities are defined to be the probability that in a game you win 10 before losing 10, win 25 before losing 25, and win 50 before losing 50, etc. In total, I found three distinct methods to calculate.
This is a particularly great example to illustrate how to solve a problem using three fundamentally different methods: the first is theoretical calculation, second is simulation to obtain asymptotic values, and third is numerical linear algebra (matrix algorithm) which also gives exact values.
Method 1: First Step Analysis and Direct Computation of Ruin Probabilities
Let h(x) be the probability of winning $n before losing stake of x dollars.
First step analysis gives us a system of three equations: h(0) = 0; h(n) = 1; h(x) = p*h(x+1) + (1-p)*h(x-1).
How to solve this system of equations? We need the "one" trick and the telescoping sequence.
The trick is: (p + (1-p)) * h(x) = h(x) = p*h(x+1) + (1-p)*h(x-1) => p*(h(x+1) - h(x)) = (1-p)*(h(x) - h(x-1)) => h(x+1) - h(x) = (1-p)/p * (h(x)-h(x-1))
Denote h(1) - h(0) = c, which is unknown yet, we have a telescoping sequence: h(1) - h(0) = c; h(2) - h(1) = (1-p)/p * c; h(3) - h(2) = ((1-p)/p)^2 * c ... h(n) - h(n-1) = ((1-p)/p)^(n-1) * c.
Now, add up the telescoping sequence and use the initial conditions, we get: 1 = h(n) = c*(1+ ((1-p)/p) + ((1-p)/p)^2 + ... + ((1-p)/p)^(n-1)) => c = (1 - (1-p)/p) / (1 - ((1-p)/p)^N-1). So h(x) = c * (((1-p)/p) ^ x - 1) / ((1-p)/p)-1) = (((1-p)/p) ^ x - 1) / (((1-p)/p)^N - 1)
Method 2: Monte Carlo Simulation of Ruin Probabilities
The idea is to simulate sample paths from initial stake of x dollars and stop when it either hits 0 or targeted wealth of n.
We can specify the number of trials and get the percentage of trials which eventually hit 0 and which eventuallyhit n. This is important - in fact, I think the essence of Monte Carlo method is to have a huge number of trials to maintain accuracy, and to get a percentage of the number of successful trials in the total number of trials.
In each step of a trial, we need a Bernoulli random variable (as in a coin flip) to increment x by 1 with probability p and -1 with probability 1-p.
In Python this becomes:
from numpy import random
import numpy as np def MC(x,a,p):
end_wealth = a
init_wealth = x
list = []
for k in range(0, 1000000):
while x!= end_wealth and x!= 0:
if np.random.binomial(1,p,1) == 1:
x += 1
else:
x -= 1
if x == a:
list.append(1)
else:
list.append(0)
x = init_wealth
print float(sum(list))/len(list) MC(10,20,0.4932)
MC(25,50,0.4932)
MC(50,100,0.4932)
You can see the result of this simulation by plugging in p = 0.4932 = (18/37)*.5 + .5*.5 = 0.4932, which is the probability of winning the European Roulette with prisoner's rule. As the number of trials get bigger and bigger, the result gets closer and closer to the theoretical value calculated under Method 1.
Method 3: Tridiagonal System
According to wiki, a tridiagonal system has the form of a_i * x_i-1 + b_i * x_i + c_i * x_i+1 = d_i where i's are indices.
It is clear that the ruin problem exactly satisfies this form, i.e. h(x) := probability of winning n starting from i, h(x) = (1-p)*h(x-1) + p*h(x+1) => -(1-p)*h(x-1) + h(x) -p*h(x+1) = 0, h(0) = 0, h(n) = 1.
And therefore, for the tridiagonal matrix, the main diagonal consists of 1's, and the upper diagonal consists of -(1-p)'s, and the lower diagonal consists of -p's.
In Python this becomes:
import numpy as np
from scipy import sparse
from scipy.sparse.linalg import spsolve n = 100
p = 0.4932
q = 1-p d_main = np.ones(n+1)
d_super = -p * d_main
d_super[1] = 0
d_sub = -q * d_main
d_sub[n-1] = 0 data = [d_sub, d_main, d_super]
print data
A = sparse.spdiags(data, [-1,0,1], n+1, n+1, format='csc') b = np.zeros(n+1)
b[n] = 1
x = spsolve(A, b)
print x
Gambler's Ruin Problem and 3 Solutions的更多相关文章
- [Introduction to programming in Java 笔记] 1.3.8 Gambler's ruin simulation 赌徒破产模拟
赌徒赢得机会有多大? public class Gambler { public static void main(String[] args) { // Run T experiments that ...
- 比特币_Bitcoin 简介
2008-11 Satoshi Nakamoto Bitcoin: A Peer-to-Peer Electronic Cash System http://p2pbucks.com/?p=99 ...
- Bitcoin: A Peer-to-Peer Electronic Cash System
Bitcoin: A Peer-to-Peer Electronic Cash System Satoshi Nakamoto October 31, 2008 Abstract A purely p ...
- Mathematics for Computer Science (Eric Lehman / F Thomson Leighton / Albert R Meyer 著)
I Proofs1 What is a Proof?2 The Well Ordering Principle3 Logical Formulas4 Mathematical Data Types5 ...
- [0x01 用Python讲解数据结构与算法] 关于数据结构和算法还有编程
忍耐和坚持虽是痛苦的事情,但却能渐渐地为你带来好处. ——奥维德 一.学习目标 · 回顾在计算机科学.编程和问题解决过程中的基本知识: · 理解“抽象”在问题解决过程中的重要作用: · 理解并实现抽象 ...
- URAL 1430 Crime and Punishment
Crime and Punishment Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- Attention and Augmented Recurrent Neural Networks
Attention and Augmented Recurrent Neural Networks CHRIS OLAHGoogle Brain SHAN CARTERGoogle Brain Sep ...
- Win7 服务优化个人单机版
我的PC设备比较旧了,为了系统能流畅点,不必要的服务就不开启了.然而,服务那么多,每次重装,都要从头了解一下一边,浪费时间. 个人在网络上收集信息并结合自己的摸索,整理如下,以备查找. 服务名称 显 ...
- [转]WIN7服务一些优化方法
本文转自:http://bbs.cfanclub.net/thread-391985-1-1.html Win7的服务,手动的一般不用管他,有些自动启动的,但对于有些用户来说是完全没用的,可以考虑禁用 ...
随机推荐
- Windows服务二:测试新建的服务、调试Windows服务
一.测试Windows服务 为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点.像其他应用程序一样,Windows服务也是在Program.cs的Main ...
- 转 Visual C++ 将整合Clang
原文见:http://www.solidot.org/story?sid=45898 微软在11月释出的Visual C++更新将整合Clang开源C和C++编译器,开发者将可以用Clang编译Win ...
- ssh config host
Host mygithub HostName github.com User git IdentityFile ~/.ssh/github/id_rsa IdentitiesOnly yes
- The user specified as a definer ('root'@'%') does not exist
The user specified as a definer ('root'@'%') does not exist 此种报错主要是针对访问视图文件引起的(没有权限) 解决方法: 2.进入mysql ...
- 第15章 .NET中的反射
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- openstack快速封装镜像
本来是该写对接ceph的,但是临时有事了,必须先弄镜像,因此提前写这个了,我个人不是按官网来封装镜像的,是按自己的习惯,所以觉得信不过的可以用官网的方式,有兴趣的可以看看都知道,openstack创建 ...
- 串口控RGB三色灯
本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:串口控RGB三色灯 使用函数: Serial.flush(); / ...
- C/C++ 记录时间
http://stackoverflow.com/questions/2808398/easily-measure-elapsed-time https://github.com/picanumber ...
- SpringMVC框架搭建 基于注解
本文将以一个很简单的案例实现 Springmvc框架的基于注解搭建,一下全为个人总结 ,如有错请大家指教!!!!!!!!! 第一步:创建一个动态web工程(在创建时 记得选上自动生成 web.xml ...
- ssh批量互信脚本
#!/bin/sh#date:2016-05-17#wrinte:lxh cat ./iplist.txt |grep -v "^$" >iplist.tmpiplist=. ...