﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Dain-文章分类-Computational Finance</title><link>http://www.cppblog.com/dqchen/category/3428.html</link><description>写出一个可以工作的程序并不够</description><language>zh-cn</language><lastBuildDate>Sun, 25 May 2008 22:22:16 GMT</lastBuildDate><pubDate>Sun, 25 May 2008 22:22:16 GMT</pubDate><ttl>60</ttl><item><title>统计函数NormSDist和NormSInv函数实现</title><link>http://www.cppblog.com/dqchen/articles/19772.html</link><dc:creator>Dain</dc:creator><author>Dain</author><pubDate>Tue, 13 Mar 2007 12:52:00 GMT</pubDate><guid>http://www.cppblog.com/dqchen/articles/19772.html</guid><wfw:comment>http://www.cppblog.com/dqchen/comments/19772.html</wfw:comment><comments>http://www.cppblog.com/dqchen/articles/19772.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/dqchen/comments/commentRss/19772.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dqchen/services/trackbacks/19772.html</trackback:ping><description><![CDATA[<p><font size=2>先说下今天写VBA学到的，那就是Excel的统计工作表函数。<br>Excel的统计工作表函数用于对数据区域进行统计分析。例如，统计工作表函数可以用来统计样本的方差、数据区间的频率分布等。是不是觉得好像是很专业范畴的东西？是的，统计工作表函数中提供了很多属于统计学范畴的函数，但也有些函数其实在你我的日常生活中是很常用的，比如求班级平均成绩，排名等。<br>但是我的程序是要cpp实现上面俩个函数，可是cpp没有这样的统计函数。查了好多资料，找到了多项式近似的方法： <br></font><font size=2><font style="BACKGROUND-COLOR: #ffffff" color=#0000ff><font style="BACKGROUND-COLOR: #ffffff" color=#ee82ee>/***************************************************************/<br>/* 返回标准正态分布的累积函数，该分布的平均值为 0，标准偏差为 1。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br>/***************************************************************/<br></font>double NormSDist(const double z)<br>{<br>&nbsp;// this guards against overflow<br>&nbsp;if(z &gt; 6)&nbsp;return 1;<br>&nbsp;if(z &lt; -6)&nbsp;return 0;</font> </font></p>
<p><font size=2><font style="BACKGROUND-COLOR: #ffffff" color=#0000ff>&nbsp;static const double&nbsp;gamma&nbsp;=&nbsp; 0.231641900,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a1&nbsp;&nbsp;=&nbsp; 0.319381530,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a2&nbsp;&nbsp;=&nbsp;-0.356563782,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a3&nbsp;&nbsp;=&nbsp; 1.781477973,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a4&nbsp;&nbsp;=&nbsp;-1.821255978,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a5&nbsp;&nbsp;=&nbsp; 1.330274429;</font> </font></p>
<p><font size=2><font style="BACKGROUND-COLOR: #ffffff" color=#0000ff>&nbsp;double&nbsp;k = 1.0 / (1 + fabs(z) * gamma);<br>&nbsp;double&nbsp;n = k * (a1 + k * (a2 + k * (a3 + k * (a4 + k * a5))));<br>&nbsp;n = 1 - Normal(z) * n;<br>&nbsp;if(z &lt; 0)<br>&nbsp;&nbsp;return 1.0 - n;</font> </font></p>
<p><font size=2><font style="BACKGROUND-COLOR: #ffffff" color=#0000ff>&nbsp;return n;<br>}</font> <br><br></font><font size=2><font style="BACKGROUND-COLOR: #ffffff"><font color=#ee82ee>/***************************************************************/<br>/* 返回标准正态分布累积函数的逆函数。该分布的平均值为 0，标准偏差为 1。</font>&nbsp;</font>&nbsp;</font>&nbsp;<font style="BACKGROUND-COLOR: #ffffff"><font color=#ee82ee size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br>/***************************************************************/ <br></font></font><font size=2><font color=#0000ff>double normsinv(const double p)<br>{<br>&nbsp;static const double LOW&nbsp;&nbsp;= 0.02425;<br>&nbsp;static const double HIGH&nbsp;= 0.97575;</font></font></p>
<p><font size=2><font color=#0000ff>&nbsp;/* Coefficients in rational approximations. */<br>&nbsp;static const double a[] =<br>&nbsp;{<br>&nbsp;&nbsp;-3.969683028665376e+01,<br>&nbsp;&nbsp; 2.209460984245205e+02,<br>&nbsp;&nbsp;-2.759285104469687e+02,<br>&nbsp;&nbsp; 1.383577518672690e+02,<br>&nbsp;&nbsp;-3.066479806614716e+01,<br>&nbsp;&nbsp; 2.506628277459239e+00<br>&nbsp;};</font> </font></p>
<p><font size=2><font color=#0000ff>&nbsp;static const double b[] =<br>&nbsp;{<br>&nbsp;&nbsp;-5.447609879822406e+01,<br>&nbsp;&nbsp; 1.615858368580409e+02,<br>&nbsp;&nbsp;-1.556989798598866e+02,<br>&nbsp;&nbsp; 6.680131188771972e+01,<br>&nbsp;&nbsp;-1.328068155288572e+01<br>&nbsp;};</font> </font></p>
<p><font size=2><font color=#0000ff>&nbsp;static const double c[] =<br>&nbsp;{<br>&nbsp;&nbsp;-7.784894002430293e-03,<br>&nbsp;&nbsp;-3.223964580411365e-01,<br>&nbsp;&nbsp;-2.400758277161838e+00,<br>&nbsp;&nbsp;-2.549732539343734e+00,<br>&nbsp;&nbsp; 4.374664141464968e+00,<br>&nbsp;&nbsp; 2.938163982698783e+00<br>&nbsp;};</font> </font></p>
<p><font size=2><font color=#0000ff>&nbsp;static const double d[] =<br>&nbsp;{<br>&nbsp;&nbsp;7.784695709041462e-03,<br>&nbsp;&nbsp;3.224671290700398e-01,<br>&nbsp;&nbsp;2.445134137142996e+00,<br>&nbsp;&nbsp;3.754408661907416e+00<br>&nbsp;};</font> </font></p>
<p><font size=2><font color=#0000ff>&nbsp;double q, r;</font> </font></p>
<p><font size=2><font color=#0000ff>&nbsp;errno = 0;</font> </font></p>
<p><font size=2><font color=#0000ff>&nbsp;if (p &lt; 0 || p &gt; 1)<br>&nbsp;{<br>&nbsp;&nbsp;errno = EDOM;<br>&nbsp;&nbsp;return 0.0;<br>&nbsp;}<br>&nbsp;else if (p == 0)<br>&nbsp;{<br>&nbsp;&nbsp;errno = ERANGE;<br>&nbsp;&nbsp;return -HUGE_VAL /* minus "infinity" */;<br>&nbsp;}<br>&nbsp;else if (p == 1)<br>&nbsp;{<br>&nbsp;&nbsp;errno = ERANGE;<br>&nbsp;&nbsp;return HUGE_VAL /* "infinity" */;<br>&nbsp;}<br>&nbsp;else if (p &lt; LOW)<br>&nbsp;{<br>&nbsp;&nbsp;/* Rational approximation for lower region */<br>&nbsp;&nbsp;q = sqrt(-2*log(p));<br>&nbsp;&nbsp;return (((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) /<br>&nbsp;&nbsp;&nbsp;((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1);<br>&nbsp;}<br>&nbsp;else if (p &gt; HIGH)<br>&nbsp;{<br>&nbsp;&nbsp;/* Rational approximation for upper region */<br>&nbsp;&nbsp;q&nbsp; = sqrt(-2*log(1-p));<br>&nbsp;&nbsp;return -(((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) /<br>&nbsp;&nbsp;&nbsp;((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1);<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp;/* Rational approximation for central region */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;q = p - 0.5;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;r = q*q;<br>&nbsp;&nbsp;return (((((a[0]*r+a[1])*r+a[2])*r+a[3])*r+a[4])*r+a[5])*q /<br>&nbsp;&nbsp;&nbsp;(((((b[0]*r+b[1])*r+b[2])*r+b[3])*r+b[4])*r+1);<br>&nbsp;}<br>}</font> </font></p>
<img src ="http://www.cppblog.com/dqchen/aggbug/19772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dqchen/" target="_blank">Dain</a> 2007-03-13 20:52 <a href="http://www.cppblog.com/dqchen/articles/19772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quasi-Monte Carlo(Korobov rule)</title><link>http://www.cppblog.com/dqchen/articles/19618.html</link><dc:creator>Dain</dc:creator><author>Dain</author><pubDate>Mon, 12 Mar 2007 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/dqchen/articles/19618.html</guid><wfw:comment>http://www.cppblog.com/dqchen/comments/19618.html</wfw:comment><comments>http://www.cppblog.com/dqchen/articles/19618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dqchen/comments/commentRss/19618.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dqchen/services/trackbacks/19618.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">cmath</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000"><br>#include&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">vector</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">using</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">namespace</span> <span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;Korobov&nbsp;rules</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">vector</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">&nbsp;vector</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">&nbsp;korobov(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;a,&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;base</span>&nbsp;<span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp; n, &nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp; sample&nbsp;size(a&nbsp;prime)</span>&nbsp;<span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp; t)&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp; dimensional</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;G(t);<br>&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;U(n,vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(t));&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;t-dimensional&nbsp;points</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,j;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;t;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pow(a,i)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)n;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;n;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;t;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U[i][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fmod(i&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;G[j],</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;G.clear();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;U;<br>}</span></div>
<img src ="http://www.cppblog.com/dqchen/aggbug/19618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dqchen/" target="_blank">Dain</a> 2007-03-12 11:04 <a href="http://www.cppblog.com/dqchen/articles/19618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Monte Carlo用于二叉树模拟衍生证券定价</title><link>http://www.cppblog.com/dqchen/articles/17480.html</link><dc:creator>Dain</dc:creator><author>Dain</author><pubDate>Wed, 10 Jan 2007 03:15:00 GMT</pubDate><guid>http://www.cppblog.com/dqchen/articles/17480.html</guid><wfw:comment>http://www.cppblog.com/dqchen/comments/17480.html</wfw:comment><comments>http://www.cppblog.com/dqchen/articles/17480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dqchen/comments/commentRss/17480.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dqchen/services/trackbacks/17480.html</trackback:ping><description><![CDATA[
		<font size="2">  二叉树方法可以和Monte Carlo模拟结合起来为衍生证券定价。二叉树定价模型是从构造好的二叉树中随机选择一条路径样本，从二叉树的末端开始倒推计算出衍生证券的价格，但是采用了Monte Carlo后，是顺着二叉树往后计算的。<br />  基本方法：        <br />  在第一个节点（根节点），随机产生一个0到1间的随机数，如果这个数小于p，就选择当前的上升分支，反之选择下降分支。这样就产生了一个新节点，继续上面的过程，直到二叉树的末端。一条路径产生了，衍生证券的最终价值就可以计算出来了（可以看作是全部可能终值集合中的一个随机样本），这样完成了第一次模拟。更多的样本路径得到更多的样本终值。进行多次模拟，用平均值来估计衍生证券的价格。</font>
<img src ="http://www.cppblog.com/dqchen/aggbug/17480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dqchen/" target="_blank">Dain</a> 2007-01-10 11:15 <a href="http://www.cppblog.com/dqchen/articles/17480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>