|
IRR - внутренняя ставка доходности, Где найти функцию как в Екселе - ВСД() ? | ☑ | ||
---|---|---|---|---|
0
xsnika
25.04.12
✎
14:12
|
Столкнулся с проблемой расчёта внутренней ставки доходности. Может кто-то решал уже эту задачу и у кого-то есть готовая функция похожая на Ексел-евскую ВСД()?
|
|||
1
xsnika
27.04.12
✎
10:00
|
IRR =-0.5;
NVP = 1; ТекстШаблона = ""; ТекстШаблона = СтрЗаменить(Строка(ПерваяСтрока),",",".")+"+"; //На вход передаю Таблицу значений в котороё две колонки Период и Сумма Для каждого Стр Из ТЗ Цикл ТекстШаблона = ТекстШаблона + СтрЗаменить(Строка(Формат(Стр.Сумма,"ЧДЦ=3")),",",".")+"/Pow((1+х),"+Строка(Стр.ПериодЛизинга)+")+"; КонецЦикла; ТекстШаблона = СтрЗаменить(ТекстШаблона,Символы.НПП,""); ТекстШаблона = Лев(ТекстШаблона,СтрДлина(ТекстШаблона)-1); //- ПредыдущийНВП = 0; Пока IRR<1 Цикл IRR = IRR + 0.000001; ТекущийТекстШаблона = СтрЗаменить(ТекстШаблона,"х","("+СтрЗаменить(СтрЗаменить(Строка(IRR),",","."),Символы.НПП,"")+")"); NVP = Вычислить(ТекущийТекстШаблона); Если (NVP <0 И ПредыдущийНВП > 0) ИЛИ (NVP >0 И ПредыдущийНВП < 0) Тогда Сообщить("IRR = "+ IRR*100*12); Возврат; КонецЕсли; ПредыдущийНВП = NVP; КонецЦикла; |
|||
2
xsnika
27.04.12
✎
10:01
|
Вот этот код выполняется долго...
|
|||
3
xsnika
27.04.12
✎
10:03
|
http://www.financial-analysis.ru/methodses/metIAIRR.html
Код написан в соответствии с вот этой формулой |
|||
4
xsnika
27.04.12
✎
10:08
|
ИРР1 =-0.9;
ИРР2 =0.9999; NVP = 1; //Таблица = Новый ТаблицаЗначений; //Таблица.Колонки.Добавить("IRR"); //Таблица.Колонки.Добавить("NVP"); //+ ТекстШаблона = ""; ТекстШаблона = СтрЗаменить(Строка(ПерваяСтрока),",",".")+"+"; //ТекстШаблонаЭксель = Строка(ПерваяСтрока)+"+"; Для каждого Стр Из ТЗ Цикл ТекстШаблона = ТекстШаблона + СтрЗаменить(Строка(Формат(Стр.Сумма,"ЧДЦ=3")),",",".")+"/Pow((1+х),"+Строка(Стр.ПериодЛизинга)+")+"; //ТекстШаблонаЭксель = ТекстШаблонаЭксель + Строка(Стр.Сумма)+"/((1+х)^"+Строка(Стр.ПериодЛизинга)+")+"; КонецЦикла; ТекстШаблона = СтрЗаменить(ТекстШаблона,Символы.НПП,""); ТекстШаблона = Лев(ТекстШаблона,СтрДлина(ТекстШаблона)-1); //- ПредыдущийНВП = 0; ТекущийТекстШаблона1 = СтрЗаменить(ТекстШаблона,"х","("+СтрЗаменить(СтрЗаменить(Строка(ИРР1),",","."),Символы.НПП,"")+")"); НПВ1 = Вычислить(ТекущийТекстШаблона1); ТекущийТекстШаблона2 = СтрЗаменить(ТекстШаблона,"х","("+СтрЗаменить(СтрЗаменить(Строка(ИРР2),",","."),Символы.НПП,"")+")"); НПВ2 = Вычислить(ТекущийТекстШаблона2); Точность = 0.00001; Пока Истина Цикл НовыйИРР = ИРР1+(ИРР2-ИРР1)/2; НовыйТекущийТекстШаблона = СтрЗаменить(ТекстШаблона,"х","("+СтрЗаменить(СтрЗаменить(Строка(НовыйИРР),",","."),Символы.НПП,"")+")"); НовыйНПВ = Вычислить(НовыйТекущийТекстШаблона); Если НовыйНПВ*НПВ1 < 0 Тогда ИРР2 = НовыйИРР; Иначе ИРР1 = НовыйИРР; КонецЕсли; Если НовыйНПВ> -Точность И НовыйНПВ < Точность Тогда Сообщить("IRR = "+ НовыйИРР*100*12); Возврат; КонецЕсли; КонецЦикла; |
|||
5
xsnika
27.04.12
✎
10:09
|
А вот этот код работает быстро :) Писала девушка, математик, за что ей огромное спасибо!
|
|||
6
xsnika
27.04.12
✎
10:11
|
Код написан по формуле: http://en.wikipedia.org/wiki/Secant_method
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |