The very first comparative FPM result was posted in the other journal on Aug 31, 2020
https://www.elitetrader.com/et/threads/the-fairput-initiative.349291/page-11#post-5191774
Ie.
thecoder wrote
For the meaning of the mentioned "crypo" see the initial posting at https://www.elitetrader.com/et/threads/the-fairput-initiative.349291/Code:Here's the first result: Black-Scholes-Merton (BSM) option pricing model: BSM(S=100, K=100, t=1, s=30%, r=0%, q=0%): CALL=11.923538474048 PUT=11.923538474048 FairPut option pricing model (FPM): FPM(S=100, K=100, t=1, s=30%, r=0%, q=0%): CALL=11.791142218895 PUT=11.791142218895 As can be seen, there is a difference between BSM and FPM, even with r=q=0. I'm sure that FPM is correct since the maths behind it is solid. And if FPM is correct, then of course BSM can only be wrong... Btw, this also reveals/discloses the true meaning of the "crypto" in the original posting. :)
and compare the numbers with the above numbers![]()
Yes, might indeed look so, but I don't have any better answer for such critics, sorry.“I assume FPM is correct...” is super weak. You’re comparing against a Nobel prize winning pricing formula and assuming yours is correct because the result is different?
Sure, but we are only in the beginning of the whole process. It's too early to go public, so to say.This my friend is hilarious. You need to spend some time producing actual research so you learn how to write it. I seriously doubt your math is correct. If it was you wouldn’t be posting this here. You’d be trading your new model and consulting with Jane Street.
I have posted some simple examples for independent verification.You asked for constructive criticism. How can I do that without seeing your model? This topic is the worst form of trader hubris.

Which posting of mine do you mean? 0 volatility is normally not necessary, maybe you mean something else.I found your alleged proof the BSM is wrong when you used 0 volatility.
1) FairPut is not the option pricing model, it's just an optional add-on for BSM and also for this new model FPM.BSM is correct and your math is wrong. Not looking good for your fair put model.
Thanks for the warning. I know what I do. It's not fully published yet, I posted just some example results so that others might replicate and confirm my result.Please do not release the source or the paper. I repeat. Do not share this!!!
Can you elaborate what you exactly mean by "incorporating skew mechanics"?There are many option market makers who will pay you millions for the improved model especially once you can incorporate skew mechanics while ensuring arbitrage free.
Equity options traded in American markets did not show a volatility smile before the Crash of 1987 but began showing one afterwards.
/*
simple_BSM_and_FPM.cpp
BSM and FPM option calculator
Written by thecoder
posted to https://www.elitetrader.com/et/threads/fpm-the-successor-to-the-bsm-option-pricing-model.350048/page-2#post-5203094
Just for demonstration / verification
It's limited to S=K, and r=q=0.
Time and Volatility must be given in base 1.0, ie. as 0.3 for 30%, or 0.5 for 6 months
History / Changelog:
2020-09-14-Mo: init
Compilation:
g++ -Wall -Wextra -O2 -std=c++11 -o simple_BSM_and_FPM.exe simple_BSM_and_FPM.cpp
Usage (params are S t s in that order):
./simple_BSM_and_FPM.exe S t s
Example session:
./simple_BSM_and_FPM.exe 100 1 0.3
Params: S=K=100.000000 t=1.000000 s=0.300000 r=q=0
BSM: CALL=11.923538474048 PUT=11.923538474048
FPM: CALL=11.791142218895 PUT=11.791142218895
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <limits>
#include <cfloat>
#include <algorithm>
using namespace std;
//---------------------------------------------------------------
// calculate lognormal z
// formula "St = S * exp(z * s * sqrt(t) + u * t)" solved for z
// ATTN: for BSM: fForward=false must be used
double calc_z(const double St, const double S, const double st, const double ut, const bool fForward)
{
return (log(St / S) + (fForward ? -ut : ut)) / st;
}
// cumulative distribution function (cdf) for the normal distribution
double normal_cdf(const double x, const double mu = 0.0, const double sigma = 1.0)
{
return 0.5 * (1.0 + erf((x - mu) / (sigma * sqrt(2.0))));
}
//---------------------------------------------------------------
void calc_BSM(double S, double t, double s)
{
S = max(DBL_EPSILON, S);
t = max(DBL_EPSILON, t);
s = max(DBL_EPSILON, s);
const double K = S;
const double ut = 0.0;
double st, z0, z1, z2, p1, p2, C, P;
st = s * sqrt(t);
z0 = calc_z(S, K, st, ut, false);
z1 = z0 + st / 2.0;
z2 = z0 - st / 2.0;
p1 = normal_cdf(z1);
p2 = normal_cdf(z2);
C = S * p1 - K * p2;
P = C + K - S;
printf("BSM: CALL=%.12f PUT=%.12f\n", C, P);
}
void calc_FPM(double S, double t, double s)
{
S = max(DBL_EPSILON, S);
t = max(DBL_EPSILON, t);
s = max(DBL_EPSILON, s);
const double K = S;
const double ut = 0.0;
double st, z0, z1, z2, p0, p1, p2, C, P;
st = s * sqrt(t);
z0 = calc_z(S, K, st, ut, false);
z1 = z0 + st;
z2 = z0 - st;
p0 = normal_cdf(z0);
p1 = normal_cdf(z1);
p2 = normal_cdf(z2);
C = (S * p1 - K * p2) * p0;
P = C + K - S;
printf("FPM: CALL=%.12f PUT=%.12f\n", C, P);
}
//---------------------------------------------------------------
int main(int argc, char* argv[])
{
if (argc < 4)
{
printf("Usage: %s S t s\n", argv[0]);
return 1;
}
const double S = atof(argv[1]);
const double t = atof(argv[2]);
const double s = atof(argv[3]);
printf("Params: S=K=%f t=%f s=%f r=q=0\n", S, t, s);
calc_BSM(S, t, s);
calc_FPM(S, t, s);
printf("\n");
return 0;
}
//---------------------------------------------------------------
<-----|-----|-----|-----|-----|-----|-----|-----|-----|----->
z=-4 z=-3 z=-2 z=-1 z=0 z=1 z=2 z=3 z=4
as they use just half sigma (ie. "st / 2") instead of full sigma for z1 and z2; cf. code.