Использование Монте-Карло для прогнозирования доходов в Python - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь внедрить симуляцию Монте-Карло в мой код Python, который поможет мне определить шансы на достижение различных пороговых значений, связанных с целевыми показателями дохода. Например, какова вероятность того, что мы получим 6000, 7000 или 8000 долларов США за каждый финансовый год. Я могу рассчитать ожидаемое значение, но мне не повезло с кодированием симуляции. Я пытался создать функцию, которая запускает 1000 симуляций, но не смог ее получить (благодаря моим очень начинающим способностям кодирования). В идеале я мог бы вернуть среднее значение и стандартное отклонение для итоговой суммы и каждого контракта, которые можно использовать для их построения на нормальной кривой.

import pandas as pd

ID = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Revenue = [1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800, 1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800]
odds = [0.5, 0.6, 0.33, 0.1, 0.9, 0.87, 0.37, 0.55, 0.97, 0.09, 0.5, 0.6, 0.33, 0.1, 0.9, 0.87, 0.37, 0.55, 0.97, 0.09]
FY = [2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019]
d = {'ID': ID, 'Revenue': Revenue, 'Odds': odds, 'Fiscal Year': FY}
df = pd.DataFrame(d)
df['Expected Value'] = df['Revenue']*df['Odds']

print(df)

Это немного кода, который я писал, но я заблудился.

import pandas_montecarlo
mc = OtisPrediction_df['Realization Rate'].montecarlo(sims = 100)
mc.plot()
print(mc.stats)

Или

def win_loss_func(iterator):
    odds = random.randint(1,100)/100
    X = []
    Y = []
    i = 1
    while i <= iterator:
        if df['Odds'] >= odds:
            i+=1
            X.append(i)
            Y.append(OtisPrediction_df[''])
    print(odds)

Мне нужно иметь возможность использовать Монте-Карло для каждого удостоверения личности в каждом финансовом году. Есть ли способ сделать это? Я создал функцию, которая будет создавать массив для каждой записи, но мне все еще нужно фильтровать на основе полей ID и Filter, чтобы заполнить каждый массив 10000 имитациями. def monte_carlo_array(df): for _ in range(len(df)): yield []

1 Ответ

0 голосов
/ 05 сентября 2018

Это решение не очень эффективно, поскольку ничего не делается параллельно, но вы можете ясно видеть, как выполняется моделирование.

num_samples = 10000
revenue_2018 = []
revenue_2019 = []

filter_2018 = (df['Fiscal Year'] == 2018)
filter_2019 = (df['Fiscal Year'] == 2019)

for _ in range(num_samples):
    sample = df['Revenue'] * ( np.random.rand(20) < df['Odds'] )
    revenue_2018.append(sample.loc[filter_2018].sum())
    revenue_2019.append(sample.loc[filter_2019].sum())

# Plot simulation results.
n_bins = 10
plt.hist([revenue_2018, revenue_2019], bins=n_bins, label=["Revenue 2018", "Revenue 2019"])
plt.legend()
plt.title("{} simulations of yearly revenue".format(num_samples))

# Print statistics.
print("Mean for 2018 is {}. Standard Deviation is {}".format(np.mean(revenue_2018), np.std(revenue_2018)))
print("Mean for 2019 is {}. Standard Deviation is {}".format(np.mean(revenue_2019), np.std(revenue_2019)))
...