实现欧式期权类

     2023-02-22     203

关键词:

【中文标题】实现欧式期权类【英文标题】:Implementing a European Option class 【发布时间】:2021-06-01 21:11:43 【问题描述】:

我需要实现类Option_Pricer,它封装了与看涨期权和看跌期权定价相关的所有函数。老师给了我一个代码清单(.cpp 文件),我必须把它变成一个班级。因此,我在课堂上使用的所有功能都来自老师。我只需要将它们作为一个类来实现。

这是我到目前为止所做的:我已将代码拆分为两个不同的文件。一个称为 option_pricer.hpp,用作主文件 option_pricer.cpp 的标头。

//option_pricer.hpp
#define _USE_MATH_DEFINES
#include <iostream> 
#include <cmath>

class Option_Pricer 
    
private:
    
    void init();
    
public:
    
    double S;
    double K;
    double r;
    double v;
    double T;
    double x;
    double j;

 public:
    //Constructors
    call_price();
    put_price();
    norm_pdf();
    norm_cdf();
    d_j() const;

// Assignment operator
call_price& operator = (const call_price& call);
put_price& operator = (const put_price& put);
    
;

这里是主文件:

//option_pricer.cpp
#define _USE_MATH_DEFINES
#include <iostream> 
#include <cmath>
#include "option_pricer.hpp"


double Option_Pricer::norm_pdf(const double& x) const 
    return (1.0/(pow(2*M_PI,0.5)))*exp(-0.5*x*x); 


