Скопировал функции 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 |