[PYTHON] Simulation du contenu du portefeuille

Distribution de billets et de pièces

Si vous payez toujours pour minimiser le poids de votre portefeuille, quelle est la répartition de votre portefeuille?

Simulation

Vérifions cela par simulation.

――10 000 yens est infini. ――Achetez le produit 10 000 fois et voyez la distribution. (Ignorez les 100 premières fois) --Le prix du produit est de 100 yens à 9999 yens, [loi de Benford](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E3%83%95 % E3% 82% A9% E3% 83% BC% E3% 83% 89% E3% 81% AE% E6% B3% 95% E5% 89% 87). --Utilisez Méthode de l'alias de Walker pour générer des nombres aléatoires (rand_from_prob).

Calculé avec Python

Tout d'abord, faisons un poids (wgt) de 100 yens à 9999 yens selon la loi de Benford.

python


import numpy as np, matplotlib.pyplot as plt
from math import log
#Loi de Benford
wgt = np.array([log((i+1)/i, 10000) for i in range(100, 10000)])
wgt /= sum(wgt)
plt.plot(wgt)
plt.xlabel('Price')

image

Définit une modification qui renvoie le nombre après avoir minimisé le poids.

python


from pulp import *
money_val = (1, 5, 10, 50, 100, 500, 1000, 5000)
money_wgt = (1.0, 3.7, 4.5, 4.0, 4.8, 7.0, 1.0, 1.0)
def change(price):
    m = LpProblem() #Modèle mathématique
    x = [LpVariable('x%d'%i, lowBound=0, cat=LpInteger)
         for i in range(len(money_val))] #Quantité après paiement
    m += lpDot(money_wgt, x) #Fonction objective(Poids après paiement)
    m += lpDot(money_val, x) == price #Montant après paiement
    m.solve()
    return [int(value(i)) for i in x]

Simulons. Essayons la distribution de billets de 1000 yens.

python


price = 0 #Argent courant
warm, nrun = 100, 10000
res = []
for i, p in enumerate(rand_from_prob(wgt, warm+nrun)):
    price -= p
    if price < 0:
        price += 10000
    if price:
        res.append(change(price))
a = np.array(res[-nrun:])
plt.hist(a[:,6], bins=5, range=(0, 5)) #Distribution de billets de 1000 yens

image

C'est une probabilité égale. La même chose était vraie pour les autres pièces et les billets de 5000 yens.

Conclusion

Cela semble être une probabilité égale. La distribution du montant total a également une probabilité égale de 0 yen à 9999 yens.

python


import pandas as pd
from itertools import product
r2, r5 = range(2), range(5)
ptn = [np.dot(money_val, n) for nn in 
       product(r5, r2, r5, r2, r5, r2, r5, r2)]
plt.hist(ptn)
print(pd.DataFrame(ptn).describe())
>>>
                 0
count  10000.00000
mean    4999.50000
std     2886.89568
min        0.00000
25%     2499.75000
50%     4999.50000
75%     7499.25000
max     9999.00000

image

c'est tout

Recommended Posts