Скопировал функции Black_Scholes из этой темы, но где-то делаю ошибку, так как функция выдаёт 0.
Помогите, пожалуйста, найти ошибку в коде:
Помогите, пожалуйста, найти ошибку в коде:
| Код |
|---|
-- F: Текущая цена фьючерса
-- S: Страйк
-- V: Волатильность
-- T: Время в долях года до окончания срока действия опциона (30 / 365)
function Black_Scholes(F, S, V, T)
d1 = (math.log(F / S) + V * V * (T / 366) / 2) / (V * math.sqrt(T / 366))
d2 = d1 - V * math.sqrt(T / 366)
Call = F * N(d1) - S * N(d2)
Put = Call + S - F
return Call
end
function N(x) -- Функция стандартного нормального распределения
if x > 10 then return 1 end
if x < -10 then return 0 end
ax = math.abs(x)
t = 1 / (1 + 0.2316419 * ax)
d = 1 / math.sqrt(2 * math.pi) * math.exp(-x * x / 2)
p = d * t * ((((1.330274429 * t - 1.821255978) * t + 1.781477937) * t - 0.356563782) * t + 0.31938153)
if x > 0 then return 1 - p else return p end
end
function GetOptionTheorprices()
ClassCode = "SPBOPT";
SecCode = "RI120000BH4";
BaseClassCode = "SPBFUT";
--заказ данных
ParamRequest(ClassCode, SecCode, "volatility");
ParamRequest(ClassCode, SecCode, "theorprice");
ParamRequest(ClassCode, SecCode, "DAYS_TO_MAT_DATE");
ParamRequest(ClassCode, SecCode, "strike");
ParamRequest(ClassCode, SecCode, "optiontype");
ParamRequest(ClassCode, SecCode, "optionbase");
Optionbase = getParamEx(ClassCode, SecCode, "optionbase").param_image;
ParamRequest(BaseClassCode, Optionbase, "settleprice");
Optiontype = getParamEx(ClassCode, SecCode, "optiontype").param_image;
DAYS_TO_MAT_DATE = getParamEx(ClassCode, SecCode, "DAYS_TO_MAT_DATE").param_value + 0;
option_base_settleprice = getParamEx("SPBFUT", Optionbase, "settleprice").param_value + 0;
strike = getParamEx(ClassCode, SecCode, "strike").param_value + 0;
volatility = getParamEx(ClassCode, SecCode, "volatility").param_value + 0;
theorprice = getParamEx(ClassCode, SecCode, "theorprice").param_value + 0;
Black_Scholes_Price = Black_Scholes(option_base_settleprice, strike, volatility / 100.0, DAYS_TO_MAT_DATE / 365.0);
message(
"QLua: _____________________________________" ..
"\n" .. YYYYMMDD() ..
"\nClassCode=" .. tostring(ClassCode) ..
"\nSecCode=" .. tostring(SecCode) ..
"\nOption Base ClassCode=" .. tostring(BaseClassCode) ..
"\nOptionbase=" .. tostring(Optionbase) ..
"\nOptiontype=" .. tostring(Optiontype) ..
"\nDAYS_TO_MAT_DATE=" .. tostring(DAYS_TO_MAT_DATE) ..
"\nOption Base settleprice=" .. tostring(option_base_settleprice) ..
"\nstrike=" .. tostring(strike) ..
"\nvolatility=" .. tostring(volatility) ..
"\ntheorprice=" .. tostring(theorprice) ..
"\nBlack_Scholes_Price=" .. tostring(Black_Scholes_Price) ..
"\nQLua: _____________________________________",
1);
--[[
Результат:
QLua: _____________________________________
2024.06.29
ClassCode=SPBOPT
SecCode=RI120000BH4
Option Base ClassCode=SPBFUT
Optionbase=RIU4
Optiontype=Call
DAYS_TO_MAT_DATE=48.0
Option Base settleprice=115200.0
strike=120000.0
volatility=18.318
theorprice=1280.0
Black_Scholes_Price=0.0
QLua: _____________________________________
]]
end
function main()
do_it = true;
while (do_it) do
GetOptionTheorprices();
for _ = 1, 20 do
sleep(500);
if not do_it then
return;
end
end
end
end
function OnStop()
do_it = false;
end
function YYYYMMDD(datetime)
if not datetime then
datetime = os.date("*t");
end
local DD = datetime.day
if DD < 10 then DD = "0" .. DD end
local MM = datetime.month
if MM < 10 then MM = "0" .. MM end
local YYYY = datetime.year
return table.concat({ YYYY, MM, DD }, ".");
end
|