使用R中的矩阵模拟投注结果

时间:2014-07-07 18:28:20

标签: r matrix simulation

考虑以下矩阵和变量 INITIAL_WEALTH = 1000

每列都是模拟,每一行都是模拟的一步:

bet_pct_wealth (每次下注时实际财富的百分比)

       [,1]   [,2]   [,3]   [,4]   [,5]
[1,] 0.0467 0.0700 0.0467 0.0467 0.0700
[2,] 0.0350 0.0700 0.0350 0.0467 0.0350
[3,] 0.0280 0.0467 0.0467 0.0467 0.0467
[4,] 0.1400 0.0700 0.0700 0.0700 0.0467
[5,] 0.0350 0.0467 0.0350 0.0700 0.0350
[6,] 0.0700 0.0700 0.0350 0.0700 0.0700

bet_results (1表示我赢了下注0表示我输了)

      [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    1    1
[2,]    0    0    1    1    0
[3,]    1    1    1    1    0
[4,]    1    1    0    0    0
[5,]    0    0    1    0    0
[6,]    0    0    0    0    0

bet_payoff (如果我赢得了与总赌注相关的赔率,我将获得多少奖金)

     [,1] [,2] [,3] [,4] [,5]
[1,]    3    2    3    3    2
[2,]    4    2    4    3    4
[3,]    5    3    3    3    3
[4,]    1    2    2    2    3
[5,]    4    3    4    2    4
[6,]    2    2    4    2    2

我想要做的是创建另一个矩阵,在每一步显示什么是我的实际财富。因此,模拟步骤如下:

1-)每次模拟的初始Wealth = 1000,因此我得到的矩阵的第一行是:

total_wealth

      [,1] [,2] [,3] [,4] [,5]
[1,]  1000 1000 1000 1000 1000 

2-)我的第一轮投注将是

total_wealth[1,]*bet_pct_wealth[1,]

如果我赢了赌注,我的total_wealth [2,]将是:

 total_wealth[1,] +  total_wealth[1,] * bet_pct_wealth[1,0] * bet_payoff[1,0]

如果我松了

 total_wealth[1,] -  total_wealth[1,]  * bet_pct_wealth[1,0]

然后你重复模拟直到你得到(舍入2位小数):

        [,1]      [,2]     [,3]     [,4]      [,5]
[1,]    1000      1000     1000     1000      1000
[2,]    953,3     930      953,3    1140,1    1140
[3,]    919,93    864,9    1086,76  1299,83   1100,1
[4,]    1048,72   986,07   1239,02  1481,94   1048,73
[5,]    1195,54   1124,12  1152,29  1378,2    999,75
[6,]    1153,7    1071,62  1313,61  1281,73   964,76
[7,]    1072,94   996,61   1267,63  1192,01   897,23

关于如何使用3个矩阵获得第四个矩阵的任何想法?我可以在没有矩阵的情况下编码这个模拟,你可以在这里看到:

https://quant.stackexchange.com/questions/12868/kelly-capital-growth-investment-strategy-example-in-r

但结果模拟非常缓慢。

1 个答案:

答案 0 :(得分:4)

您提供了一些示例数据以及您希望看到的结果,这很棒。如果您提供人们可以简单地复制和粘贴以获取数据的代码,您可能会发现您得到了更好的响应。例如,

bet_pct_wealth <- structure(c(0.0467, 0.035, 0.028, 0.14, 0.035, 0.07, 0.07, 0.07, 
0.0467, 0.07, 0.0467, 0.07, 0.0467, 0.035, 0.0467, 0.07, 0.035, 
0.035, 0.0467, 0.0467, 0.0467, 0.07, 0.07, 0.07, 0.07, 0.035, 
0.0467, 0.0467, 0.035, 0.07), .Dim = c(6L, 5L))

bet_results <- structure(c(0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 
1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L), .Dim = c(6L, 5L))

bet_payoff <- structure(c(3L, 4L, 5L, 1L, 4L, 2L, 2L, 2L, 3L, 2L, 3L, 2L, 3L, 
4L, 3L, 2L, 4L, 4L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 4L, 3L, 3L, 4L, 
2L), .Dim = c(6L, 5L))

initial_wealth <- rep(1000, 5)

如果将赢/输结果和支付结合到单个矩阵中,可以在同一个等式中使用来计算结果,则可以简化您的问题。然后,您可以使用cumprod()函数计算矩阵行下的累积乘积。

# combine the win/loss and the pay off to get a combined result
bet_combined <- bet_results * bet_payoff
bet_combined[bet_combined==0] <- -1

multiplier <- 1 + bet_pct_wealth * bet_combined
apply(rbind(initial_wealth, multiplier), 2, cumprod)