• 用Python实现蒙特卡洛模拟( Monte Carlo simulation)，蒙特·卡罗方法（Monte Carlo method），也称统计模拟方法，是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明，而被提出的一种以概率统计理论为...
• 蒙特卡洛 基于估计的置信区间的蒙特卡洛模拟框架。 Python
• 蒙特卡洛模拟，准确的说它并不是一种算法，而是一种解决问题的思路，因为算法的实现代码是确定的，而蒙特卡洛模拟的实现代码并不确定，针对不同问题的求解，其实现代码是不一样的，其核心思路是根据要求解的问题建立...


蒙特卡洛模拟，准确的说它并不是一种算法，而是一种解决问题的思路，因为算法的实现代码是确定的，而蒙特卡洛模拟的实现代码并不确定，针对不同问题的求解，其实现代码是不一样的，其核心思路是根据要求解的问题建立一个概率事件，并确定该事件的随机输入变量，该然后对这个概率事件有限次地输入随机数，统计输出结果，从而根据输出结果的统计特征得到问题的近似解。下面举一个很简单很容易理解的例子，来讲解蒙特卡洛模拟的思路。 问题：如上图，有一个矩形操场，已知其长100米，宽50米，该操场中间画了一条不规则的红线，求红线左侧和右侧区域的面积分别是多少？总体求解思路：只要求得两个区域的面积之比，即可以得到各自的面积。蒙特卡洛模拟思路：1. 概率事件：每一个学生走进操场时都随机选择一个位置待着，因此他有可能待在操场的任何一个角落(假设同一位置可以待多个人)。2. 随机输入变量：每一个学生。3. 有限次输入随机数：有500个学生，依次走进操场，并随机地选择一个位置待着。4. 统计输出结果：统计待在左侧区域的学生总数为n1，待在右侧区域的学生总数为n25. 根据输出结果的统计特征得到问题的近似解：因为每个学生待在左侧还是右侧是随机的，可以认为左侧与右侧的学生人数比n1/n2近似等于左右侧的面积比，所以可以得到左侧面积为100*50*n1/(n1+n2)，右侧面积为100*50*n2/(n1+n2)。在蒙特卡洛模拟中，模拟次数越多，得到的结果越接近真实解，前提条件是输入的随机变量足够随机，如果变量不够随机，很可能导致离谱的错误。下面再举一个例子，并使用C++编码进行蒙特卡洛模拟，以求得问题的近似解。 如上图所示，在y=sinx曲线的[0, π]区间中，求解曲线下方阴影部分的面积，也即相当于求函数y=sinx在该区间的定积分。蒙特卡洛模拟的思路与步骤：1. 概率事件：随机生成x坐标在[0, π]区间、y坐标在[0, 1]区间的点，该点有可能落在阴影区域，也有可能落在阴影之外的区域。2. 随机变量：点的x坐标与y坐标。3. 有限次输入随机数：生成多个点，比如100个，1000个，10000个......4. 统计输出结果：统计落在阴影区域内的点数，以及落在阴影区域之外的点数。5. 根据落在阴影区域内部的点数与落在外部的点数之比，得到矩形中阴影区域与非阴影区域的近似面积比，从而求得阴影部分的近似面积。首先，我们来计算一下真实解，阴影部分的面积可按牛顿-莱布尼茨公式计算(这里可能有人会疑惑了，电脑为什么不直接用这个公式计算，我们要知道，电脑是很笨的，它是不会直接使用这个公式来计算定积分的)。所以，问题的真实解是2。 其次，说明一下怎么判断点落在阴影区域内部还是外部。假设通过随机生成x坐标与y坐标，得到点P(x, y)，那么可如此判断：当y≤sinx时，点P落在阴影内部，反之当y>sinx时，点P落在阴影外部。下面上代码：//生成[min, max]区间的浮点数float get_random(float min, float max){  float x = rand() / double(RAND_MAX);    //生成0~1的浮点数  return (x*(max - min) + min);   }//蒙特卡洛模拟，cnt为模拟次数void MonteCarlo_test(int cnt){  int n1 = 0;   //阴影区域内部点的计数器  int n2 = 0;   //阴影区域外部点的计数器  const float PI = 3.141592;  float s = PI*1.0;  srand((unsigned)time(NULL));  //设置随机数种子  for (int i = 0; i < cnt; i++)  {    float x = get_random(0, PI);  //随机生成在[0, π]区间的x坐标    float y = get_random(0, 1);   //随机生成在[0, 1]区间的y坐标    float fx = sin(x);   //计算sinx    if (y <= fx)  //如果y≤sinx则认为点在阴影内部      n1++;    //阴影区域内部点计数器加1    else      //如果y>sinx则认为点在阴影内部      n2++;    //阴影区域外部点计数器加1  }  float s1 = n1 * 1.0 / cnt * s;   //n1/(n1+n2)*s = n1/cnt*s，即为阴影部分面积  printf("模拟次数：%d，阴影部分面积：%f\n", cnt, s1);}运行以上代码，逐渐增加模拟次数cnt，得到以下结果，可以看到，随着模拟次数的增加，得到的近似解会越来越接近真实解。模拟次数得到结果101.256637502.2619461002.0420355002.03575210001.976061100002.016588200002.007320500002.000440

