C ++期权定价功能......单独工作正常但不适用于股票价格范围(矢量)
C++ option pricing function...works fine individually but not for a range (vector) of stock prices
我正在通过以下方式计算期权价格(看涨期权):
#ifndef GLOBAL_H
#define GLOBAL_H
#include "NormDistFunctions.h"
struct OptionData
{
double X;
double b;
double r;
double T;
double sigma;
};
double EuroCall(OptionData o, double S);
double EuroPut(OptionData o, double S);
#endif
EuroCall() 的输入是 OptionData o 和 S(股票价格)。这是我的实现。
#include "Global.h"
#include "EuroOption.h"
#include <boost/math/distributions/normal.hpp>
#include <boost/math/distributions.hpp> // For non-member functions of distributions
#include <cmath>
double EuroCall(OptionData o, double S)
{
double d1 = (log(S/o.X) + (o.b + (o.sigma * o.sigma) / 2) * o.T) / (o.sigma * sqrt(o.T));
double d2 = d1 - o.sigma * sqrt(o.T);
double callPrice = S * exp((o.b - o.r) * o.T) * N(d1) - o.X * exp(-o.r * o.T) * N(d2);
return callPrice;
}
这本身就很好,但我需要根据一系列股票价格为这个选项定价。我为这些股票价格范围创建了一个全局向量:
vector<double> MeshArray(double start, double end, double h)
{
vector<double> mesh;
mesh.reserve(100);
for (double i = start; i <= end; i += h)
mesh.push_back(i);
return mesh;
}
最后,在 main() 中我有:
vector<double> MA = MeshArray(50.0, 100.0, 2.0);
for (auto &i : MA)
cout << EuroCall(o1,MA[i]) << " ";
输出应该是每个标的股票价格从 50、52、54...到 100 的看涨期权价格向量。但我的输出是“0 0 0 0 0 0”等。我将不胜感激任何人关于如何解决这个问题的建议,它让我连续两天。
您的问题在于使用向量元素(即取消引用的迭代器)而不是迭代器调用 EuroCall
函数
for (auto &i : MA)
cout << EuroCall(o1,MA[i]) << " ";
这里i
是向量(std::vector<double>::value_type
)的一个元素,即double
,不是iterator/index。因此,将 EuroCall(o1,MA[i])
替换为 EuroCall(o1,i)
就可以了。
有趣的是,您的代码在没有警告的情况下编译,因为 MA[i]
引用了 MA
中由值 i
指定的某个偏移量,这是越界的(可能有 catch这是通过使用 MA.at(i)
代替的,它会抛出越界访问的异常),所以你走在未定义行为的土地上。这就是为什么在使用基于范围的 for
时最好选择一个更好的名称,例如 elem
,而不是 i
,所以当您看到 MA[elem]
时,您会意识到某些东西是不对。
我正在通过以下方式计算期权价格(看涨期权):
#ifndef GLOBAL_H
#define GLOBAL_H
#include "NormDistFunctions.h"
struct OptionData
{
double X;
double b;
double r;
double T;
double sigma;
};
double EuroCall(OptionData o, double S);
double EuroPut(OptionData o, double S);
#endif
EuroCall() 的输入是 OptionData o 和 S(股票价格)。这是我的实现。
#include "Global.h"
#include "EuroOption.h"
#include <boost/math/distributions/normal.hpp>
#include <boost/math/distributions.hpp> // For non-member functions of distributions
#include <cmath>
double EuroCall(OptionData o, double S)
{
double d1 = (log(S/o.X) + (o.b + (o.sigma * o.sigma) / 2) * o.T) / (o.sigma * sqrt(o.T));
double d2 = d1 - o.sigma * sqrt(o.T);
double callPrice = S * exp((o.b - o.r) * o.T) * N(d1) - o.X * exp(-o.r * o.T) * N(d2);
return callPrice;
}
这本身就很好,但我需要根据一系列股票价格为这个选项定价。我为这些股票价格范围创建了一个全局向量:
vector<double> MeshArray(double start, double end, double h)
{
vector<double> mesh;
mesh.reserve(100);
for (double i = start; i <= end; i += h)
mesh.push_back(i);
return mesh;
}
最后,在 main() 中我有:
vector<double> MA = MeshArray(50.0, 100.0, 2.0);
for (auto &i : MA)
cout << EuroCall(o1,MA[i]) << " ";
输出应该是每个标的股票价格从 50、52、54...到 100 的看涨期权价格向量。但我的输出是“0 0 0 0 0 0”等。我将不胜感激任何人关于如何解决这个问题的建议,它让我连续两天。
您的问题在于使用向量元素(即取消引用的迭代器)而不是迭代器调用 EuroCall
函数
for (auto &i : MA)
cout << EuroCall(o1,MA[i]) << " ";
这里i
是向量(std::vector<double>::value_type
)的一个元素,即double
,不是iterator/index。因此,将 EuroCall(o1,MA[i])
替换为 EuroCall(o1,i)
就可以了。
有趣的是,您的代码在没有警告的情况下编译,因为 MA[i]
引用了 MA
中由值 i
指定的某个偏移量,这是越界的(可能有 catch这是通过使用 MA.at(i)
代替的,它会抛出越界访问的异常),所以你走在未定义行为的土地上。这就是为什么在使用基于范围的 for
时最好选择一个更好的名称,例如 elem
,而不是 i
,所以当您看到 MA[elem]
时,您会意识到某些东西是不对。