楼主: 十三太饱
5000 14

[期权交易] 【求助】用VBA写了一个简单的蒙特卡洛模拟,跑不出结果,求高手帮忙看看哪里不对QAQ [推广有奖]

  • 0关注
  • 0粉丝

高中生

92%

还不是VIP/贵宾

-

威望
0
论坛币
513 个
通用积分
0.2528
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
294 点
帖子
24
精华
0
在线时间
40 小时
注册时间
2019-1-24
最后登录
2022-12-16

楼主
十三太饱 发表于 2019-2-21 08:42:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
写了一个蒙特卡洛模拟的程序来给期权定价,参考了约翰赫尔的期权期货(见图)。
但是代码跑不出结果,一直显示计算有误,请大神帮忙看看哪里不对QAQ,感谢!!!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:蒙特卡洛模拟 蒙特卡洛 求高手 蒙特卡 VBA VBA 期权定价 蒙特卡洛模拟

回帖推荐

Chemist_MZ 发表于9楼  查看完整内容

Public Function MCoption(S, X, T, r, sigma, n, a) Dim i As Integer Dim sum, Se, P As Double sum = 0 For i = 1 To n Step 1 Se = S * Exp((r - sigma * sigma / 2) * T + sigma * RndNorm(0, 1) * Sqr(T)) P = Exp(-r * T) * Application.Max((X - Se) * (-1) ^ a, 0) sum = sum + P Next i MCoption = sum / n End Function Public Function RndNorm(Mean As Double, Std As Double) Dim V ...

沙发
十三太饱 发表于 2019-2-21 08:47:09
好像看不到图片,再发一次 参考约翰赫尔的期权期货一书中的价格路径 参照这个方法进行蒙特卡洛模拟 这个是我写的代码

藤椅
Chemist_MZ 在职认证  发表于 2019-2-21 10:03:22
十三太饱 发表于 2019-2-21 08:47
好像看不到图片,再发一次
error message 是什么?

板凳
十三太饱 发表于 2019-2-21 10:32:21
Chemist_MZ 发表于 2019-2-21 10:03
error message 是什么?
调试的时候没有报错,但是在excel中代入数据计算后就显示#VALUE!

报纸
十三太饱 发表于 2019-2-21 10:38:44
Chemist_MZ 发表于 2019-2-21 10:03
error message 是什么?
还想请教一个问题:我将这个文件存成了XLSM格式,但是今天再打开的时候,之前插入的自己写的其他函数都加载不出来。我查看了代码还在,也启用了宏,但是在插入函数——用户定义的列表里找不到自己写的函数了

地板
Chemist_MZ 在职认证  发表于 2019-2-21 10:42:19
十三太饱 发表于 2019-2-21 10:32
调试的时候没有报错,但是在excel中代入数据计算后就显示#VALUE!
能把代码的文本贴出来嘛?这样别人也好直接跑,容易debug

7
十三太饱 发表于 2019-2-21 10:45:44
Chemist_MZ 发表于 2019-2-21 10:42
能把代码的文本贴出来嘛?这样别人也好直接跑,容易debug
好的,谢谢您提醒!
Public Function MCoption(S, X, T, r, sigma, n, a)
'S:现价
'X:执行价
'T:到期日期间的时长
'r:连续复利的无风险利率
'sigma:股票价格的波动率
'epsilon:正态分布中的随机抽样
'n:模拟n次
'a:看涨看跌(看涨为1,看跌为0)
Dim i As Integer
Dim Se, P, sum As Variant

sum(0) = 0
For i = 1 To n Step 1
Se(i) = S * Exp((r - sigma * sigma / 2) * T + sigma * RndNorm(0, 1) * Sqr(T))
P(i) = Exp(-r * T) * Application.Max((X - Se(i)) * (-1) ^ a, 0)
sum(i) = sum(i - 1) + P(i)
Next i

MCoption = sum(n) / n

End Function

Public Function RndNorm(Mean As Double, Std As Double)
    Dim V1 As Double, V2 As Double, r As Double
    Do
        V1 = 2 * Rnd - 1
        V2 = 2 * Rnd - 1
        r = V1 ^ 2 + V2 ^ 2
    Loop Until r < 1
   
    RndNorm = Mean + V2 * Sqr(-2 * Log(r) / r) * Std
End Function

8
十三太饱 发表于 2019-2-21 10:50:05
关于那个无法调用函数的问题,刚刚已经解决了,重新打开了一次又能用了,可能是打开启用宏之后需要重新打开文件?

9
Chemist_MZ 在职认证  发表于 2019-2-21 11:02:15
十三太饱 发表于 2019-2-21 10:45
好的,谢谢您提醒!
Public Function MCoption(S, X, T, r, sigma, n, a)
'S:现价
Public Function MCoption(S, X, T, r, sigma, n, a)

Dim i As Integer
Dim sum, Se, P As Double

sum = 0

For i = 1 To n Step 1
Se = S * Exp((r - sigma * sigma / 2) * T + sigma * RndNorm(0, 1) * Sqr(T))
P = Exp(-r * T) * Application.Max((X - Se) * (-1) ^ a, 0)
sum = sum + P

Next i

MCoption = sum / n

End Function

Public Function RndNorm(Mean As Double, Std As Double)
    Dim V1 As Double, V2 As Double, r As Double
    Do
        V1 = 2 * Rnd - 1
        V2 = 2 * Rnd - 1
        r = V1 ^ 2 + V2 ^ 2
    Loop Until r < 1
   
    RndNorm = Mean + V2 * Sqr(-2 * Log(r) / r) * Std
End Function

你试试这个,我不太明白你为什么要将sum,Se和P设成array,设成标量就可以。而且我记得VBA里面array的size是要明确声明的,即便一开始不知道size用了variant,之后要用的时候还是要用ReDim来声明size。可能这就是一直报错的原因吧。
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
h2h2 + 5 + 5 + 5 精彩帖子
晓七 + 100 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

10
十三太饱 发表于 2019-2-21 11:12:01
Chemist_MZ 发表于 2019-2-21 11:02
Public Function MCoption(S, X, T, r, sigma, n, a)

Dim i As Integer
感谢大大!!!算出结果了!!



您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2025-12-26 17:33