展开全文 • python 蒙特卡洛模拟 重点 (Top highlight) 机器学习 ， 数学 ， 程序设计 ， 教程 (Machine Learning, Mathematics, Programming, Tutorial) Author(s): Pratik Shukla, Roberto Iriondo 作者:Pratik Shukla，...
python 蒙特卡洛模拟 机器学习 ， 数学 ， 程序设计 ， 教程 (Machine Learning, Mathematics, Programming, Tutorial)
Author(s): Pratik Shukla, Roberto Iriondo 作者：Pratik Shukla，Roberto Iriondo
什么是蒙特卡洛模拟？ (What is the Monte Carlo Simulation?)
A Monte Carlo method is a technique that uses random numbers and probability to solve complex problems. The Monte Carlo simulation, or probability simulation, is a technique used to understand the impact of risk and uncertainty in financial sectors, project management, costs, and other forecasting machine learning models. 蒙特卡洛方法是一种使用随机数和概率来解决复杂问题的技术。 蒙特卡洛模拟或概率模拟是一种用于了解风险和不确定性对金融部门，项目管理，成本和其他预测的影响的技术  机器学习  楷模。
Risk analysis is part of almost every decision we make, as we constantly face uncertainty, ambiguity, and variability in our lives. Moreover, even though we have unprecedented access to information, we cannot accurately predict the future. 风险分析几乎是我们所做每个决策的一部分，因为我们不断面临生活中的不确定性，歧义和多变性。 此外，即使我们拥有前所未有的信息访问渠道，也无法准确预测未来。
The Monte Carlo simulation allows us to see all the possible outcomes of our decisions and assess risk impact, in consequence allowing better decision making under uncertainty. 蒙特卡洛模拟使我们能够看到决策的所有可能结果并评估风险影响，从而可以在不确定性下做出更好的决策。
In this article, we will go through five different examples to understand the Monte Carlo Simulation method. 在本文中，我们将通过五个不同的示例来理解蒙特卡洛模拟方法。
📚 Resources: Google Colab Implementation | GitHub Repository 📚 📚资源： Google Colab实施 | GitHub存储库 📚  应用范围： (Applications:)
Finance. 金融。 Project Management. 项目管理。 Energy. 能源。 Manufacturing. 制造业。 Engineering. 工程。 Research and Development. 研究与开发。 Insurance. 保险。 Oil and Gas. 油和气。 Transportation. 运输。 Environment. 环境。 And others. 和别的。  例子： (Examples:)
Coin Flip Example. 硬币翻转的例子 。 Estimating PI Using Circle and Square. 使用圆形和正方形估算PI。 Monty Hall Problem. 蒙蒂·霍尔问题。 Buffon’s Needle Problem. 布冯的针问题。 Why Does the House Always Win? 为什么房子总是赢？  一个。 硬币翻转示例： (a. Coin Flip Example:)
The probability of head for a fair coin is 1/2. However, is there any way we can prove it experimentally? In this example, we are going to use the Monte-Carlo method to simulate the coin-flipping iteratively 5000 times to find out why the probability of a head or tail is always 1/2. If we repeat this coin flipping many, many more times, then we can achieve higher accuracy on an exact answer for our probability value. 买到一枚公平硬币的概率为1/2。 但是，有什么方法可以通过实验证明吗？ 在此示例中，我们将使用蒙特卡洛方法来反复模拟抛硬币5000次，以找出为什么头或尾的概率始终为1/2的原因。 如果我们重复多次抛硬币，那么我们可以在对概率值的准确答案上获得更高的准确性。 Figure 2: Heads and tails, mathematical representation.While flipping a coin: 掷硬币时： Figure 3: Formula for heads and tails coin example.Next, we are going to prove this formula experimentally using the Monte Carlo Method. 接下来，我们将使用蒙特卡洛方法通过实验证明该公式。
Python实现： (Python Implementation:)
Import required libraries: 导入所需的库： Figure 4: Import the required libraries for our coin flipping example.2. Coin flip function: 2.投币功能： Figure 5: A simple function randomizing the results between 0 and 1, 0 for heads, and 1 for tails.3. Checking the output of the function: 3.检查功能的输出： Figure 6: Running the function of coin_flip()4. Main function: 4.主要功能： Figure 7: Calculating the probability and appending the probability values to the results.5. Calling the main function: 5.调用主要功能： Figure 8: Calling the Monte Carlo main function, along with plotting final values.As shown in figure 8, we show that after 5000 iterations, the probability of getting a tail is 0.502. Consequently, this is how we can use the Monte Carlo Simulation to find probabilities experimentally. 如图8所示，我们显示经过5000次迭代后，得到尾巴的概率为0.502。 因此，这就是我们可以使用蒙特卡洛模拟实验找到概率的方式。
b。 使用圆形和正方形估算PI： (b. Estimating PI using circle and square :) Figure 9: Simple area of a circle and of a square. Figure 10: Calculation of the area of a circle and square respectively.To estimate the value of PI, we need the area of the square and the area of the circle. To find these areas, we will randomly place dots on the surface and count the dots that fall inside the circle and dots that fall inside the square. Such will give us an estimated amount of their areas. Therefore instead of using the actual areas, we will use the count of dots to use as areas. 要估算PI的值，我们需要正方形的面积和圆形的面积。 为了找到这些区域，我们将在表面上随机放置点，并对落在圆内的点和落在正方形内的点进行计数。 这样可以给我们估计他们的面积。 因此，我们将使用点数作为区域，而不是使用实际区域。
In the following code, we used the turtle module of Python to see the random placement of dots. 在下面的代码中，我们使用Python的turtle模块查看点的随机放置。
Python实现： (Python Implementation:)
Import required libraries: 导入所需的库： Figure 10: Importing required libraries for our π example.2. To visualize the dots: 2.可视化点： Figure 11: Drawing the figures.3. Initialize some required data: 3.初始化一些必需的数据： Figure 12: Initializing data values.4. Main function: 4.主要功能： Figure 13: Implementing the main function.5. Plot the data: 5.绘制数据： Figure 14: Plotting the data values.6. Output: 6.输出： Figure 15: π approximations using the Monte Carlo methodology. Figure 16: Data visualization of the values. Figure 17: Data visualization of the values.As shown in figure 17, we can see that after 5000 iterations, we can get the approximate value of PI. Also, notice that the error in estimation also decreased exponentially as the number of iterations increased. 如图17所示，我们可以看到经过5000次迭代后，我们可以获得PI的近似值。 另外，请注意，随着迭代次数的增加，估计误差也呈指数下降。 📚 Check out an overview of machine learning algorithms for beginners with code examples in Python. 📚 with查看适用于初学者的机器学习算法概述，并提供Python中的代码示例。 📚  3. Monty Hall问题： (3. Monty Hall Problem:)
Suppose you are on a game show, and you have the choice of picking one of three doors: Behind one door is a car; behind the other doors, goats. You pick a door, let’s say door 1, and the host, who knows what’s behind the doors, opens another door, say door 3, which has a goat. The host then asks you: do you want to stick with your choice or choose another door?  假设您正在一场游戏节目中，并且可以选择从以下三个门中选择一个：一扇门后面是一辆汽车； 在另一扇门后面是山羊。 您选择一扇门，比如说1号门，而知道门后是什么的主人打开了另一扇门，例如3号门，上面有一只山羊。 主人然后问您：您要坚持选择还是选择另一扇门？ [ 1 ] Is it to your advantage to switch your choice of door? 切换门的选择对您有利吗？ Based on probability, it turns out it is to our advantage to switch the doors. Let’s find out how: 基于概率，事实证明切换门对我们有利。 让我们看看如何：
Initially, for all three gates, the probability (P) of getting the car is the same (P = 1/3). 最初，对于所有三个登机口，上车的机率(P)是相同的(P = 1/3)。 Figure 18: A simulation of the three gates for our game show, showcasing each of the possible outcomes.Now assume that the contestant chooses door 1. Next, the host opens the third door, which has a goat. Next, the host asks the contestant if he/she wants to switch the doors? 现在假设参赛者选择了1号门。接下来，主持人将打开第三个门，上面有一只山羊。 接下来，主持人询问参赛者是否要切换门？
We will see why it is more advantageous to switch the door: 我们将看到为什么开关门更有利： Figure 19: A figurative outcome for the door gameshow.In figure 19, we can see that after the host opens door 3, the probability of the last two doors of having a car increases to 2/3. Now we know that the third door has a goat, the probability of the second door having a car increases to 2/3. Hence, it is more advantageous to switch the doors. 在图19中，我们可以看到，在主人打开3号门之后，最后两扇门有汽车的概率增加到2/3。 现在我们知道第三扇门有山羊皮，第二扇门有车的可能性增加到2/3。 因此，切换门是更有利的。
Now we are going to use the Monte Carlo Method to perform this test case many times and find out its probabilities in an experimental way. 现在，我们将使用蒙特卡洛方法多次执行此测试用例，并以实验方式找出其概率。
Python实现： (Python Implementation:)
Import required libraries: 导入所需的库： Figure 20: Importing required libraries for our game show example.2. Initialize some data: 2.初始化一些数据： Figure 21: Initializing the doors and empty lists to store the probability values.3. Main function: 3.主要功能： Figure 22: Implementing the main function with a Monte Carlo Simulation method.4. Calling the main function: 4.调用主要功能： Figure 23: Calling the main function of our game show example, and interesting 1000 times.5. Output: 5.输出： Figure 24: Approximate winning probabilities to sticking with your choice or switching doors.In figure 24, we show that after 1000 iterations, the winning probability if we switch the door is 0.669. Therefore, we are confident that it works to our advantage to switch the door in this example. 在图24中，我们显示了经过1000次迭代之后，如果我们切换门的获胜概率为0.669。 因此，我们有信心在此示例中切换门对我们有利。
4.布冯针问题： (4. Buffon’s Needle Problem:)
A French nobleman Georges-Louis Leclerc, Comte de Buffon, posted the following problem in 1777  . 1777年，法国贵族乔治·路易·勒克莱尔(Comte de Buffon)发表了以下问题[ 2 ] [ 3 ]。
Suppose that we drop a short needle on a ruled paper — what would be the probability that the needle comes to lie in a position where it crosses one of the lines? 假设我们在一根直纹纸上放了一根短针-针出现在与其中一条线交叉的位置的概率是多少？ The probability depends on the distance (d) between the lines of the ruled paper, and it depends on the length (l) of the needle that we drop — or rather, it depends on the ratio l/d. For this example, we can interpret the needle as l ≤ d. In short, our purpose is that the needle cannot cross two different lines at the same time. Surprisingly, the answer to the Buffon’s needle problem involves PI. 概率取决于直纹纸的线之间的距离(d)，并且取决于我们掉落的针的长度(l)，或者取决于比率l/d 。 对于此示例，我们可以将针解释为l ≤ d 。 简而言之，我们的目的是针不能同时越过两条不同的线。 出乎意料的是，布冯针问题的答案涉及PI。
Here we are going to use the solution of Buffon’s needle problem to estimate the value of PI experimentally using the Monte Carlo Method. However, before going into that, we are going to show how the solution derives, making it more interesting. 在这里，我们将使用布冯针问题的解决方案，通过蒙特卡洛方法实验性地估计PI的值。 但是，在此之前，我们将展示解决方案的派生方式，使其变得更加有趣。
定理： (Theorem:)
If a short needle, of length l, is dropped on a paper that is ruled with equally spaced lines of distance d ≥ l, then the probability that the needle comes to lie in a position where it crosses one of the lines is: 如果将长度为l的一根短针落在由等距的线d≥l划出的纸上，则该针落在与其中一根线交叉的位置的概率为： Figure 25: Buffon’s needle problem theorem. 证明： (Proof:) Figure 26: Visualizing Buffon’s needle problem.Next, we need to count the number of needles that crosses any of the vertical lines. For a needle to intersect with one of the lines, for a specific value of theta, the following are the maximum and minimum possible values for which a needle can intersect with a vertical line. 接下来，我们需要计算穿过任何垂直线的针数。 对于一根与一条线相交的针，对于特定的theta值，以下是针与一条垂直线相交的最大和最小可能值。
Maximum Possible Value: 最大可能值： Figure 27: Maximum possible value.2. Minimum Possible Value: 2.最小可能值： Figure 28: Minimum possible value.Therefore, for a specific value of theta, the probability for a needle to lie on a vertical line is: 因此，对于特定的theta值，针位于垂直线上的概率为： Figure 29: Probability for a needle to lie on a vertical line formula.The above probability formula is only limited to one value of theta; in our experiment, the value of theta ranges from 0 to pi/2. Next, we are going to find the actual probability by integrating it concerning all the values of theta. 上述概率公式仅限于θ的一个值。 在我们的实验中，theta的值在0到pi / 2之间。 接下来，我们将通过对所有theta值进行积分来找到实际概率。 Figure 30: Probability formula by integrating all possible values for theta. Figure 31: PI estimation. 使用布冯针问题估算PI： (Estimating PI using Buffon's needle problem:)
Next, we are going to use the above formula to find out the value of PI experimentally. 接下来，我们将使用以上公式通过实验找出PI的值。 Figure 32: Finding the value of PI.Now, notice that we have the values for l and d. Our goal is to find the value of P first so that we can get the value of PI. To find the probability P, we must need the count of hit needles and total needles. Since we already have the count of total needles, the only thing we require now is the count of hit needles. 现在，请注意，我们具有l和d的值。 我们的目标是首先找到P的值，以便获得PI的值。 为了找到概率P，我们必须需要命中针数和总针数。 由于我们已经有了总针数，所以现在我们唯一需要的就是打针数。
Below is the visual representation of how we are going to calculate the count of hit needles. 下面是我们如何计算击针数的直观表示。 Figure 33: Visual representation to calculate the count of needles. Python实现： (Python Implementation:)
Import required libraries: 导入所需的库： Figure 34: Importing the required libraries for our problem.2. Main function: 2.主要功能： Figure 35: Implementing the Monte Carlo Simulation method to our Buffon problem.3. Calling the main function: 3.调用主要功能： Figure 36: Calling the Monte Carlo Method’s main function to our Buffon’s problem.4. Output: 4.输出： Figure 37: Data visualization of 100 iterations using the Monte Carlo Method.As shown in figure 37, after 100 iterations we are able to get a very close value of PI using the Monte Carlo Method. 如图37所示，经过100次迭代，我们能够使用蒙特卡洛方法获得非常接近的PI值。 PexelsPexels  5.为什么房子总是赢？ (5. Why Does the House Always Win?)
How do casinos earn money? The trick is straightforward — “The more you play, the more they earn.” Let us take a look at how this works with a simple Monte Carlo Simulation example. 赌场如何赚钱？ 诀窍很简单- “玩的越多，他们赚的就越多。” 让我们用一个简单的蒙特卡洛模拟示例看一下它是如何工作的。
Consider an imaginary game in which a player has to choose a chip from a bag of chips. 考虑一个假想的游戏，其中玩家必须从一包筹码中选择一个筹码。
规则： (Rules:)
There are chips containing numbers ranging from 1–100 in a bag. 袋子中的筹码数量范围为1–100。 Users can bet on even or odd chips. 用户可以用偶数或奇数筹码下注。 In this game, 10 and 11 are special numbers. If we bet on evens, then 10 will be counted as an odd number, and if we bet on odds, then 11 will be counted as an even number. 在这个游戏中，10和11是特殊数字。 如果我们对偶数下注，则将10计为一个奇数，如果我们对偶数下注，则11将计为一个偶数。 If we bet on even numbers and we get 10 then we lose. 如果我们用偶数下注，我们得到10，那么我们输。 If we bet on odd numbers and we get 11 then we lose. 如果我们用奇数下注，我们得到11，那么我们输。 If we bet on odds, the probability that we will win is of 49/100. The probability that the house wins is of 51/100. Therefore, for an odd bet the house edge is = 51/100–49/100 = 200/10000 = 0.02 = 2% 如果我们用赔率下注，我们获胜的概率为49/100。 获胜的概率为51/100。 因此，对于一个奇数下注，彩池优势为= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2％
If we bet on evens, the probability that the user wins is of 49/100. The probability that the house wins is of 51/100. Hence, for an odd bet the house edge is = 51/100–49/100 = 200/10000 = 0.02 = 2% 如果我们打赌偶数，则用户获胜的概率为49/100。 获胜的概率为51/100。 因此，对于一个奇数下注，彩池优势为= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2％
In summary, for every $1 bet,$ 0.02 goes to the house. In comparison, the lowest house edge on roulette with a single 0 is 2.5%. Consequently, we are certain that you will have a better chance of winning at our imaginary game than with roulette. 综上所述，每下注1美元，就会有0.02美元下注。 相比之下，轮盘上最低的单一0优势是2.5％。 因此，我们可以肯定，与轮盘赌相比，您在假想的游戏中获胜的机会更大。
Python实现： (Python Implementation:)
Import required libraries: 导入所需的库： Figure 38: Importing the required libraries for our casino problem.2. Player’s bet: 2.玩家下注： Figure 39: Placing bets for odds and even numbers.3. Main function: 3.主要功能： Figure 40: Applying the Monte Carlo Methodology to our casino problem.4. Final output: 4.最终输出： Figure 41: Calculating and displaying the final values.5. Running it for 1000 iterations: 5.运行1000次迭代： Figure 42: Running our function 1000 times.6. Number of bets = 5: 6.下注次数= 5： Figure 43: Data visualization of results when the number of bets equals five.7. Number of bets = 10: 7.下注数量= 10： Figure 44: Data visualization of results when the number of bets equals ten.8. Number of bets = 1000: 8.下注数量= 1000： Figure 45: Data visualization of results when the number of bets equals 1000.9. Number of bets = 5000: 9.下注次数= 5000： Figure 46: Data visualization of results when the number of bets equals 5000.10. Number of bets = 10000: 10.下注数量= 10000： Figure 47: Data visualization of results when the number of bets equals 10000.From the above experiment, we can see that the player has a better chance of making a profit if they place fewer bets on these games. In some case scenarios, we get negative numbers, which means that the player lost all of their money and accumulated debt instead of making a profit. 从上面的实验中，我们可以看到，如果玩家在这些游戏上的押注减少，他们就有更大的获利机会。 在某些情况下，我们得到负数，这意味着玩家损失了所有钱并积累了债务而不是赚钱。
Please keep in mind that these percentages are for our figurative game and they can be modified. 请记住，这些百分比适用于我们的比喻游戏，可以修改。
结论： (Conclusion:)
Like with any forecasting model, the simulation will only be as good as the estimates we make. It is important to remember that the Monte Carlo Simulation only represents probabilities and not certainty. Nevertheless, the Monte Carlo simulation can be a valuable tool when forecasting an unknown future. 与任何预测模型一样，模拟结果将仅与我们所做的估计一样好。 重要的是要记住，蒙特卡洛模拟仅代表概率而不是确定性。 尽管如此，当预测未知的未来时，蒙特卡洛模拟仍是有价值的工具。
📚 Check out our tutorial on neural networks from scratch with Python code and math in detail.📚 neural详细了解我们的神经网络教程，并详细介绍Python代码和数学.📚 DISCLAIMER: The views expressed in this article are those of the author(s) and do not represent the views of Carnegie Mellon University. These writings do not intend to be final products, yet rather a reflection of current thinking, along with being a catalyst for discussion and improvement. 免责声明：本文中表达的观点仅代表作者个人观点，并不代表卡耐基梅隆大学的观点。 这些著作并非最终产品，而是当前思想的反映，同时也是讨论和改进的催化剂。
Published via Towards AI 通过Towards AI发布
翻译自: https://medium.com/towards-artificial-intelligence/monte-carlo-simulation-an-in-depth-tutorial-with-python-bcf6eb7856c8python 蒙特卡洛模拟
展开全文 • 蒙特卡洛模拟蒙特卡洛模拟是金融学和数值科学中最重要的算法之一。它之所以重要，是因为在期权定价或者风险管理问题上有很强的能力。和其它数值方法相比，蒙特卡洛方法很容易处理高维问题，在这种问题上复杂度和计算...
蒙特卡洛模拟蒙特卡洛模拟是金融学和数值科学中最重要的算法之一。它之所以重要，是因为在期权定价或者风险管理问题上有很强的能力。和其它数值方法相比，蒙特卡洛方法很容易处理高维问题，在这种问题上复杂度和计算需求通常以线性方式增大。蒙特卡洛方法的缺点是：它本身是高计算需求的，即使对于相当简单的问题也往往需要海量的计算。因此，必须高效的实现蒙特卡洛算法。下面使用不同的方法实现蒙特卡洛算法1.Scipy2.纯Python3.向量化Numpy4.全向量化Numpy方法一：Scipy欧式看涨期权的定价公式Black-Scholes-Merton(1973): 其中：  C—期权初始合理价格L—期权交割价格S—所交易金融资产现价T—期权有效期r—连续复利计无风险利率σ2—年度化方差N()—正态分布变量的累积概率分布函数 # 导用到的库from math import log, sqrt, expfrom scipy import stats# 期权的定价计算,根据公式１．def bsm_call_value(S_0, K, T, r, sigma):S_0 = float(S_0)d_1 = (log(S_0 / K) + (r + 0.5 *sigma **2) *T)/(sigma * sqrt(T))d_2 = (log(S_0 / K) + (r - 0.5 *sigma **2) *T)/(sigma * sqrt(T))C_0 = (S_0 * stats.norm.cdf(d_1, 0.0, 1.0) - K * exp(-r * T) * stats.norm.cdf(d_2, 0.0, 1.0))return C_0# 计算的一些初始值S_0 = 100.0    # 股票或指数初始的价格;K = 105        #  行权价格T = 1.0        #  期权的到期年限(距离到期日时间间隔)r = 0.05       #   无风险利率sigma = 0.2    # 波动率(收益标准差)# 到期期权价值%time print (bsm_call_value(S_0, K, T, r, sigma))8.021352235143176Wall time: 511 µs方法二：Python下面的计算仍基于BSM(balck-scholes-merton),模型中的高风险标识(股票指数)在风险中立的情况下遵循以随机微分方程(SDE)表示的布朗运动．  # 导入python模块from time import timefrom math import exp, sqrt, logfrom random import gauss, seedseed(2000)# 计算的一些初始值S_0 = 100.0    # 股票或指数初始的价格;K = 105        #  行权价格T = 1.0        #  期权的到期年限(距离到期日时间间隔)r = 0.05       #   无风险利率sigma = 0.2    # 波动率(收益标准差)M = 50         # number of time stepsdt = T/M       # time entervalI = 20000       # number of simulationstart = time()S = []     #for i in range(I):path = []    # 时间间隔上的模拟路径for t in range(M+1):if t==0:path.append(S_0)else:z = gauss(0.0, 1.0)S_t = path[t-1] * exp((r-0.5*sigma**2) * dt + sigma * sqrt(dt) * z)path.append(S_t)S.append(path)# 计算期权现值C_0 = exp(-r * T) *sum([max(path[-1] -K, 0) for path in S])/Itotal_time = time() - startprint ('European Option value %.6f'% C_0)print ('total time is %.6f seconds'% total_time)European Option value 8.159995total time is 1.616999 seconds前三十条模拟路径# 选取部分模拟路径可视化import matplotlib.pyplot as plt%matplotlib inlineplt.figure(figsize=(10,7))plt.grid(True)plt.xlabel('Time step')plt.ylabel('index level')for i in range(30):plt.plot(S[i]) 方法三： 向量化的Numpy使用numpy的一些数组，来减少运算# 导入模块import numpy as npfrom time import time# 计算的一些初始值S_0 = 100.0    # 股票或指数初始的价格;K = 105        #  行权价格T = 1.0        #  期权的到期年限(距离到期日时间间隔)r = 0.05       #   无风险利率sigma = 0.2    # 波动率(收益标准差)M = 50         # number of time stepsdt = T/M       # time entervalI = 20000       # number of simulation# 20000条模拟路径，每条路径５０个时间步数S = np.zeros((M+1, I))S = S_0np.random.seed(2000)start = time()for t in range(1, M+1):z = np.random.standard_normal(I)S[t] = S[t-1] * np.exp((r- 0.5 * sigma **2)* dt + sigma * np.sqrt(dt)*z)C_0 = np.exp(-r * T)* np.sum(np.maximum(S[-1] - K, 0))/Iend = time()# 估值结果print ('total time is %.6f seconds'%(end-start))print ('European Option Value %.6f'%C_0)total time is 0.039680 secondsEuropean Option Value 7.993282前２０条模拟路径# 前２０条模拟路径import matplotlib.pyplot as plt%matplotlib inlineplt.figure(figsize=(10,7))plt.grid(True)plt.xlabel('Time step')plt.ylabel('index level')for i in range(20):plt.plot(S.T[i]) 到期指数模拟水平# 到期时所有模拟指数水平的频率直方图%matplotlib inlineplt.hist(S[-1], bins=50)plt.grid(True)plt.xlabel('index level')plt.ylabel('frequency')Text(0, 0.5, 'frequency') 到期期权内在价值# 模拟期权到期日的内在价值%matplotlib inlineplt.hist(np.maximum(S[-1]-K, 0), bins=50)plt.grid(True)plt.xlabel('option inner value')plt.ylabel('frequency')Text(0, 0.5, 'frequency') 方法四：全向量化的Numpyimport numpy as npfrom time import time# 计算的一些初始值S_0 = 100.0    # 股票或指数初始的价格;K = 105        #  行权价格T = 1.0        #  期权的到期年限(距离到期日时间间隔)r = 0.05       #   无风险利率sigma = 0.2    # 波动率(收益标准差)M = 50         # number of time stepsdt = T/M       # time entervalI = 20000       # number of simulationnp.random.seed(2000)start = time()# 生成一个随机变量的数组，M+1行，I列# 同时计算出没一条路径，每一个时间点的指数水平的增量# np.cumsum(axis=0)，在列的方向上进行累加得到每一个时间步数上的指数水平S = S_0 * np.exp(np.cumsum((r - 0.5*sigma **2) *dt +sigma *np.sqrt(dt) *np.random.standard_normal((M+1, I)),axis=0))S  = S_0C_0 = np.exp(-r * T) * np.sum(np.maximum(S[-1] - K, 0))/Iend = time()print ('toatl time is %.6f seconds'%(end-start))print ('Europaen Option Value %.6f'%C_0)toatl time is 0.077348 secondsEuropaen Option Value 8.113643前２０条模拟路径# 前２０条模拟路径import matplotlib.pyplot as plt%matplotlib inlineplt.figure(figsize=(10,7))plt.grid(True)plt.xlabel('Time step')plt.ylabel('index level')plt.plot(S[:,:20])[,,,,,,,,,,,,,,,,,,,] 模拟到期指数水平# 到期时所有模拟指数水平的频率直方图import matplotlib.pyplot as plt%matplotlib inlineplt.hist(S[-1], bins=50)plt.grid(True)plt.xlabel('index level')plt.ylabel('frequency')Text(0, 0.5, 'frequency') 模拟到期期权内在价值# 模拟期权到期日的内在价值%matplotlib inlineplt.hist(np.maximum(S[-1]-K, 0), bins=50)plt.grid(True)plt.xlabel('option inner value')plt.ylabel('frequency')Text(0, 0.5, 'frequency') sum(S[-1] < K)    # 在两万次模拟中超过一万次到期期权内在价值为０10748结果对比1.Scipy,估值结果：8.021352，耗时：511 µs2.Python,估值结果：8.159995，耗时：1.616999s3.向量化Numpy,估值结果：7.993282，耗时：0.039680s4.完全向量化Numpy,估值结果：8.113643，耗时：0.077348Scipy，用时最短是因为，沒有进行20000次的模拟估值．其他三个方法进行了20000次的模拟，基于Numpy的计算方法速度比较快．
展开全文 • 在了解了蒙特卡洛模拟的基本操作后，我们再举三个案例来进一步巩固知识。感兴趣的同学可以尝试自己写出代码再来参考笔记。第一个案例是关于自然常数e的估计问题，这个问题跟Buffon投针有异曲同工之妙；在投针问题里...


在了解了蒙特卡洛模拟的基本操作后，我们再举三个案例来进一步巩固知识。感兴趣的同学可以尝试自己写出代码再来参考笔记。 第一个案例是关于自然常数e的估计问题，这个问题跟Buffon投针有异曲同工之妙；在投针问题里，我们想方设法把pi弄到了概率表达式中，于是同理可知，只要把e设计到概率中去那么这个估计问题也就不难了。(实际上我们已经给出了背景--伯努利错装信封问题；要想自己想出一个实验设计还是蛮难的) 在写第二题的代码的过程中，我想了半天也不知道该怎么写出“按概率出现的随机数”，搞了几个for循环最后运行量太大导致无功而返。但是后来一查才知道，原来matlab是有现成的函数randsrc()的【捂脸】；那么有了这个强力的randsrc()就好办了，只需要设置一个while循环，对rank=1的初始武器随机升级直到到达5级为止即可。  最后一题也不难，看看就好 展开全文 • matlab中的蒙特卡洛模拟算法，可以直接使用。可以直接使用。
• 期权定价中的蒙特卡洛模拟方法期权作为最基础的金融衍生产品之一，为其定价一直是金融工程的重要研究领域，主要使用的定价方法有偏微分方程法、鞅方法和数值方法。而数值方法又包括了二叉树方法、有限差分法和...
• 字幕组双语原文：蒙特卡洛模拟(Python)深入教程英语原文：Monte Carlo Simulation An In-depth Tutorial with Python翻译：大表哥、wiige什么是蒙特卡罗模拟？蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的...
• 蒙特卡洛模拟(monte Carlo simulation)是一种通过重复随采样找到问题解的方法。适合于算法没法实现的问题。如何找到圆周率Pi考虑一个周长为1的单位圆嵌在边长为2的正方形中。图1 因此，我们只要知道二者面积之比...
• 蒙特卡洛模拟预测股票In a previous article, I outlined the limitations of conventional time series models such as ARIMA when it comes to forecasting extreme temperature values, which in and of ... python java 机器学习
• 蒙特卡洛模拟方法的matlab实现 这篇文章本来发在另一个号上的。。但是由于历史遗留的原因（id。微信号）把那个号注销了，结果忘记删除原文章，好像申请删除还挺麻烦的，所以不删了直接在这重新发一遍 蒙特卡洛模拟这... 数学建模 matlab
• 作者：陈勇吏(上海交通大学)Stata 连享会：知乎| 简书 |码云 | CSDNStata连享会计量专题||公众号合集连享...本文介绍 Stata 中做蒙特卡洛模拟的两种常用方法。第一种方法是使用 postfile 命令，第二种方法是 simula...
• 现在我们用蒙特卡洛模拟计算一下，醉汉在不同的条件下打车回家的概率。我们先定义几个参数。how_many_steps，表示醉汉走多少步数算完成一次随机游走。foot_limit，表示醉汉超过出发的原点多少米就不走了，要打车回家...
• 课程作业，用蒙特卡洛模拟极大似然估计的概率密度函数与最小二乘估计式子。提供matlab源码与 实验报告。
• 利用matlab对电动汽车无序充电日负荷进行蒙特卡洛模拟，利用matlab对电动汽车无序充电日负荷进行蒙特卡洛模拟，利用matlab对电动汽车无序充电日负荷进行蒙特卡洛模拟 matlab
• 蒙特卡洛模拟法简介蒙特卡洛(MonteCarlo)模拟是一种通过设定随机过程，反复生成时间序列，计算参数估计量和统计量，进而研究其分布特征的方法。具体的，当系统中各个单元的可靠性特征量已知，但系统的可靠性过于...
• 内有详细的蒙特卡洛模拟光子在组织中的运动 内有详细的蒙特卡洛模拟光子在组织中的运动 内有详细的蒙特卡洛模拟光子在组织中的运动 内有详细的蒙特卡洛模拟光子在组织中的运动
• 主要内容：考虑到系统可靠性的影响，研究了腐蚀管道的可靠性分析。...蒙特卡洛模拟；相关性0 引 言海上和海底管道的重大问题是老化管道腐蚀。为了确定这些管道的剩余使用时间，需要建立确定性容量模...
• 研究论文
• Python
• 蒙特卡洛模拟是一种统计学方法，基本原理是通过大量的随机样本对系统进行模拟，从而求得所需计算的参量。使用蒙特卡洛模拟方法的基本要素包括：构建或描述概率模型、从已知概率分布采样、建立各种估计量。 使用... Python
• 蒙特卡洛模拟组织参数，MCML是多层蒙特卡罗模拟的软件，用以模拟光在多层介质中的一个分布。getmcml.m 从输出文件中获得模拟得到的结果。Conv软件是对MCML的结果进行卷积，获得圆心光斑入射时的光的分布。具体的参数...  ...