相关日志
-
-
分享
金融工程——蒙特卡洛模拟
-
accumulation 2015-5-17 09:18
-
第一,产生随机数e的相关参数选取问题,一般而言,股票价格S序列是不按照St=S(t-1)+e这样的方式(布朗运动)随机生成的,而是按照伊藤过程,即dS=μSdt+ΣSedt这样的规律生成的,即股价运动遵循几何布朗运动;其中,S为股价,μ为期望收益(漂移率),Σ为股价的标准差,e为服从期望为0、方差为1的正态分布的随机数,t为时间间隔;蒙特卡洛模拟时只要将微分转换为差分形式就可以了,不过,在微分向差分转换的过程中将产生误差;因此,一般而言,随机数e的相关参数——描述波动率的方差或标准差,是根据历史数据估计出来的,或者是研究问题时给定的; 第二,模拟得到数据的平均数不会收敛到100天的股票价格;因为,在布朗运动St=S(t-1)+e以及几何布朗运动dS=μSdt+ΣSedt中,由于其过程是随机游走,因此模拟出的股价运动路径只是可能的一种,而不会产生收敛的效果;在金融经济学中,根据有效市场假说中的弱式形式,股票价格的随机游走特性,历史信息已经完全反映在股价中了,未来股价只与当期股价有关,使得股票价格具有不可预测性;因此,不会产生股价的收敛效果;但是,蒙特卡洛模拟在金融资产定价当中依然发挥了巨大的作用,如:为期权定价的问题中,通过蒙特卡洛模拟,可以得出与BS公式相近的结果,并且能为BS公式不能起到作用的美式期权定价; 关于蒙特卡洛模拟更多的内容,建议参考下列三本书: 1.John Hull的著作《期权期货及其他衍生产品》: https://bbs.pinggu.org/thread-3690738-1-1.html ; 2.金融工程中的蒙特卡洛方法: https://bbs.pinggu.org/thread-3704446-1-1.html ; 3.Financial Numerical Recipes in C++: https://bbs.pinggu.org/thread-452230-1-1.html ; https://bbs.pinggu.org/thread-2669793-1-1.html ;
-
个人分类: 金融工程|0 个评论
-
-
分享
金融工程中的蒙特卡洛方法
-
accumulation 2015-5-10 12:24
-
内容简介《金融工程中的蒙特卡罗方法》(影印版)中介绍了蒙特卡罗方法在金融中的用途,并且将模拟用作呈现金融工程中模型和思想的工具。《金融工程中的蒙特卡罗方法》大致分为三个部分。第一部分介绍了蒙特卡罗方法的基本原理,衍生定价基础以及金融工程中一些最重要模型的实现。第二部分描述了如何改进模拟精确度和效率。最后的第三部分讲述了几个特别的论题:价格敏感度估计,美式期权定价以及金融投资组合中的市场风险和信贷风险评估。
-
个人分类: 金融工程|0 个评论
-
-
分享
蒙特卡洛模拟—期权定价模型
-
accumulation 2015-4-30 23:51
-
#include math.h #include vector #include iostream #include stdlib.h #include time.h using namespace std; double sampleNormal() { double u=((double) rand()/(RAND_MAX))*2-1; double v=((double) rand()/(RAND_MAX))*2-1; double r=u*u+v*v; if (r==0 || r1) return sampleNormal(); double c=sqrt(-2*log(r)/r); return u*c; } double simulate_random_variable(const double S, const double r, const double sigma, const double time) { double R=(r-0.5*pow(sigma,2))*time; double SD=sigma*sqrt(time); return S*exp(R+SD*sampleNormal()); } double max(double a,double b) { if (ab) return a; else return b; } void option_price_european_simulated(const double S, const double X, const double r, const double sigma, const double time, const int no_sims, double call_option, double put_option) { double R=(r-0.5*pow(sigma,2))*time; double SD=sigma*sqrt(time); double sum_payoffs1=0.0; double sum_payoffs2=0.0; for(int n=1; n=no_sims; n++) { double S_T=S*exp(R+SD*sampleNormal()); sum_payoffs1+=max(0.0,S_T-X); sum_payoffs2+=max(X-S_T,0.0); } call_option=exp(-r*time)*(sum_payoffs1/double(no_sims)); put_option=exp(-r*time)*(sum_payoffs2/double(no_sims)); } int main() { double seed=(double)time(NULL); double S=50; double X=50; double r=0.1; double sigma=0.4; double time=0.4167; cout"Next price: "simulate_random_variable(S,r,sigma,time)endl; int no_sims=5000000; double call_option; double put_option; option_price_european_simulated(S,X,r,sigma,time,no_sims,call_option,put_option); cout"Monte Carlo Call: "call_optionendl; cout"Monte Carlo Put: "put_optionendl; system("pause"); }
-
个人分类: 金融工程|0 个评论
-
-
分享
蒙特卡洛方法计算最值
-
accumulation 2015-4-30 18:33
-
#include iostream #include cmath #include ctime #include cstdlib using namespace std; const double b = 0.9; double u = 0; ///.....计算函数的值......//// double Ifunc(double x, double y, double z) { double hsz = 0.0; hsz = 50 - pow(5 * x - 2 * y , 2) - pow(x - 7 * y * y + 2 * z * z , 4); return hsz; } /////..........概率计算.........////// double glfunc(double w1, double w2, double T) { double p; double u = 0; double w3 = - 1.00 * abs(w1 - w2); u = exp(w3 / (b * T)); if (u 1) p = u; else p = 1; return p; } void main() { double x = 0 , y = 0 , z = 0 , x_next = 0 , y_next = 0 , z_next = 0 , hsz = 0 , hsz_next = 0 , hsz_max = 0; double x_max , y_max , z_max; cout "请输入 x y z 值 : " ; cin x y z; cout endl; double T = 20000; hsz_max = Ifunc(x,y,z); do { hsz = Ifunc(x,y,z); cout "hsz = " hsz endl;//计算初始值 srand(static_castunsigned(time(static_casttime_t *(NULL)))); //进行 y = x + z 变换 x_next = x + -x * (rand() % 10000) / 10100.00 ; y_next = y + -y * (rand() % 10000) / 10100.00 ; z_next = z + -z * (rand() % 10000) / 10100.00 ; cout "x_next = " x_next endl; cout "y_next = " y_next endl; cout "z_next = " z_next endl; hsz_next = Ifunc(x_next,y_next,z_next),u = 0.9 * u; cout "hsz_next = " hsz_next endl; //随机选取数r_rand double r_rand = 0.01 * (rand() + 500) / 33000.00; cout "r_rand = " r_rand endl; double p = glfunc(hsz,hsz_next,T); ///概率接受检验 if (r_rand = 1) { x = x_next; y = y_next; z = z_next; hsz = hsz_next; } else { x_next = x; y_next = y; z_next = z; hsz_next = hsz; } if(hsz_next hsz_max) { x_max = x_next; y_max = y_next; z_max = z_next; hsz_max = hsz_next; T = T * b; } cout endl endl; cout "最大值为 :" hsz_max endl; cout "当取得最大值时" endl; cout "x_max = " x_max endl; cout "y_max = " y_max endl; cout "z_max = " z_max endl; cout "***************************" endl; getchar(); }while(T = 0); }
-
个人分类: 金融工程|0 个评论
-
-
分享
求助:有哪位大神会用蒙特卡洛模拟法?
-
wqxzl5 2013-1-31 15:16
-
问题同题目,不胜感激啊!
-
24 次阅读|0 个评论
GMT+8, 2026-4-28 06:53