double Option_Pricer::norm_cdf(const double& x) const 
    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))));
    
    if (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 Option_Pricer::d_j(const int& j, const double& S, const double& K, const double& r, const double& v, const double& T) const 
    return (log(S/K) + (r + (pow(-1,j 1))*0.5*v*v)*T)/(v*(pow(T,0.5)));


double Option_Pricer::call_price(const double& S, const double& K, const double& r, const double& v, const double& T) const 
    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 Option_Pricer::put_price(const double& S, const double& K, const double& r, const double& v, const double& T) const 
      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() 
    
Option_Pricer p;
   p.S = 100.0;
   p.K = 100.0;
   p.r = 0.05;
   p.v = 0.2;
   p.T = 1.0;
double call_price = p.call_price();
double call_put = p.put_price();

 
// Finally we output the parameters and prices 
std::cout << "Underlying: " << p.S << std::endl;
std::cout << "Strike: " << p.K << std::endl;
std::cout << "Risk-Free Rate: " << p.r << std::endl;
std::cout << "Volatility: "<< p.v << std::endl;
std::cout << "Maturity: " << p.T << std::endl;
std::cout << "Call price: " << call_price << std::endl;
std::cout << "Put price: " << call_put << std::endl;

return 0; 
    

但是,您可以猜到,我的代码编译得并不好。我最常见的错误如下:

option_pricer.cpp:7:8: 错误:没有声明匹配‘double Option_Pricer::norm_pdf(const double&) const’ 7 |双 Option_Pricer::norm_pdf(const double& x) const | ^~~~~~~~~~~~~~~~

我不明白我应该如何从标题外部调用 norm_pdf(norm_cdf 和 d_j 的问题相同)。

我对 C++ 还很陌生(以前使用过 Python),因此我还不明白我应该如何从课堂外访问变量(S、K、...)。

我们将不胜感激!谢谢!

【问题讨论】:

我很难理解你在问什么。所有这些代码都相关吗? 你是从一本好书中学习 C++ 吗?我问这个,因为没有一本好书会以这种方式初始化非静态成员变量(这就是为什么你可能会遇到编译器错误)。你的书对默认构造函数、一般构造函数和初始化成员变量有什么看法?还是你试图将 Python 知识应用到 C++ 中而做错了? 一个关于编译器错误的问题无法重现编译器错误的全文,这是单向遗忘的旅程。添加编译器错误。更好的是,备份您的代码并生成一个minimal reproducible example,该minimal reproducible example 只生成一条错误消息(请注意,这条错误消息有时会持续到页面上)。通常,当您将代码减少到足以产生错误时,错误的原因就很明显了。 (1.0/(pow(2*M_PI,0.5))) -- 请注意,这是一个常数。调用pow 可能会影响性能。只需声明一个double 常量,而不必调用pow //Constructors 是不正确的评论。您的Option_Pricer 类没有构造函数。他们不在评论下方。 【参考方案1】:

您需要做出并理解类和对象之间的区别。很简单,对象是内存中值的集合,类是对这些值和代码的描述,这些代码将使用根据类描述组织的数据。

所以,由于Option_Pricer 是一个类,所以在你的main() 方法中说Option_Pricer.S = 100.0; 是没有意义的。您需要创建一个Option_Pricer 类型的对象,然后用您想要的值填充该对象的内存区域。一种常见的方法——特别是在你只是用数字数据初始化对象的情况下——是创建和使用构造函数,尽管你可以修改你的 init() 方法来获取参数和设置值,这很好也。您甚至可以像以前一样设置值,因为您设置了值public,但您必须修改对象,而不是类。

例如

int main()

   Option_Pricer p(100.0, 100.0, 0.5, 0.2, 1.0);
   double call_price = p.call_price();

   // or
   Option_Pricer p2;
   p2.init(100.0, 100.0, 0.5, 0.2, 1.0);
   double call_price2 = p2.call_price();

   // or, if you like typing or want the meaning of the numbers to be super clear
   Option_Pricer p3;
   p3.S = 100.0;
   p3.K = 100.0;
   p3.r = 0.05;
   p3.v = 0.2;
   p3.T = 1.0;

   // ...

这并不能解决您的代码的所有问题,但我将从解决上述问题开始。我认为,一旦您将对象的概念弄清楚了,其他人指出的问题就会更容易解决。

【讨论】:

感谢您的评论!我按照你的建议做了,我的代码已经在 OP 中修复了。仍然没有编译,但已经好多了!

matlab点云处理进阶:欧式聚类分割❤️独立窗口显示每一聚类结果❤️保存聚类点云(代码片段)

文章目录1欧式聚类分割原理2代码实现3结果展示1欧式聚类分割原理欧式距离分割是一种基于欧式距离度量的分割方法,聚类过程如下:(1)首先选取种子点,利用kd-tree对种子点进行半径r邻域搜索,若邻域内存在点,则与种子... 查看详情

期权基础知识

...间内(指美式期权)或未来某一特定日期(指欧式期权)以事先规定好的价格(指履约价格)向卖方购买或出售一定数量的特定标的物的权力,但不负有必须买进或卖出的义务。二、期权的分类由于期... 查看详情

期权定价python实现

期权定价实践期权定价公式迭代法代码实现期权定价公式期权定价通常使用BSM公式,如下所示:C(St,K,t,T,r,σ)=StN(d1)−e−r(T−t)KN(d2)(1.1)C(S_t,K,t,T,r,\\sigma)=S_tN(d_1)-e^-r(T-t)KN(d_2)\\tag1.1C(St​,K,t,T,r,σ)=St​N(d1​)−e−r 查看详情

20191016——期权:所有乐趣之所在

...一下期权的运作机制,由于期权的运作方式有美式期权和欧式期权,这里所介绍的是指美式期权。 (一)期权的概念   期权,是指选择做什么或者不做什么;其背后的基本思想是就是允许某人为在未来的某个日期买入或... 查看详情

期权定价python实现

期权定价实践期权定价公式迭代法代码实现期权定价公式期权定价通常使用BSM公式,如下所示:C(St,K,t,T,r,σ)=StN(d1)−e−r(T−t)KN(d2)(1.1)C(S_t,K,t,T,r,\\sigma)=S_tN(d_1)-e^-r(T-t)KN(d_2)\\tag1.1C(St​,K,t,T,r,σ)=St​N(d1​)−e−r(T... 查看详情

python计算三维空间某点距离原点的欧式距离

参考技术A1、点击“开始”——“ArcGIS”——“ArcMap”,启动ArcMap程序,并添加两个点要素类到地图上。2、点击“ArcToolbox”——“分析工具”——“邻域分析”——“点距离”,打开点距离工具界面。3、选择输入要素,即作为... 查看详情

金融计算的开源库——quantlib学习入门(代码片段)

...及相关计算。与期权相关的主要内容有:表示亚式期权、欧式期权、美式期权、百慕大期权等等不同种类期权的数据结构;基于解析法、有限差分法、二(三)叉树法和MonteCarlo的定价引擎;多种波动率模型,例如Heston模型、GARCH... 查看详情

欧式古典风格特点

参考技术A欧式古典风格追求华丽、高雅,其设计风格直接受欧洲建筑、文学、绘画、音乐艺术的影响。本篇文章主要围绕欧式古典风格分类、欧式古典风格特点、欧式古典风格装饰元素、欧式古典风格效果图等几个方面来介绍... 查看详情

基于强化学习的期权量化交易回测系统5(代码片段)

...本篇博文中将对这些内容进行介绍。交易费用计算在进行期权交易时,多头买入认购和认沽期权时,需要向卖出方支付权利金,而为了保证卖方可以履约,要向卖方收取保证金。同时,券商还会收取手续费和... 查看详情

基于强化学习的期权量化交易回测系统5(代码片段)

...本篇博文中将对这些内容进行介绍。交易费用计算在进行期权交易时,多头买入认购和认沽期权时,需要向卖出方支付权利金,而为了保证卖方可以履约,要向卖方收取保证金。同时,券商还会收取手续费和... 查看详情

英文缩写pe,lp,gp在金融中分别代表啥含义

...之一。4、Bermudanoption百慕大期权:百慕大期权介乎美式与欧式之间,持有人有权在到期日前的一个或多个日期执行期权。参考技术APE:私募基金(PrivateEquity),私募基金选择投资的企业大多数已经到了比较后期的地步,企业形... 查看详情

基于强化学习的期权量化交易回测系统3(代码片段)

...et是PyTorch中Dataset的子类,该类中有两个我们必须提供实现代码的方法,分别为__len__获取数据集中样本数量,__getitem__获取指定索引的样本数据,大家看到这两个方法都是双下划线开头,表明我们通常不使用这... 查看详情

java实现dbscan聚类算法(代码片段)

最近有一个需求,在地图上,将客户按照距离进行聚合。比如,a客户到b客户5km,b客户到c客户5km,那么abc就可以聚合成一个集合。首先想到的就是找一个根据坐标来聚合的算法,这里找了一些后来选择了较为简单也符合要求的DB... 查看详情

关于rsu和股票期权(stockoption)

...股票期权(StockOption)差别如下:RSU和Option一般都是逐年实现的,比如OfferLetter签三年,上写的给你1000股,第一年能给你25%第二年给40%,第三年给35%。RSU是实在的股票,即当你获得股票以后,这个就完全是你的了,每年会有几次t... 查看详情

期权交易基本原理——买进看跌期权(longput),卖出看跌期权(shortput)

期权交易基本原理——买进看跌期权(LongPut),卖出看跌期权(ShortPut)来源:中电投先融期货—青岛浏览:13508次2014-07-2514:25:553  第三节买进看跌期权(LongPut)一、买进看跌期权损益以一定履约价格并支付一定权利金获得看跌期权... 查看详情

蘑菇街期权梦碎,有人掏六位数后赔本,老板称不对财富自由负责

...期权转股权后卖出的差价,完全有可能让普通打工仔一夜实现财务自由。2014年9月19日,阿里巴巴登陆纽交所,发行价68美元,开盘大涨逾36%报92.7美元,当天报收93.89美元,总市值高达2314亿美元, 查看详情

《期货基础知识》期权交易入门知识

期权交易的权利金与保证金所谓期权的权利金,其实质上就是期权的价格,表示期权的买方获得选择权的成本,同时也是期权的卖方赋予买方选择权的所得。市场上对于不同标的、不同到期期限、不同行权价格的期权... 查看详情

knn算法

...形类占8/11,而三角形类占3/11KNN中,样本的距离一般采用欧式距离或曼哈顿距离 欧式距离d(x 查看详情