C++和Python计算金融数学方程算法模型

要点

  1. C++代码蒙特卡罗模拟金融产品估值,开发C++并行计算模拟库。

  2. 算法伴随微分计算图及C++代码实现释义:C++应用经典的复合模式构建有向无环图,遍历有向无环图节点C++实现,C++使用懒惰评估计算次序,遍历代码实现,C++代码实现伴随数学形式,伴随传播的遍历策略C++代码。

  3. C++规划金融产品计算节点,存储,运算符和计算模块逻辑。

  4. C++算法伴随微分计算价格与模型参数的差异,串行和并行模拟整个蒙特卡罗评估的伴随物累积到模型参数中。

  5. C++使用检查点算法校准微分,从模型获取敏感性风险报告。

  6. C++算法伴随微分作为多维函数的有效微分,测试结果

  7. 依据数学方程或定律,Python绘制金融市场产品价值曲线:计算价值回报,预测市场波动,利率变化。

  8. Python概率密度函数和累计密度函数等数学计算进行不同产品估值,价值到期

  9. Python快速傅里叶和离散傅里叶变换从不同数学模型,计算金融品价值。

  10. Python使用蒙特卡罗和不同算法模拟金融产品价值

C++蒙特卡罗方法定价模拟

分析模型如下:
C ( S , t ) = S N ( d 1 ) − K e − r T N ( d 2 ) C(S, t)=S N\left(d_1\right)-K e^{-r T} N\left(d_2\right) C(S,t)=SN(d1)−Ke−rTN(d2)

其中, S S S 是标的资产价格, K K K 是执行价格, r r r 是利率(或"无风险利率"), T T T 是到期时间, σ \sigma σ 是(常数)标的资产的波动性 S S S。

d 1 d_1 d1 和 d 2 d_2 d2 定义如下:
d 1 = log ⁡ ( S / K ) + ( r + σ 2 2 ) T σ T d 2 = d 1 − σ T \begin{aligned} & d_1=\frac{\log (S / K)+\left(r+\frac{\sigma^2}{2}\right) T}{\sigma \sqrt{T}} \\ & d_2=d_1-\sigma \sqrt{T} \end{aligned} d1=σT log(S/K)+(r+2σ2)Td2=d1−σT
N N N 的公式由下式给出:
N ( x ) = 1 2 π ∫ − ∞ x e − t 2 / 2 d t N(x)=\frac{1}{\sqrt{2 \pi}} \int_{-\infty}^x e^{-t^2 / 2} d t N(x)=2π 1∫−∞xe−t2/2dt

为了计算这些敏感性,我们需要标准正态分布的概率密度函数公式,如下所示:
f ( x ) = 1 2 π e − x 2 / 2 f(x)=\frac{1}{\sqrt{2 \pi}} e^{-x^2 / 2} f(x)=2π 1e−x2/2

在此阶段,该代码将不包含任何面向对象或通用编程技术。 现在的目标是帮助您了解定价引擎的基本 C++ 实现,而不需要所有额外的对象机制来封装数学函数。 我已经完整地写出了该程序,然后下面我将解释每个组件如何工作:

c++ 复制代码
#define USE MATH DEFINES

#include <iostream>
#include <cmath>
 
double norm_pdf(const double & x) {
  return (1.0 / (pow(2∗ M_PI, 0.5)))∗ exp( −0.5∗x∗x);
}

double norm_cdf(const double &x) {
  double k = 1.0 / (1.0 + 0.2316419∗ x);
  double k sum = k∗(0.319381530 + k∗(−0.356563782 + k∗(1.781477937 +
    k∗(−1.821255978 + 1.330274429∗ k))));
  i f(x >= 0.0) {
    return (1.0−(1.0 / (pow(2∗M_PI, 0.5)))∗ exp(−0.5∗ x∗ x)∗ k sum);
  }
  else {
    return 1.0− norm_cdf(−x);
  }
}

double d_j(const int & j,
  const double & S,
    const double & K,
      const double & r,
        const double & v,
          const double & T) {
  return (log(S/K) + (r + (pow(−1, j−1))∗ 0.5∗ v∗ v)∗ T) / (v∗(pow(T, 0 .5)));
}

double call-price(const double & S,
  const double & K,
    const double & r,
      const double & v,
        const double & T) {
  return S∗ norm_cdf(d j(1,S,K,r,v,T))− K∗ exp(−r∗T)∗
  norm_cdf(d j(2, S, K, r, v, T));
}

double put_price(const double & S,
  const double & K,
    const double & r,
      const double & v,
        const double & T) {
  return −S∗ norm_cdf(−d_j(1,S,K,r,v,T)) + K∗exp(−r∗T)∗
  norm_cdf(−d_j(2, S, K, r, v, T));
}
int main(int argc, char∗∗ argv) {

  double S = 1 0 0 .0; 
  double K = 1 0 0 .0; 
  double r = 0 .0 5; 
  double v = 0 .2; 
  double T = 1 .0; 
  
  double call = call_price(S,K,r,v,T);
  double put = put_price(S,K,r,v,T);

  std:: cout << "Underlying: " << S <<std::endl;
  std:: cout << "Strike: " << K <<std::endl;
  std:: cout << "Risk−FreeRate: " << r <<std::endl;
  std:: cout << "V o l a t i l i t y: " << v <<std::endl;
  std:: cout << "Maturity: " << T <<std::endl;
  std:: cout << "C all P ri c e: " <<call <<std::endl;
  std:: cout << "Put P ri c e: " << put << std::endl;
  return 0;
}

代码释义

第一行是一个预处理器宏,它告诉 C++ 编译器使用 C 标准数学常量。 请注意,某些编译器可能不完全支持这些常量。 请务必先测试它们!

C++ 复制代码
#def ine USE MATH DEFINES

下一部分导入 iostream 和 cmath 库。 这使得我们可以使用std::cout命令来输出代码。 此外,我们现在可以访问 C 数学函数,例如 exp、pow、log 和 sqrt:

C++ 复制代码
#include <iostream>
#include <cmath>

一旦我们导入了正确的库,我们就需要创建核心统计函数,这些函数构成了价格的大部分计算。 这是标准正态概率密度函数。 M_PI 是 π 的 C 标准数学常数。

参阅:亚图跨际
相关推荐
湫兮之风4 分钟前
C++:.front()函数作用
开发语言·c++
小老鼠不吃猫5 分钟前
力学笃行(四)Qt 线程与信号槽
c++·qt·信息可视化
小羊子说6 分钟前
Android 开发中 C++ 和Java 日志调试
android·java·c++
TechQuester11 分钟前
解决GPT-4o耗电难题!DeepMind新算法训练效率提升13倍,能耗降低10倍!
java·c++·人工智能·python·算法·chatgpt
码农StayUp18 分钟前
2024年06月CCF-GESP编程能力等级认证Python编程二级真题解析
python·gesp·cff·计算机等级协会
XSTIT19 分钟前
数据结构--二叉树相关题2(OJ)
数据结构·算法
观鉴词recommend26 分钟前
【c++刷题笔记-动态规划】day32: 509. 斐波那契数 、 70. 爬楼梯 、 746. 使用最小花费爬楼梯
c++·笔记·算法·leetcode·动态规划
DieSnowK27 分钟前
[C++][ProtoBuf][初识ProtoBuf]详细讲解
开发语言·c++·google·协议·序列化·反序列化·protobuf
不决问春风33 分钟前
102.二叉树的层序遍历——二叉树专题复习
java·算法·leetcode