powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / IRR: Internal Rate of Return: Discounted Cash Flow Method
7 сообщений из 7, страница 1 из 1
IRR: Internal Rate of Return: Discounted Cash Flow Method
    #35165792
Фотография BusyMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IRR: Internal Rate of Return: Discounted Cash Flow Method

Может есть у кого алгоритм ?
...
Рейтинг: 0 / 0
IRR: Internal Rate of Return: Discounted Cash Flow Method
    #35165848
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это нужно решить уравнение степени n - по числу периодов, которое кстати имеет n корней.
И ни один экономист Вам не скажет - какой из них выбрать.
Но немного посоветовать можно
Если при r=0 Вы все равно остаетесь в убытке - дальше считать не имеет смысла IRR
IRR должен быть уж точно больше -1, что бы не получить знакопеременные ряд.
Из положительных значений нужно брать минимальное.
А вот если Вы получите IRR3 = 17.1%, а IRR5 = -13.7% - вызывайте Леонтьева.
...
Рейтинг: 0 / 0
IRR: Internal Rate of Return: Discounted Cash Flow Method
    #35165894
Фотография BusyMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык .. нужен алгоритм как эти уравнения решать )))
...
Рейтинг: 0 / 0
IRR: Internal Rate of Return: Discounted Cash Flow Method
    #35165895
Фотография BusyMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть ли для этого метода связь между IRR5 и IRR4 ?

или если 300 дней - тогда надо считать уравнение 300-го порядка?
...
Рейтинг: 0 / 0
IRR: Internal Rate of Return: Discounted Cash Flow Method
    #35165898
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для большинства случаев достаточно пробежать цикл по x от -1 (исключая -1) до некоторого примелемого значения,
которое может быть предварительно просчитано на основании упрощенных расчетов.
...
Рейтинг: 0 / 0
IRR: Internal Rate of Return: Discounted Cash Flow Method
    #35166196
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подходит любой из методов поиска решения при одномерной ф-ии - половинного деления, золотого сечения, ньютона и др., все они есть в книжках по математике. Т.е. вы подбирате некий аргумент при котором ф-ия равна наперед заданному значению.

Надо различать ф-ии IRR и XIRR (так они называются в екселе). Скорее всего вы имеете в виду ф-ию XIRR.

Я как-то делал ф-ию XIRR на VBA с тем чтобы добиться совпадения с екселевскими значениями. При этом есть нюанс: если ваши фактические движения CashFlow вызваны какими-то процентными инструментами, то у них могут быть свои индивидуальные алгоритмы начисления процентов: 360, 365, 365/366. Если CashFlow вызван единственным инструментом, то можно при расчете XIRR использовать строго тот же метод. Если инструментов несколько и у них разные методы, то надо выбрать какой-то один определеный.

В финансовых книжках и в интернете можно найти много информации.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
'   n As Integer      число элементов векторов дат и сумм
'   dt() As Date      вектор дат
'   db() As Double    вектор сумм
'   sMethod As String метод расчета процентов
Public Function XIRR(n As Integer, dt() As Date, db() As Double, sMethod As String) As Variant

    Dim t() As Integer ' Число дней от первоначальной даты
    Dim dd() As Double ' Дисконтированные к начальной дате суммы
    
    ' Выделение места в памяти для нужного количества элементов
    ReDim t(0 To n) As Integer
    ReDim dd(0 To n) As Double
    
    Dim iLoop As Integer, iMax As Integer: iMax = 100
    Dim x1 As Double, x2 As Double, xMid As Double, _
        y1 As Double, y2 As Double, yMid
        
    ' Заполнение массива число дней от начальной даты до очередного CashFlow
    Dim i As Integer
    For i =  0  To n
        ' Метод расчета процентов
        '  360 / 360  Месяц/квартал/полугодие/год =  30 / 90 / 180 / 360  дней
        ' 365/360 Фактический интервал / 360 дней в году
        '  365 / 365  Фактический интервал /  365  дней в году
        t(i) = DateDiffMethod(dt( 0 ), dt(i), sMethod)
        '        Debug.Print "i=", i, "t(i)=", t(i)
    Next i
    
    ' Инициализация переменных для поиска решения методом половинного деления
    ' x1 и x2 - текущие значения аргумента, определяющие границы отрезка
    ' y1 и y2 - соотвествующие им значения функции
    ' xMid и yMid - середина отрезка и значение функции в этой точке
    x1 = 0.1: x2 = x1 + (x1 / 2)
    y1 = 0:   y2 = 0
    
    ' Первоначальной расчет значения функции на границе отрезка x1
    For i =  0  To n
        dd(i) = db(i) / (( 1  + x1) ^ (t(i) / DateDiffBasis(sMethod)))
        y1 = y1 + dd(i)
        '        Debug.Print "i=", i, "db(i)=", db(i), "t(i)=", t(i), "dd(i)=", dd(i)
    Next i
    Debug.Print y1
    iLoop = 0
    
