Monte Carlo 分析 Python 石油和天然气体积

Monte Carlo Analysis Python Oil and Gas Volumetrics

我正在尝试自学 python,我想从学习如何进行 monte carlo 分析开始(我是一名经常使用 MCA 的科学家)。我正在尝试编写一个程序,它将执行 7 个变量的蒙特卡洛模拟,以计算给定公式的可能结果范围。

我是 python 的新手。我有 VBA 的经验,但仍在学习 python。

我在网上找到的所有示例都与金融有关,不幸的是,我很难理解这些代码,因为它们与我正在尝试做的事情不太相关。

我觉得这应该是一件很简单的事情,因为方程式很简单。但是,我似乎无法取得任何进展。有人可以看看我现在拥有的代码并指出正确的方向吗?如果您有一个初学者易于理解的非金融蒙特卡洛分析示例,请指点我。我想学习 python,但我发现最好的学习方法是看别人的例子。

我想要完成的是拥有一个包含 7 个变量的列表,每个变量都具有正态分布。我希望 python 对下面代码中的公式执行 10,000 次迭代,每次计算时拉出一组不同的 7 个不同变量。我最终想打印计算的 P90、P50 和 P10 值。现在我真的不关心看任何图表(稍后会出现)。

下面是我到目前为止编写的代码。同样,我正在寻找如何实现这一目标的方向。我知道我的语法可能搞砸了,但我真的很挣扎。任何帮助将不胜感激。

from scipy.stats import *
import numpy as np


n = 10000

for i in range(n):
    Area = norm(200,50)
    Thickness = norm(100,25)
    NTG = norm(.85,.2)
    POR = norm(.32,.02)
    GS = norm(.80,.2)
    BG= norm(.0024,.0001)
    Feather = 1
    return ((((Area*Thickness*NTG*POR*GS)/BG)*43560)*Feather)/1000000000


Result = ((((Area*Thickness*NTG*POR*GS)/BG)*43560)*Feather)/1000000000


print ('Result is ', Result, 'ft')

你的代码有几个问题,至少:

  • 您不能将 return 放在函数之外

  • 你的对象是随机数生成器,不是随机数;你不能乘以它们

想必你想要这样的东西:

n = 10000
Area = norm(200,50).rvs(n)
Thickness = norm(100,25).rvs(n)
NTG = norm(.85,.2).rvs(n)
POR = norm(.32,.02).rvs(n)
GS = norm(.80,.2).rvs(n)
BG= norm(.0024,.0001).rvs(n)
Feather = 1
Results = Area*Thickness*NTG*POR*GS/BG*43560*Feather/1000000000
print(Results)

输出:

array([  43.88063752,   88.94160248,   46.89368561, ...,   87.32369654,
    210.16899452,   32.21191486])

然后可以使用Results数组进行统计分析,例如P10、P50和P90计算。

注意没有循环,在数字 python 中应尽量避免循环。这已经创建了 n 个结果。

我必须说我认为你先阅读 Python 教程会更有效率。

我不知道你想完成什么,但我可以提供一些建议:

  • 看起来你的模拟实现之间没有协方差,所以为了加快计算速度并使代码更清晰一些,你可以从联合多元正态分布中提取数据。

  • 我讨厌循环,所以只要能做到矢量化就更好了。

这是一些代码

import numpy as np
import matplotlib.pyplot as plt

N = 10000
mean_vector = np.array([200, #Area
                        100, #Thickness
                        0.85, #NTG  
                        0.32, #POR
                        0.80, #GS
                        0.0024 #BG
                        ])

covariance = np.diag([50,
                      25,
                      0.2,
                      0.02,
                      0.2,
                      0.0001])

simulated = np.random.multivariate_normal(mean_vector, covariance, size = N)

area, thickness, ntg, por, gs, bg = simulated.T

result= (area*thickness*ntg*por*gs*43560)/bg

result 数组包含您的模拟结果。现在您可以根据需要绘制直方图或计算均值。