|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Привет всем! Поделитесь пожалуйста процедурой вычисления XIRR на PL/SQL, если есть у кого-то ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2007, 12:09 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Добрый день. Аналогичная история - ищу реализацию данной функции. Вам удалось найти? Если да - поделитесь, плиз, на zchermit@mail.ru... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2007, 13:51 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
На сипане смотри реализацию на перле. Там есть все исходники с комментариями. Эта функция там IRR называется, но на самом деле она XIRR. Я пока не буду делать ее на PL/SQL тк уже сменил работу и надобность отпала (надолго -ли...). http://search.cpan.org/~erwan/Finance-Math-IRR-0.10/lib/Finance/Math/IRR.pm Очень хорошо прокомментирован исходник. Придецца сначала освоить методы решения полиномов. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2007, 14:17 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
У меня тоже проблема - нужно доходность к погашению и амортизацию скидок-премий по ценным бумагам вычислять по эффективной ставке процента (IRR). И всё-таки, кто то может уже делал такую ф-ю. Поделитесь плиз. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2007, 02:04 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
ЭСПИ всё-таки, кто то может уже делал такую ф-ю. Поделитесь плиз. ставьте задачу конкретную (с данными, алгоритмами, желаемыми результатами). Думаю простого SQL достаточно будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2007, 13:53 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Нет, для IRR просто SQL не достаточно. Кто это делал, тот знает. Тот и может подсказать. А я в полиномах не шарю. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2007, 04:28 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
ЭСПНет, для IRR просто SQL не достаточно.ну почему же недостаточно... на 10-ке в лоб - метод подбора на простом примере с некоторыми допущениями (про perfomance речь не идет): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2007, 09:59 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
тут коллеги тоже занимались эффективной процентной ставкой. решил более пристально глянуть на этот вопрос. что получилось - запостил в этой ветке - если кому-то потом интересно будет. раньше ставку получал простым перебором, сейчас алгоритм поменял. результат: Код: 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.
думаю, выгода такого подхода очевидна. теперь немножко подробней: алгоритм простой. Можно его назвать метод "сужающихся интервалов" (наверняка в математике что-то такое есть уже, умные коллеги подсказывают - "метод хорд", "метод ньютона"). Но т.к. память сумбурно отреагировала на слово "полином" - про способы их решения вообще отклика не последовало. То что в голову пришло - то и реализовал. все оч просто. берем первоначальную ставку (IRR=0%), первоначальный интервал (interv=100%) - по сути как rate_step в первом варианте. Далее считаем сумму дисконтированных денежных потоков к начальной дате. При ставке 0% она будет положительна, по мере увеличения эфф ставки - сумма будет уменьшается. В тот момент когда сумма станет =0 - нас и интересует значение эфф ставки. первый шаг - прибавляем интервал. IRR стала 100% считаем сумму дисконтированных потоков. Если сумма сменила знак - то перебор. Мы уменьшаем интервал вдвое (до 50%) и делаем шаг в обратную сторону на интервал. Если при первом шаге - сумма потоков не изменила знак - то мы интервал не меняем (100%) и двигаемся в ту же сторону (IRR=200% на следующем шаге). В итоге мы постепенно уменьшая интервал (шаг) будем прыгать вокруг нуля (то в +, то в -). пока необходимая точность не будет достигнута. PS У себя наложил условие Код: plaintext
Можно задать точность на суммы потоков - например, если нам нужно посчитать эфф ставку, чтобы она давала точность сумм до копеек, можно сделать что-то вроде: Код: plaintext
надеюсь, кому-то пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 12:34 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
по "методу хорд" нужно еще меньшее количество итераций для той же точности: Код: 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.
PS последний пример писал "в лоб" по алгоритму можно упростить, чтобы на след итерации не обсчитывать те же суммы заново, которые посчитаны на предыдущем шаге. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2007, 15:36 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Да, решение интересное, но вот у нас база 9.2, а в ней model нет. За решение большое спасибо!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2007, 05:07 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Вот что удалось "набредить" мне для 9-ки. С функцией ЧИСТВНДОХ (она же XIRR) вроде как совпадает. Сильно не пинать. В PL/SQL слабоват :( -- Массив дат type t_date_array is varray(200000) of date; -- Массив потоков type t_amount_array is varray(200000) of number; function Xirr(p_date_array in t_date_array, p_amount_array in t_amount_array, p_guess in number default 0 ) return number is z number := 0; step_limit number := 0; temp number; step number := 0.1; d number := 0.5; l_MaxDate date; l_MinDate date; srok number; begin l_MaxDate := p_date_array(1); l_MinDate := p_date_array(1); -- Первый проход: поиск макс. даты и наличия хотя бы одного минуса и плюса в потоках for i in 1 .. p_date_array.count loop if p_date_array(i) > l_MaxDate then l_MaxDate := p_date_array(i); end if; if p_date_array(i) < l_MinDate then l_MinDate := p_date_array(i); end if; end loop; select months_between(l_MaxDate, l_MinDate) into srok from dual; loop temp := p_amount_array(1); for i in 2 .. p_amount_array.count loop temp := temp + p_amount_array(i) / power((1 + d), (p_date_array(i) - p_date_array(1)) / 365); end loop; if (temp > 0) and (z = 0) then step := step / 2; z := 1; end if; if (temp < 0) and (z = 1) then step := step / 2; z := 0; end if; if (z = 0) then d := d - step; else d := d + step; end if; step_limit := step_limit + 1; exit when((round(temp * 100000) = 0) or (step_limit = 10000)); end loop; return d; end Xirr; ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2007, 11:32 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Serg Kravchenko if (z = 0) then d := d - step; else d := d + step; end if; Вроде как знаки поменять надо?! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2008, 11:03 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Подскажите а как можно добиться результата работы Excel-евской ВСД функции? по значениям -100, 58, 60 она выдвет 12%? я в этом вообще не бум бум, а есть задача получить значения = ВСД*12! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 14:37 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Volder, ваше решение очень красивое. Как я понял в вашем примере берется только 3 даты с суммами. Возможно ли сделать так, чтобы брался весь промежуток дат платежа? Я имею ввиду 1 платеж в месяц. К примеру первый платеж 16/06/2011 200000 , а последний 13/06/2014 5916.36? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2011, 11:22 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Шелухин АлексейГробокопателям - http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2011, 00:02 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Всем привет. Возникла задача рассчитать XIRR на Oracle. Воспользовался скриптом который был приведен Volder. За что ему отдельное СПАСИБО. Однако вот не задачка. Почему то данные которые я получаю в excel при расчётё отличаются от расчётов в oracle, хотя исходные данные одинаковые. Помогите плиз. А то всю голову сломал, чтобы понять что не так. Вот данные которые я получаю в oracle: ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2011, 18:59 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
А вот что в excel: Данные отличаются. Это только один пример из нескольких. Почему такая разница в результатах? Плиз помогите!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2011, 19:01 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Получается вот такая разница: oracle - 4.74% excel - 4.82% Почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2011, 19:03 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
А вот формула которая используется в excel =ЧИСТВНДОХ(K2:K5;C2:C5;0,1) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2011, 19:06 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
RSA86, знак? наверное на сходимость надо проверять не модуль суммы, а сумму модулей ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2011, 19:47 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
RSA86, Не совсем по теме, точнее, рассуждения около неё: 1) IRR, сделанная на модели будет работать только для "коротких" кредитов с простой ставкой. На "длинных", например, ипотека - работает очень долго. Лучше использовать какой-нибудь численный метод, типа деления отрезка пополам (на PL\SQL) - они хорошо и быстро сходятся. 2) на моей практике любой численный метод давал такое же значение, что и в Excel. 3) также доводилось встречаться с кредитными историями, где ПСК была 4000-5000%. На таких очень сложных кредитах валились все известные мне алгоритмы расчета ПСК (включая Excel), затюненные под расчет в диапазоне 0-1000%. В таких случаях приходилось строить практически вручную график и искать корни практически визуально =) Резюмирую, выбор метода расчета ПСК необходимо делать, опираясь на 1) тип кредита (новый или существующий, карточки, срочный), 2) срок, 3) основная масса кредитов укладывается в диапазон 0-1000%, но нужно предусмотреть случаи, когда ставка зашкалит. 4) старайтесь унифицировать расчет ПСК в организации и бизнес-процессах, реализовав её как сервис АБС, иначе потом будет поздно =) PS: По ПСК очень много проблем, которые ещё не решены законодательно. Много чего не прописано для случаев "а что если". Из 2008-У трудно однозначно вывести все возможные случаи. Я много постил свои проблемы и вопросы на авторитетных банковских форумах, но не получил ни одного ответа, не говоря уже о своих оналитегах (сами знаете, какова квалификация большинства из них). В банках, в которых довелось видеть ПСК, всегда можно было зацепиться и докопаться до чего-либо, т.к. каждый банк отличается от другого по части работы с ПСК (оналитеги везде же разные =)). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2011, 10:41 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
Подскажите, плиз, а кому-то удалось повторить ЧИСТВНДОХ? Ибо бухгалтера считают ее эталоном... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2012, 15:24 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
grago, Давно уже у всех кому надо есть. Причем на нормальных алгоритмах, точность до десятитысячных, находится за 5-6 итераций. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2012, 16:46 |
|
XIRR function in PL/SQL ?
|
|||
---|---|---|---|
#18+
нашел в загашниках такой вот г...код, мож, пригодится кому: Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2012, 19:13 |
|
|
start [/forum/topic.php?fid=52&msg=37438807&tid=1879662]: |
0ms |
get settings: |
16ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
26ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
448ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 775ms |
0 / 0 |