Python作为“网红”的数据分析工具,正引起越来越多人的兴趣。上篇介绍了蒙特卡洛模型以及数理统计的基础知识,并使用EXCEL实现。但相比Python而言,EXCEL可处理的数据量有限,而且带有单元格公式后会严重影响表格的计算速度。本篇介绍如何用Python实现同样的效果,希望对那些对Python感兴趣的朋友有所帮助。
Python简介
不重复说,本公众号也有介绍Python的相关文章,请参考:如何学习一项技能-从我自己自学Python谈起(2)
引用Numpy库
NumPy库是Python的一种开源的数值计算扩展,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。NASA用其来处理一些运算。
蒙特卡洛模型用到的Numpy句法:
1:首先引用Numpy库,起个名字叫np
import numpy as np
2:生成符合正太分布的0~99之间的随机整数 ,total_count代表生成随机数的个数,也就是要模拟多少次
np.random.randint(0,99,Total_Count)
3:用Numpy自带函数计算相关指标 (NPV_Num是一个数组)
Max_Num=np.max(NPV_Num)
Min_Num=np.min(NPV_Num)
Mean_Num=round(np.mean(NPV_Num),0)
Std_Num=int(np.std(NPV_Num, ddof = 1))
用判断语句给相关参数赋值
以研发费为例,Python的句法实际上就是把EXCEL公式“翻译”了一遍。Index_YFF是一个数组,使用.append方法增加数组值。
Index_YFF=[]
rnd_nums=np.random.randint(0,99,Total_Count)
rnd_num rnd_nums:
rnd_num<=19:
Index_YFF.append(400)
rnd_num>19 rnd_num<=69:
Index_YFF.append(500)
rnd_num>69:
Index_YFF.append(600)
用Print语句输出计算结果
Print语句是Python常用的语句,用来显示结果值。
print("样本数:",Total_Count)
print("最大值:",Max_Num)
print("最小值:",Min_Num)
print("平均值:",Mean_Num)
print("标准差:",Std_Num)
用matplotlib库画图
Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
counts, bins, path = plt.hist(NPV_Num,bins=Std_Num,color='green',density=True)
plt.title("Normal distribution")
plt.show()
写一个可以计算年金现值的函数
编程就像搭积木,主程序一般是描述程序运行的顺序和逻辑,而一些用来传递参数进行处理的代码,可以放到自定义函数中。
def pv_f(c,r,n,when=1):
c=np.array(c)
r=np.array(r)
if when==1:
n=np.arange(1,n+1)
else:
n=np.arange(0,n)
pv=c/(1+r)**n
return pv.sum()
至此,用Python模拟蒙特卡洛的方法和代码介绍完了。和EXCEL比较起来,Python的方法更容易扩展,运算速度更快,大有用武之地!