NEXT_LOOP:
    ' Расчет значения функции на границе отрезка x2
    y2 =  0 
    For i =  0  To n
        dd(i) = db(i) / (( 1  + x2) ^ (t(i) / DateDiffBasis(sMethod)))
        y2 = y2 + dd(i)
    Next i
    iLoop = iLoop +  1 
    If iLoop >= iMax Then GoTo NOT_FOUND
    ' Расчет значения функции на границе отрезка x2
    ' Если между двумя точками x1 и x2 нет решения,
    ' то двигаться увеличивающимися шагами до тех пор,
    ' пока решение функции не окажется между границами
    If y1 * y2 >  0  And Abs(y2) < Abs(y1) Then
        ' Определение направления движения в строну от х1 к x2
        '         Debug.Print "y1 * y2 > 0 And Abs(y2) < Abs(y1)", _
        '         "R1=" & x1, "R2=" & x2, "S1=" & y1, "S2=" & y2
        Dim x As Double
        x = x2: x2 = x1 + (x2 - x1) * 2: x1 = x
        y1 = y2
        GoTo NEXT_LOOP
    ElseIf y1 * y2 > 0 And Abs(y2) > Abs(y1) Then
        ' Определение направления движения в обратную строну от х2 к x1
        '         Debug.Print "y1 * y2 > 0 And Abs(y2) > Abs(y1)", _
        '         "R1=" & x1, "R2=" & x2, "S1=" & y1, "S2=" & y2
        x2 = x1 - (x2 - x1)
        GoTo NEXT_LOOP
    Else
        ' Поиск решение между границами x1 и x2
        '         Debug.Print "y1*y2 < 0            ", _
        '         "R1=" & x1, "R2=" & x2, "S1=" & y1, "S2=" & y2
NEXT_LOOP2:
        If Abs(x2 - x1) < 0.000000000001 Then
            GoTo FOUND
        End If
        ' Расчет средней точки и значения функции в ней
        xMid = (x1 + x2) /  2 
        yMid =  0 
        For i =  0  To n
            dd(i) = db(i) / (( 1  + xMid) ^ (t(i) / DateDiffBasis(sMethod)))
            yMid = yMid + dd(i)
        Next i
        '         Debug.Print "                     ", _
        '         "R1=" & x1, "R2=" & x2, "S1=" & y1, "S2=" & y2
        ' Выбор половины отрезка, в котором будет производиться следующая итерация
        If y1 * yMid >  0  Then
            x1 = xMid
            y1 = yMid
            GoTo NEXT_LOOP2
        ElseIf y2 * yMid >  0  Then
            x2 = xMid
            y2 = yMid
            GoTo NEXT_LOOP2
        Else
            GoTo FOUND
        End If
    End If

FOUND:
    XIRR = x1
    Exit Function
    
NOT_FOUND:
    XIRR = Null
    Exit Function

End Function
...
Рейтинг: 0 / 0
IRR: Internal Rate of Return: Discounted Cash Flow Method
    #35168170
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Excel у меня нет. Есть OpenOffice - там для IRR необходимо задать еще и приближенное зпначение. Часто процесс расходится.
Любой из методов деления считаю неуместным ак как неизвестно, какой корень попадется. Особенно в случае с капиталовложениями не только в начале, а и в течение всего периода.
Наиболее подходящий алгортм (ИМХО).
1. Посчитать сумму ряда для 0%
2. Если сумма положительна двигаться с малыми итерациями (например 0.1%) вверх до перемены знака или до близкгого к 0 значению
2. Если сумма отрицательна - спускаться малыми итерациями вниз до -99.9%.

Поскольку задача имеет экномическое истолкование - данные скорее всего будут лежать реальных диапазонах значений.
Но все же могут быть случаи близких значений (два корня) , например +17% и -13% - что это убытки или прибыль?
Это относится к недостаткам самого показателя.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / IRR: Internal Rate of Return: Discounted Cash Flow Method
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]