请选择 进入手机版 | 继续访问电脑版
楼主: cysk1011
1429 3

[其他] 固定期初、期末价格,模拟中间股票走势。给... [推广有奖]

  • 0关注
  • 0粉丝

本科生

51%

还不是VIP/贵宾

-

威望
0
论坛币
8332 个
通用积分
1.3500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1102 点
帖子
50
精华
0
在线时间
129 小时
注册时间
2011-4-12
最后登录
2024-3-23

cysk1011 发表于 2014-11-1 17:58:16 |显示全部楼层 |坛友微信交流群
50论坛币
固定期初、期末价格,模拟中间股票走势。给出大致算法、思路即可。能给R代码更好!!

最佳答案

robvsn 查看完整内容

思路: 从期初价格和期末价格分别生成random walk 序列,直到两序列中间有差距小于sigma的点存在。把两个序列在这一点拼起来。 sigma是波动率,应该选择合适的波动率,如果输入的波动率太小,程序会给出建议的最小值。
关键词:股票走势 R代码 走势

回帖推荐

liqiushi1991 发表于4楼  查看完整内容

用二叉树吧,代码只是一个思路, r最近没动,所以风格是c++的。有问题欢迎提问 已知量: 设时间以年为单位T,年化波动率为sigma, 年化无风险利率为r。期初价格st,期末价格sT 节点数N 假设风险中性世界里(现实世界是不是无所谓,只不过在这个世界里结果和真实世界一样而又简单) 1.一共有N个节点,每个节点时间单位为T/N. 2.每个节点向上幅度u=exp(T/N*sigma) 向下幅度d=exp(-T/N*sigma) , 向上概率p=(exp(rT/N)-d)/(u-d), ...
robvsn 发表于 2014-11-1 17:58:17 |显示全部楼层 |坛友微信交流群
思路: 从期初价格和期末价格分别生成random walk 序列,直到两序列中间有差距小于sigma的点存在。把两个序列在这一点拼起来。
sigma是波动率,应该选择合适的波动率,如果输入的波动率太小,程序会给出建议的最小值。
  1. generatePrice <- function(startPrice,endPrice,len,stepSigma)
  2. {
  3.     # check sigma
  4.     sigmaLim = abs(endPrice-startPrice)/sqrt(len)/2
  5.     if(stepSigma < sigmaLim) {
  6.         cat('sigma too small for simulation. recommanded value should greater than',sigmaLim,'\n')
  7.         return(0)
  8.     }
  9.     r1 = c(0,rnorm(l-1,sd=stepSigma))
  10.     p1 = exp(log(startPrice) + cumsum(r1))
  11.     while(TRUE) {
  12.         r2 = c(0,rnorm(l-1,sd=stepSigma))
  13.         p2 = exp(log(endPrice) + rev(cumsum(r2)))
  14.         a = p2-p1
  15.         if (any(abs(a) < stepSigma)) {break}
  16.     }
  17.     pos = match(T,abs(a) < stepSigma)
  18.     if (pos < len) {
  19.         res = c(p1[1:pos],p2[(pos+1):len])
  20.     } else {
  21.         res = c(p1[1:(pos-1)],p2[len])
  22.     }
  23.     return(res)
  24. }

  25. # min sigma
  26. abs(3-2.5)/sqrt(100)/2
  27. # price series
  28. p = generatePrice(2.5,3,100,0.01)
  29. plot(p,type='l')
复制代码

使用道具

robvsn 发表于 2014-11-1 22:22:02 |显示全部楼层 |坛友微信交流群
思路: 从期初价格和期末价格分别生成random walk 序列,直到两序列中间有差距小于sigma的点存在。把两个序列在这一点拼起来。
sigma是波动率,应该选择合适的波动率,如果输入的波动率太小,程序会给出建议的最小值。
  1. generatePrice <- function(startPrice,endPrice,len,stepSigma)
  2. {
  3.     # check sigma
  4.     sigmaLim = abs(endPrice-startPrice)/sqrt(len)/2
  5.     if(stepSigma < sigmaLim) {
  6.         cat('sigma too small for simulation. recommanded value should greater than',sigmaLim,'\n')
  7.         return(0)
  8.     }
  9.     r1 = c(0,rnorm(l-1,sd=stepSigma))
  10.     p1 = exp(log(startPrice) + cumsum(r1))
  11.     while(TRUE) {
  12.         r2 = c(0,rnorm(l-1,sd=stepSigma))
  13.         p2 = exp(log(endPrice) + rev(cumsum(r2)))
  14.         a = p2-p1
  15.         if (any(abs(a) < stepSigma)) {break}
  16.     }
  17.     pos = match(T,abs(a) < stepSigma)
  18.     if (pos < len) {
  19.         res = c(p1[1:pos],p2[(pos+1):len])
  20.     } else {
  21.         res = c(p1[1:(pos-1)],p2[len])
  22.     }
  23.     return(res)
  24. }

  25. # min sigma
  26. abs(3-2.5)/sqrt(100)/2
  27. # price series
  28. p = generatePrice(2.5,3,100,0.01)
  29. plot(p,type='l')
复制代码

使用道具

liqiushi1991 发表于 2014-11-2 01:03:32 |显示全部楼层 |坛友微信交流群

二叉树即可,布朗桥也行,但是很复杂

用二叉树吧,代码只是一个思路, r最近没动,所以风格是c++的。有问题欢迎提问
已知量:
设时间以年为单位T,年化波动率为sigma, 年化无风险利率为r。期初价格st,期末价格sT
节点数N
假设风险中性世界里(现实世界是不是无所谓,只不过在这个世界里结果和真实世界一样而又简单)
1.一共有N个节点,每个节点时间单位为T/N.
2.每个节点向上幅度u=exp(T/N*sigma) 向下幅度d=exp(-T/N*sigma) , 向上概率p=(exp(rT/N)-d)/(u-d),向下概率1-p.
3.解方程:
st*u^n*d^(N-n)=sT, 即log(sT/st)=(2n-N)T/N*sigma, 即n=(log(sT/st)N/(sigma*T)+N)/2
把n算出来即可。n理论上应该是整数,所以你要尽量取N大一点,这样四舍五入得到n模拟出来的sT和真实sT误差会很小。
4.接下来只要安排具体那几步向上走,那几步向下走即可
生成随机数rand,均匀分布 0,1.
double s[N+1];
s[0]=st;
int number_u=n; int number_d=N-n;int flag;
for(int i=0;i<=N;i++)
{if (rand<p) { s[i+1]=s[i-1]*u; number_u-=1;}
else s[i+1]=s*d, number_d-=1;
if (number_u==0){flag=1; break}
if(number_d==0){flag=-1;break}
}
if (flag==1)
   for (i=N-number_d;i<=N;i++) s[i+1]=s*d;
if (flag==-1)
   for (i=N-number_u;i<=N;i++) s[i+1]=s*u;
大概意思就是,如果随机数小于上升概率,那就让下一个节点向上走,反之亦然。但是由于你终点价格固定了,说明向上向下走的步数也就固定了,所以如果向下或向上的步数已经模拟完了,剩下的都给相反方向即可。
最后把数组s画出来就好了

使用道具

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

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-16 22:45