Полная стоимость кредита(займа) – пример/алгоритм расчета

    Не так давно вступил в силу Федеральный закон №353, обязывающий финансовые организации раскрывать информацию о так называемой «Полной стоимости кредита(займа)» (далее — ПСК).
    В этой статье (в принципе относящейся только к трудящимся в финансовой сфере), я бы хотел привести пример расчета ПСК. Возможно, кому-то пригодится.

    Важно! Не так давно законодатели внести изменения в формулу, которая вступает в силу только с 1 сентября 2014. Все изложенное далее пригодно только для новой формулы. Статья описывает исключительно техническую реализацию расчета ПСК в соответствии с нормами закона.

    Еще важнее! Вся приведенная ниже информация актуальна для случая, когда кредит выдается ОДНИМ платежом, т.е. заемщик получает денежные средства один раз, а возвраты происходят по заранее определенному графику платежей. Такой вариант покрывает 99% выдаваемых кредитов (кредитные карты не в счет).

    Собственно, вот сам зверь:

    Понимаем значения терминов

    ПСК определяется как произведение 3 величин – i, ЧБП и числа 100. Разберем используемые термины и обозначения:
    1. Что такое БП (базовый период)
      БП по договору потребительского кредита (займа) — стандартный временной интервал, который встречается с наибольшей частотой в графике платежей по договору потребительского кредита (займа). Если в графике платежей по договору потребительского кредита (займа) отсутствуют временные интервалы между платежами продолжительностью менее одного года или равные одному году, то БП – один год.
      Фактически БП – это наиболее часто встречающийся временной интервал между платежами. Если в графике платежей отсутствуют повторяющиеся временные интервалы и иной порядок не установлен Банком России, базовым периодом признается временной интервал, который является средним арифметическим для всех периодов, округленным с точностью до стандартного временного интервала. Стандартным временным интервалом признаются день, месяц, год, а также определенное количество дней или месяцев, не превышающее по продолжительности одного года. Таким образом вы можете определить свой БП. Если платежи ежемесячные, то БП=365/12~=30
    2. Что такое ЧБП (число базовых периодов в календарном году)
      Определение в законе весьма размытое, но как я понимаю – это количество базовых периодов, которые «влезают» в один календарный год, т.е.:
      • Для стандартного графика платежей с ежемесячными выплатами: ЧБП = 12
      • Ежеквартальные выплаты: ЧБП=4
      • Выплаты раз в год или реже: ЧБП=1
      • Если график платежей хитрый: например предусмотрено сначала 2 выплаты раз в квартал, а затем 6 выплат раз в месяц, затем 3 выплаты раз в день, то базовый период – 1 месяц. А ЧБП=12 (12 БП за календарный год).

    3. Что такое i (процентная ставка базового периода, выраженная в десятичной форме)
      Это невозможно понять (по крайней мере мне). Возможно, в определении числа i есть какой-то смысл, но этот смысл уловить интуитивно не представляется возможным. Как считать i — разберем в следующем разделе.


    Как считать i

    Оставим на потом попытки понять «физический» смысл числа i, и дадим ему такое определение:
    Число i вычисляется путем решения следующего уравнения:
    где:
    • m – количество денежных потоков, что равно количеству платежей в графике платежей плюс один (еще один платеж возникает из-за первого платежа – выдачи кредита).
    • ДПк – размер к-го денежного потока (выдача кредита со знаком «минус», возвраты со знаком «плюс»).
    • Qк — количество полных базовых периодов с момента выдачи кредита до k-го денежного потока. Qк можно вычислить по формуле:
      Qк=floor[ (ДПк-ДП1)/БП ], где
      • ДПк – дата к-го денежного потока,
      • ДП1 – дата первого денежного потока (т.е. дата выдачи),
      • БП – срок базового периода,
      • floor[ ] – округление вниз до целого.
    • Eк — здесь сразу напишем формулу, чтобы ваш мозг не взорвался от формулировки в законе:
      Ek=mod[ (ДПк-ДП1) /БП ]/БП, где mod – остаток от деления


    Алгоритм расчета ПСК

    Входящие данные: два массива. Ключ – номер денежного потока, значения – даты платежа и сумма платежа.
    Исходящие данные: значение ПСК (число).
    Порядок расчета:
    1. Вычисляем ЧБП(число базовых периодов). Число базовых периодов – сколько таких периодов «влезет» в 365 дней, т.е. ЧБП=floor[ 365/БП ].
    2. Для каждого k-го платежа считаем ДПk, Qk, Ek.
    3. Методами приближенного вычисления в точности до двух знаков после запятой считаем i.
    4. Умножаем ЧБП*i*100.

    Код!

    Есть готовое решение на javascript, а также на VBA (будет даже excel-файл для расчетов).
    Зачем VBA и Excel?
    Если вдруг у вас случится пожар и ничего не будет работать 1 сентября 2014 года, то самое разумное — это разослать excel-табличку по местам заключения договоров, чтобы можно было рассчитывать ПСК хотя бы так в первое время.

    В примерах взят график для кредита в 100 000 рублей на 3 месяца по ставке 12% годовых. Дата выдачи — 1 сентября 2014:
    Ключ Дата денежного потока Сумма денежного потока
    0 01.09.2014 -100 000
    1 01.10.2014 34 002,21
    2 01.11.2014 34 002,21
    3 01.12.2014 34 002,21
    Решение на javascript
    код
    function psk() {
         //входящие данные - даты платежей
        var dates = [
        new Date(2014, 8, 01),
        new Date(2014, 9, 01),
        new Date(2014, 10, 01),
        new Date(2014, 11, 01)];
        //входящие данные - суммы платежей
        var sum = [-100000,
        34002.21,
        34002.21,
        34002.21 ];
        var m = dates.length; // число платежей
    
        //Задаем базвый период bp
        bp=30;
        //Считаем число базовых периодов в году:
        var cbp = Math.round(365 / bp);
    
        //заполним массив с количеством дней с даты выдачи до даты к-го платежа
        var days = [];
        for (k = 0; k < m; k++) {
            days[k] = (dates[k] - dates[0]) / (24 * 60 * 60 * 1000);
        }
    
        //посчитаем Ек и Qк для каждого платежа
        var e = [];
        var q = [];
        for (k = 0; k < m; k++) {
            e[k] = (days[k] % bp) / bp;
            q[k] = Math.floor(days[k] / bp);
        }
    
        //Втупую методом перебора начиная с 0 ищем i до максимального приблежения с шагом s
        var i = 0;
        var x = 1;
        var x_m = 0;
        var s = 0.000001;
        while (x > 0) {
            x_m = x;
            x = 0;
            for (k = 0; k < m; k++) {
                x = x + sum[k] / ((1 + e[k] * i) * Math.pow(1 + i, q[k]));
            }
            i = i + s;
        }
        if (x > x_m) {
            i = i - s;
        }
    
        //считаем ПСК
        var psk = Math.floor(i * cbp * 100 * 1000) / 1000;
    
        //выводим ПСК
        alert("ПСК = " + psk + " %");
    }
    

    Демо на jsfiddle: jsfiddle.net/exmmo/m5kbb0up/7

    Решение на VBA+excel
    Код
    В столбце А, начиная с 2ой строки находятся даты денежных потоков.
    В столбце B, начиная с 2ой строки находятся суммы денежных потоков.
    Sub psk()
        Dim dates()
        Columns("A:A").Select
        dates() = Application.Transpose(Range(ActiveCell, Cells(Rows.count, ActiveCell.Column).End(xlUp)))
    
        Dim summa()
        Columns("B:B").Select
        summa = Application.Transpose(Range(ActiveCell, Cells(Rows.count, ActiveCell.Column).End(xlUp)))
        
        Dim m As Integer
        m = UBound(dates)
        
           
        bp = 30
        cbp = Round(365 / bp)
        
        ReDim Days(m)
        For k = 2 To m
            Days(k) = dates(k) - dates(2)
        Next
        
        ReDim e(m)
        ReDim q(m)
        
        For k = 2 To m
            q(k) = Days(k) \ bp
            e(k) = (Days(k) Mod bp) / bp
        Next
        
        i = 0
        x = 1
        x_m = 0
        s = 0.000001
        Do While x > 0
            x_m = x
            x = 0
            For k = 2 To m
                x = x + summa(k) / ((1 + e(k) * i) * ((1 + i) ^ q(k)))
            Next
            i = i + s
        Loop
        If x > x_m Then
            i = i - s
        End If
        
        psk = Round(i * cbp, 5)
        
        Cells(3, 7).Value = psk
        
    End Sub
    
    

    Демо в Excel+VBA: yadi.sk/i/oRTa8Id-a6UfV

    Заключение

    Код далек от совершенства, можно даже сказать, что он убогий. Например, приближенное вычисление выполняется самым глупым из известных человечеству способом. Прошу понять и простить, в текущей ситуации времени на написание чего-то презентабельного категорически не хватает. Виноват, исправлюсь.

    Если у вас есть замечания или вы нашли ошибку — прошу сообщать, буду благодарен. Самое опасное, что может быть — изначально неверная трактовка текста закона.

    UPD Онлайн-калькулятор ПСК с user-friendly вменяемым интерфейсом
    Поделиться публикацией

    Похожие публикации

    Комментарии 40
      0
      А что значит величина ПСК, выраженная в процентах?
        0
        вы имеете в виду какое «практическое» применение у ПСК и зачем это нужно?
          0
          Именно это, и в целом что это за величина.
            +10
            Дело было так:
            В свое время банки регулярно пользовались «финтом ушами» — писали что кредит выдается «под 3% годовых!», но при этом ставили какие-то варварские комиссии и т.п. В итоге предложение «взять кредит под 3% годовых» в действительности превращалось в 40% годовых.
            Затем лавочку с комиссиями прикрыли и начались всякие новые ухищрения — плавающая процентная ставка, обязательная страховка ну и далее по списку.

            В результате законодатели решили помочь потребителям финансовых услуг и обязали всех в договоре вставлять нереальных размеров огромную рамку где написана ПСК.
            В первоначальной редакции ПСК просто показывало процентную ставку по кредиту (с учетом всех платежей) с эффектом реинвестирования (т.е. это годовая доходность банка, если бы банк получал от заемщику деньги и сразу же выдавал бы аналогичный кредит). Нужна она, по сути, чтобы сравнить предложения двух банков между собой и не будучи профессионалом в сфере кредитования, понять какое предложение лучше.

            Но затем случилось следующее: микрофинансовые организации, выдающие «займы до зарплаты», забили тревогу, т.к. у них ПСК получалось овер стопицот миллионов процентов годовых, что могло «шокировать» заемщика. Лоббисты лоббировали-лоббировали да вылобберовали: в формулу расчета ПСК внесли изменения, которые учитывают «специфику небольших займов под большие проценты».
            Честно говоря, в нынешней редакции я понятия не имею, что показывает ПСК. Вот :)
              0
              Получается (грубо говоря) это что-то вроде «конечной годовой ставки»? То есть чем она ниже — чем лучше? Просто сама аббревиатура ПСК меня смутила, что она выражается в процентах, а не абсолютных величинах.

              Кстати, можно ли однозначно сказать — после 1 сентября будет выгоднее брать кредит / не выгоднее / так же, только теперь нагляднее видны предложения?
                0
                Да, это что-то в этом роде.

                Чем ниже ПСК у какого-то кредита, тем он выгоднее для заемщика — это однозначно.
                  0
                  Ее просто кучу раз переименовывали. Раньше называли «эффективной процентной ставкой». Русский язык богат неоднозначностями и двусмысленностью — поэтому как ни назови — будут думать по-разному.
                    0
                    Будет нагляднее — но если нет башки, то чтобы туда не писать — все равно заемщик попадает в кабалу. (по оценкке Forbes уровень финансовой крамотности населения РФ — 4-5%, в то время как в Германии — 40% и выше. Грамотность меряли — задавая обычные задачки по бытовой бухгалтерии — рассчитайте сумму % по депозиту на 3 года — если вы кладете 100 тьс а получите 150 тыс по окончании, посчитайте LTV — уровень ваших долговых обязательств по отношению к доходу, какая должна быть минимальная з/п для того чтобы тратить на себя NN тыс и платить YY за автомобиль и пр.)

                    С другой стороны — сами банки трансформируются — бардак заканчивается. Скажем по беззалоговым кредитам — % ставка только будет повышаться. Слишком много народа берет кредиты в размере 4-5 месячных зарплат — а потом влипают на невозможность их погашения и просрочки. Банк старается это компенсировать спекулятивной % ставкой — но получается только хуже — уже для новых заемщиков. Просрочка расчет быстрее кредитного портфеля. Поэтому — говоря языком специалистов — рынок беззалогового кредитования «перегрет» и крайне раздут — даже по меркам США и ЕС.
                    А вот иные кредиты — кредиты с залогами ( квартира, ипотека, автомобиль, дача и пр) — наоборот, сильно недоразвит. Но это тяжелее — надо собирать документы на имущество, его оценивать по справедливой рыночной цене, решать вопросы его реализации. Пока это занимает слишком много времени — поэтому в 2014 году банки озабочены ускорением и упрощением работы (ч/з автоматизацию разумеется) с такими кредитами. Станет полегче. И % ставка по ним будет падать
                    Третий «кредитный тренд» — кредиты малому бизнесу и прочим ИЧП. Они сейчас берут кредиты себе на дело — как «физики» — так проще и быстрее. А вот если «прикидываться» юриком — то сильно процедуры проверки дольше и неприятнее. Надо упростить и эти кредиты до скорости беззалоговоых кредитов.
            0
            Так а где, в итоге, пример расчета-то?
            Если уж все равно задействовать эксель, то там есть встроенная функция ЧИСТВНДОХ, которая как раз и считает что нужно. Результат вашего кода с ней совпадает?
              0
              Пример расчета по ссылкам.

              ЧИСТВНДОХ считает по формуле:
              image

              Такая формула ПСК действует сейчас и прекратит действие с 1 сентября 2014 года.

              ФЗ от 21 июля 2014 г. N 229-ФЗ «О внесении изменений в статью 6 Федерального закона „О потребительском кредите (займе)“ вносит изменения в формулу.
              Больше ЧИСТВНДОХ не подходит.
                +1
                Ясно. Спасибо.
                Тем не менее, я ожидал увидеть пример расчета в статье.
                  0
                  Я, в общем, ожидал формулу, позволяющую пересчитать от того чудо-юда, которое никому нафиг не интересно, обратно в ЧИСТВНДОХ. Как сам топикстартер сказал — никакого смысла в том, что теперь, с учётом новых правил, будет выдаётся за ПСК нету. А в том, что действует сейчас — есть. Ну значит обычному человеку нужна не программа высчитывающая загадочные числа, а наоборот — программа, которая может пересчитать всё обратно.
                    0
                    В этой статье (в принципе относящейся только к трудящимся в финансовой сфере), я бы хотел привести пример расчета ПСК.

                    Я в принципе изначально указал, что статья в первую очередь для тех, кому предстоит это чудо-юдо в ближайшее время внедрять во вполне себе реальные документы.
                      0
                      Но вот на Хабре большая часть народа — не финансисты. И как раз таки гораздо более интересен вопрос «На что ориентироваться с 1 сентября нам, потребителям? Как понимать процентную ставку теперь?»
                        0
                        На Хабре бОльшая часть IT-шников, которые будут реализовывать этот функционал для финансистов :)
                          –2
                          Вы хотели сказать IT сообщников, которые будут помогать обирать потребителей. (шутка)
                      0
                      Смысл в новой формуле есть.
                      1) Не приводит к искажениям на малые сроки и на малые суммы
                      2) Если нет никакой иной платы за кредит, кроме процентов — то ПСК равна этой процентной ставке
                      3) Удобно для аннуитетов — для ежемесячных (еженедельных) платежей не надо считать степени — все считается «на калькуляторе»
                  +1
                  Само название функции «чисто дох..» как бы намекает, что «стоимость потребительских кредитов» неоправданно высока.
                    0
                    Она совпадает на «старых кредитах», с 1 сентября 2014 г она не будет (и не должна) совпадать
                    0
                    Хаха! Я тут как раз на аутсорсе пишу программу учета для одной из таких контор по «микрокредитованию до зарплаты».
                    Условия там такие — фирма выдает от 10 до 30 тысяч денег на срок от 10 до 30 дней, и берет за это 2% от суммы в день. Но эти 10 — 30 дней считаются «льготным периодом». Договор с клиентом заключается на 60 дней, и если клиент задержал выплату, то в оставшиеся дни с него берется 4% в день. А если клиент просрочил и все 60 дней, то по закону с него можно брать в день только 0.1% от суммы долга, накопившегося к этому времени.
                    После появления закона я, бухгалтер, юрист и руководство фирмы долго его курили, пытаясь постигнуть сакральный смысл числа i и прочих значений в этих расчетах. Не достигнув дзена, мы вполне справедливо решили, что любая проверяющая организация запарится вычислять ПСК по этим формулам, и поступили очень просто: у нас ПСК = 2 * ЧислоЛьготныхДней + 4 * (365 — ЧислоЛьготныхДней).
                    В результате, если клиент взял 30 тысяч на 30 дней, ПСК = 1400! Клиент в шоке, фирмачи потирают руки, все довольны.
                    Коллеги, если вы можете предложить более разумную формулу расчета в моем случае, моя благодарность не будет иметь границ в пределах разумного! :)
                      0
                      ну всё просто. ПСК считается на случай, если клиент платит строго по графику, т.е. он ничего не «просрочил». Так что нужно просто определить переменную bp и указать в функции из статьи корректные входящие данные.
                      чтобы определить bp нужно только знать, насколько часто совершаются платежи? раз в неделю/две или раз в месяц?

                      просто меняйте переменную bp в функциях.
                      bp=7 если раз в неделю
                      bp=14 если раз в 2 недели
                      bp=30 если раз в месяц

                      дальше просто передаете в функцию корректные входящие данные (график платежей) и вот вам пск :)
                        +1
                        Платеж совершается один раз, всего один, и должен он совершаться по истечению льготного периода. Но можно заплатить и после, в течении 60 дней, правда уже с другой процентной ставкой. А в договоре нужно написать «в процентах годовых». Получается, что число платежей = 1, а процентная ставка плавает. Берем БП = 1 день, ЧБП = 365 (или нет??), вычисляем ПСК для базового периода по 2%, остальные дни года считаем по 4%, пробуем подставлять в формулу, мозг закипает… Плюем на все и вычисляем так как я написал выше.
                        0
                        Для микрофинансовых организаций % ставка и правда может превышать сотни процентов. Вместе с тем — на малых суммах — важна скорее не исходная сумма, а сколько тебе надо вернуть.
                        Поэтому в МФО эту дополнительную сумму называют «сумма переплаты». По поводу льготных дней (кредитные каникулы) — то чего то вы перемудрили. Классическая схема МФО — дают сумму до 10 тыс. руб (по закону до 1 млн), и требуют ее вернуть в течение месяца. Например еженедельно равными долями. При схеме — вернешь ч/з месяц 12 тысяч — ПСК действительно будет 20*12=240% годовых
                        Это типичные «кредиты до зарплаты» для нищенствующего слоя населения. Поэтому МФО сильно развиты скажем в Индии.

                          0
                          А зачем вы посчитали 4%? Ведь это как я понял «штрафные» проценты, которые клиент заплатит — если только не попадет в интервал 10-30 дней? Изначально, при заключении договора (там где печатается в верхнем правом углу ПСК) — я бы возможные пессимистические % по пессимистическому сценарию — не писал.
                          Ваша ПСК явно 2*365 = 730%
                          +1
                          вообще нужно посмотреть точную формулировку из договора.

                          Но если я все правильно понял — ваш случай вообще элементарный, т.к. производится всего один платеж.
                          в соответствии с законом вы должны рассматривать «худший» для заемщика вариант. В вашем случае худший вариант это:

                          1. Заемщик берет Х рублей
                          2. Худший вариант в период начисления процентов — он гасит платеж через 60 дней, тогда сумма платежа У вычисляется так:
                          У=Х(тело займа)+30*2%*Х(проценты за льготный период)+30*4%*Х(проценты за нельготный период)=280%*Х

                          БП=60 дней (т.к. это срок платежа, установленный договором).
                          ЧБП=6

                          Далее решаем обычное уравнение (находим i):
                          -X + 2.8*X/(1+i) = 0
                          i=1,8

                          Теперь ПСК:
                          ПСК=i*100*ЧБП=1,8*100*6=1080

                            0
                            Очень, очень интересно. Момент в законе про «худший» вариант я как-то пропустил. Если принять его во внимание, все резко упрощается и вы, пожалуй, правы. Сердечно благодарю. Попробую предложить ваш вариант расчета своим фирмачам, думаю они будут рады резкому снижению ПСК :)
                            Еще раз спасибо.
                              +1
                              по поводу худшего варианта — ФЗ-353 Статья 6, пункт 7:
                              7. В случае, если условиями договора потребительского кредита (займа) предполагается уплата заемщиком различных платежей заемщика в зависимости от его решения, расчет полной стоимости потребительского кредита (займа) производится исходя из максимально возможных суммы потребительского кредита (займа) и сроков возврата потребительского кредита (займа)…
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  С пенями на досрочную выплату можно послать — это законодательно отменено уже давно.
                                  Единственное, что если ты закрываешь больше определённой суммы сразу (вроде бы 600 тыр), то обязан показать источник этих средств. Сталкивался с тем, что люди брали авто в кредит (ради скидок, бесплатной каски и прочих бонусов), а в конце первого месяца его закрывали.
                                    0
                                    Как обычно законом не покрываются скрытые платежи типа стоимости кассовых операций

                                    Такое еще существует? Это законно?

                                    или пенёй на досрочную выплату.

                                    Запретили их уже давно.
                                      0
                                      Вы описываете ситуацию в банковской сфере году так в 2000))

                                      при расчете ПСК учитываются все комиссии и прочие платежи, которые возникают у заемщика вследствие заключения договора. Также кредитор обязан предоставить заемщику БЕСПЛАТНЫЙ способ исполнения обязательств.

                                      Также при расчете ПСК предполагается, что заемщик платит «нормально», т.е. не допускает просрочек и все строго по графику. пени на досрочную выплату запрещены уже давно.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Можете пояснить формулу для Ek, а именно почему берется срок от даты выдачи?
                                По вашей формуле у меня получился такой JS (на основе ответа). Есть небольшая разница в ответе, но решение находится не перебором.
                                  0
                                  Ek — срок выраженный в долях базового периода с момента завершения Qk-го базового периода до даты k-го платежа.

                                  Сначала нужно вычислить сколько дней прошло с момента завершения к-го базового периода до дня платежа, вычисляем по формуле (обозначим как d):
                                  d=(кол-во дней до платежа)-(k*БП), также эту формулу можно переписать так:
                                  d=mod[ (количество дней до платежа) /БП ]

                                  если теперь выразить в долях от базового периода:
                                  Ek=d/БП=mod[ (количество дней до платежа) /БП ] / БП

                                  Почему берется именно срок от выдачи займа — вообще можно считать и по-другому, но так элементарно проще. Фактически мы на основании первоначального графика платежей берем «нулувой» датой — дату выдачи.
                                  Строго в соответствии с определением из закона:
                                  d = Дата_платежа(к) — (Дата_выдачи + bp*k), что очевидно можно записать и вот так:
                                  d=(кол-во дней до платежа)-(k*БП)
                                  0
                                  Немного дополню. В исходной формуле на Excel стоит БП = 30, но это конечно не так — надо проверять частотность и потом брать из нее наименьшую. Я не спец по VBA Excel — может как-то проще можно было, но вот скорректированный макрос, который это учитывает
                                  — Sub Кнопка1_Щелчок()
                                  Dim dates()
                                  Columns(«A:A»).Select
                                  dates() = Application.Transpose(Range(ActiveCell, Cells(Rows.count, ActiveCell.Column).End(xlUp)))

                                  Dim summa()
                                  Columns(«B:B»).Select
                                  summa = Application.Transpose(Range(ActiveCell, Cells(Rows.count, ActiveCell.Column).End(xlUp)))

                                  Dim m As Integer
                                  m = UBound(dates)

                                  'Считаем интервалы БП по графику
                                  ReDim BPall(m)
                                  For k = 3 To m
                                  BPall(k) = dates(k) — dates(k — 1)
                                  Next
                                  'подсчитываем частотность — 1000 это максимальный временной период между платежами в графике
                                  Dim Freq(1000) As Integer
                                  For k = 1 To 1000
                                  Freq(k) = 0
                                  Next
                                  For k = 3 To m
                                  Freq(BPall(k)) = Freq(BPall(k)) + 1
                                  Next
                                  'получаем период с самой наибольшей частотой
                                  mmax = Freq(1)
                                  For k = 1 To 1000
                                  If mmax < Freq(k) Then mmax = Freq(k)
                                  Next k
                                  'берем с наименьшим БП, если одинаковая частотность
                                  bpmin = 1000
                                  For k = 1 To 1000
                                  If mmax = Freq(k) And k < bpmin Then bpmin = k
                                  Next k

                                  'определяем Базовый период
                                  bp = (bpmin)

                                  cbp = Round(365 / bp)

                                  ReDim Days(m)
                                  For k = 2 To m
                                  Days(k) = dates(k) — dates(2)
                                  Next

                                  ReDim e(m)
                                  ReDim q(m)

                                  For k = 2 To m
                                  q(k) = Days(k) \ bp
                                  e(k) = (Days(k) Mod bp) / bp
                                  Next

                                  R = 0
                                  x = 1
                                  x_m = 0
                                  s = 0.0000001
                                  Do While x > 0
                                  x_m = x
                                  x = 0
                                  For k = 2 To m
                                  x = x + summa(k) / ((1 + e(k) * R) * ((1 + R) ^ q(k)))
                                  Next
                                  R = R + s
                                  Loop
                                  If x > x_m Then
                                  R = R — s
                                  End If

                                  psk = Round(R * cbp, 5)

                                  Cells(3, 7).Value = psk

                                  End Sub
                                  ----------
                                    0
                                    Вот еще подправил. Вместо исходного метода итераций — сделал поиск экстремума методом деления пополам. Существенно возросла скорость расчета, при этом можно повышать и точность.
                                    =======
                                        Public summa()
                                        Public e()
                                        Public q()
                                        Public m As Integer
                                        
                                    Sub Кнопка1_Щелчок()
                                        Dim dates()
                                        Columns("A:A").Select
                                        dates() = Application.Transpose(Range(ActiveCell, Cells(Rows.Count, ActiveCell.Column).End(xlUp)))
                                    
                                        Columns("B:B").Select
                                        summa = Application.Transpose(Range(ActiveCell, Cells(Rows.Count, ActiveCell.Column).End(xlUp)))
                                        
                                        m = UBound(dates)
                                        
                                        'Считаем интервалы БП по графику
                                        ReDim BPall(m)
                                        For k = 3 To m
                                            BPall(k) = dates(k) - dates(k - 1)
                                        Next
                                        'подсчитываем частотность - 1000 это максимальный временной период между платежами в графике
                                        Dim Freq(1000) As Integer
                                        For k = 1 To 1000
                                            Freq(k) = 0
                                        Next
                                        For k = 3 To m
                                            Freq(BPall(k)) = Freq(BPall(k)) + 1
                                        Next
                                        'получаем период с самой наибольшей частотой
                                        mmax = Freq(1)
                                        For k = 1 To 1000
                                          If mmax < Freq(k) Then mmax = Freq(k)
                                        Next k
                                        'берем с наименьшим БП, если одинаковая частотность
                                        bpmin = 1000
                                        For k = 1 To 1000
                                          If mmax = Freq(k) And k < bpmin Then bpmin = k
                                        Next k
                                        
                                        'определяем Базовый период
                                        bp = (bpmin)
                                        cbp = Round(365 / bp)
                                        
                                        ReDim Days(m)
                                        For k = 2 To m
                                            Days(k) = dates(k) - dates(2)
                                        Next
                                        
                                        ReDim e(m)
                                        ReDim q(m)
                                        
                                        For k = 2 To m
                                            q(k) = Days(k) \ bp
                                            e(k) = (Days(k) Mod bp) / bp
                                        Next
                                        
                                        Dim r  As Double
                                        r = 0
                                        Bisect 0, 10000, 0.000000000000001, r
                                        
                                        psk = Round(r * cbp, 5)
                                        Cells(3, 7).Value = psk
                                        
                                    End Sub
                                    
                                    Function F(w As Double) As Double
                                    Dim x As Double
                                            x = 0
                                            For k = 2 To m
                                                x = x + summa(k) / ((1 + e(k) * w) * ((1 + w) ^ q(k)))
                                            Next
                                            F = x
                                    End Function
                                    
                                    Sub Bisect(ByVal a As Double, ByVal b As Double, ByVal eps As Double, ByRef r As Double)
                                    Dim c  As Double
                                    Dim fa As Double
                                    Dim fb As Double
                                    Dim fc As Double
                                        fa = F(a)
                                        fb = F(b)
                                         Do
                                          c = 0.5 * (a + b)
                                          If Abs(a - b) <= eps Then
                                             r = c
                                             Exit Sub
                                          End If
                                          fc = F(c)
                                          If Abs(fa) <= eps Then
                                             r = a
                                             Exit Sub
                                          End If
                                          If Abs(fb) <= eps Then
                                             r = a
                                             Exit Sub
                                          End If
                                          If (fc > 0 And fb < 0) Or _
                                             (fc < 0 And fb > 0) Then
                                             a = c
                                             fa = F(a)
                                          Else
                                             b = c
                                             fb = F(b)
                                          End If
                                        Loop
                                    End Sub
                                    


                                    =======
                                    0
                                    offtopic: опечатка в таге «финансы».
                                      0
                                      поправил, спасибо
                                      0
                                      Добрый день, не могли бы вы поправить ссылки в тексте статьи?
                                        0
                                        Приветствую! Я так понимаю, что не работает только ссылка на Excel-файл. Я могу его выслать — напишите в ЛС.
                                        Только есть один нюанс — с 1 сентября 2014 года вступили в силу поправки к закону и расчет ПСК по описанным выше алгоритмам потерял актуальность, т.к. теперь используется другая формула.

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                      Самое читаемое