Финансовые функции и рекурсия

Автор работы: Пользователь скрыл имя, 13 Марта 2013 в 19:43, реферат

Краткое описание

В электронные таблицы Excel, систему управления базами данных Access, язык программирования Visual Basic и многие другие современные компьютерные технологии встроены так называемые “финансовые функции”: fv(), pv(), pmt(), ppmt(), ipmt(), rate(), nper() и т.д. В повседневной жизни с задачами, в которых они могут быть использованы, приходится сталкиваться достаточно часто.

Содержание

Введение
Динамика вклада
Задача о величине вклада
Задача о величине вклада после снятия денег в конце каждого периода
Задача о величине вклада после внесения (снятия) денег в конце или начале каждого периода
Задача о изменяющихся процентных ставках
Задача о изменяющихся процентных ставках и величинах снимаемых денег
Дисконтирование. Инвестиции. Консолидирование
Задача о дисконтировании
Задача о инвестировании проекта
Задача о консолидировании платежей
Платежи
Задача о равных платежах в конце каждого периода
Задача о платежах с одинаковой современной стоимостью
Задача о платежах на проценты
Разные задачи
Задача о величине процентной ставки
Задача о величине процентной ставки 2
Задача о количестве периодов для расчета заемщика с банком
Задача о суммарной способности к кредитованию
Задача о минимальном количестве банков
Задача о изменении величины суммарного кредитования
Заключение
Литература

Вложенные файлы: 1 файл

Финансовые функции и рекурсия.docx

— 454.37 Кб (Скачать файл)

При необходимости можно  было бы вывести и конечную формулу  для вычисления fv() или, по крайней  мере, попытаться найти её в том  или ином справочнике. Но это требует  дополнительных усилий и затрат времени. Да и выглядит формула достаточно громоздко:

Задача о изменяющихся процентных ставках

 

В банк положена сумма в S денежных единиц. Пусть банк проводит начисления в процентах: в течение n0 периодов - по ставке p0, затем в  течение n1 периодов - по ставке p1 и т.д. и, наконец, в течение nk-1 периодов - по ставке pk-1. Считая nj (j=0. . k-1) натуральными числами, вычислить размер вклада через n0+n1+…+nk-1 периодов.

Решение. Рассмотрим векторы  длин периодов n и процентных ставок p:

n=(n0,n1,…,nk-1) T, p=(p0,p1,…,pk-1) T.

Данная задача является обобщением задачи 1 и при длине вектора n, равной единице, совпадает с ней. Пусть revise(S,p,n) - решение задачи 4. Тогда, в силу сказанного, при length(n) =1 имеем

revise(S,p,n) =invest(S,p,n),

и это соотношение может  служить базой рекурсии. Декомпозицию реализуем, исходя из следующих соображений. Пусть length(n) >1 и задача 4 решена для  векторов n1 и p1, полученных отбрасыванием  последнего компонента соответственно у векторов n и p. Образовавшийся при  этом новый размер вклада обозначим  через sum. Тогда для получения  решения исходной задачи с векторами n и p остается подсчитать сумму, возвращаемую при инвестировании величины sum на последние nk-1 периодов под pk-1 процентов. Иными словами, необходимо еще раз решить задачу 1, то есть вычислить значение функции invest(sum,pk-1,nk-1). Именно эти соображения и использованы при написании функции revise():

Рекурсивная функция revise1(S,p,n) построена на способе декомпозиции, вытекающем из таких соображений. Если исходную сумму S инвестировать под p0 процентов на n0 периодов, то с полученной суммой останется решить исходную задачу для векторов n и p c удаленными первыми  компонентами:

Замечание. При необходимости  можно было бы вывести конечную формулу  для решения задачи 4. Выглядит она  так:

Контрольные примеры.

 

Задача о изменяющихся процентных ставках и величинах снимаемых денег

 

Вкладчик положил в  сбербанк sum денежных единиц под pk (k=0. . n-1) процентов за каждый из n последующих  периодов времени. В конце каждого  периода k (k=0. . n-1) после начисления pk процентов он снимает со счета Ak денежных единиц. Иными словами, допускается, вообще говоря, и изменение процентной ставки, и величины денежных единиц, снимаемых с вклада. Составить  программы, отвечающие на следующие  вопросы:

Имеет ли задача решение?

Если задача имеет решение, то какова величина вклада после n периодов?

Если задача не имеет решения, то каков наименьший номер периода, в котором взятие соответствующей  суммы оказалось невозможным?

Решение. Рассмотрим векторы  процентных ставок и величин уменьшения вклада:

p=(p0,p1,…,pn-1) T, A=(A0,A1,…,An-1) T.

Ответ на первые два вопроса  дают рекурсивные программы-функции waste2(sum,p,A) и waste3(sum,p,A). Если задача имеет  решение, то они возвращают величину вклада после n периодов, а иначе - отрицательное  число. Декомпозиция для функции waste2() проводилась, исходя из того же утверждения, что и для функции waste(), а декомпозиция для функции waste3() - исходя из того же утверждения, что и для функции waste1(). Во втором случае получена более  компактная и ясная программа:

Наряду с этими программами  можно вывести и конечную формулу wa(S,p,A) для расчетов. Пусть n=length(p). Тогда:

И, наконец, в общем случае:

Контрольные примеры.

Попробуем теперь составить  программу, отвечающую на третий из поставленных вопросов. Будем считать, что она  должна возвращать вектор с двумя  компонентами, который выглядит так:

[“O’key” решение] T, если  задача имеет решение;

[период сальдо] T, если  задача не имеет решения.

Во втором случае возвращается период (нумерация от 1 и далее) и  отрицательное сальдо – количество денежных единиц, которых недостает  для выплаты в данный период.

Всем перечисленным условиям удовлетворяет рекурсивная программа-функция waste4(sum,p,A,k):

Здесь k - вспомогательный  параметр. При первом обращении к waste4() его значение должно быть равно  нулю. Далее k используется для организации  рекурсивных вычислений, а операторы return - для прекращения рекурсивных  вызовов при получении решения  задачи.

Контрольные примеры.

Дисконтирование. Инвестиции. Консолидирование

 

Задача о дисконтировании

 

Какую сумму следует внести сегодня в банк при процентной ставке p, чтобы через n периодов получить S денежных единиц?

Решение. Фактически речь идет о вычислении величины, называемой экономистами современной стоимостью отложенного платежа. Если положить в банк сумму в R=S/(1+p/100) n единиц, то через n периодов она превращается в S единиц. Та же самая сумма R через n-1 период превращается в S/(1+p/100) единиц. Таким  образом, если discount(S,p,n) - решение исходной задачи, то при n№0 имеем:

discount(S,p,n) = discount(S/(1+p/100),p,n-1).

Будем проводить рекурсию по количеству периодов n. Тогда последнее  соотношение дает нам правило  декомпозиции. Отсюда и получаем программу-функцию (5):

 (5)

На вопросе о том, как  проведена декомпозиция в (6), останавливаться  не будем:

 (6)

Замечание. Из проведенных  рассуждений вытекает, что решение  задачи может быть получено по конечной формуле:

Контрольные примеры.

Задача о современной  стоимости потока равных платежей.

Пусть реализация некоторого проекта обеспечивает поток равных платежей по S денежных единиц за каждый из n периодов при банковской ставке p процентов. Подсчитать современную  стоимость этого потока.

Решение. Если просуммировать сегодняшнюю стоимость первого, второго и т.д. и, наконец, последнего платежа, то мы и получим современную  стоимость всего потока. Пусть  она равна payment(S,p,n). Тогда

в силу задачи 6 о дисконтировании  будем иметь:

Впрочем, никто не мешает нам вывести и конечную формулу  для расчетов, которая выглядит так:

Однако мы займемся написанием рекурсивной программы-функции решения  данной задачи. Выделить базу и провести декомпозицию наиболее просто, исходя из таких утверждений. Если n=0, то есть не прошло ни одного периода, то и платежей поступит 0. Далее, современная стоимость  всех платежей - это современная  стоимость платежей за первые n-1 период плюс современная стоимость последнего n-го платежа, равного S/(1+p/100) n. Отсюда и  получаем функцию (7):

 (7)

Другой вариант рекурсивной  функции решения задачи 7 можно  записать так:

 (8)

Контрольные примеры.

 

Задача о инвестировании проекта

 

Пусть некоторый проект в  течение последующих nper периодов будет  приносить доход по pmt денежных единиц. Пусть платежи инвестору производятся в конце каждого периода (type=0) или в начале их (type=1). Какую сумму  инвестор может вложить в этот проект, чтобы при действующей  процентной ставке, равной rate за период, он оказался выгодным?

Решение. Вопрос фактически ставится так. Если сегодня инвестор внес W денежных единиц в реализацию проекта, то оправданы ли эти затраты  с его будущими доходами по pmt единиц в течение каждого из nper периодов? Из предыдущей задачи вытекает, что  при type=0 проект оказывается выгодным лишь при выполнении условия W<payment(pmt,nper,rate). В общем виде эта задача является прямым обобщением задачи 7 и может  быть решена с помощью встроенной в Excel функции pv() - вычисления современной  стоимости потока равных платежей. Если W<pv(pmt,nper,rate,type), то финансировать  проект выгодно. Сконструируем рекурсивныe аналоги pv1() и pv2() функции pv(). Рассмотрим два варианта.

Вариант 1. Функции pv10() и pv11() вычисляют современную стоимость  потока платежей соответственно при type=0 и type=1. При этом pv10() равносильна функции (7), а pv11() строится по аналогии с pv10(). Далее, при известных функциях pv1() и pv2() написание функции pv1() для любого значения type труда не представляет:

Вариант 2. Функции pv20() и pv21() вычисляют современную стоимость  потока платежей соответственно при type=0 и type=1. При этом pv20() равносильна функции (8), а pv2() строится по аналогии с pv20(). Далее, при известных функциях pv20() и pv21() написание функции pv2() для любого значения type труда не представляет:

Вывод конечной формулы для  расчета pv() можно провести так.

type=0.

type=1.

Общий случай.

Контрольные примеры.

 

Задача о консолидировании платежей

 

Заемщик при существующей ставке в p процентов должен внести в банк k последовательных платежей. Первый платеж в a0 денежных единиц необходимо осуществить через t0 периодов, второй платеж в a1 единиц - через t1 периодов и  т.д. и, наконец, k-й платеж в ak-1 единиц - через tk-1 периодов. Все величины tn (n=0. . k-1) отсчитываются от момента получения займа. Из-за невозможности внести первый взнос заемщик просит консолидировать его платежи, то есть разрешить ему через некоторое время заплатить сразу весь долг a0+a1+…+ak-1. Через какое количество q периодов заемщик обязан рассчитаться, чтобы ничьи интересы не пострадали?

Решение. Будем исходить из того, что современная стоимость  потока платежей заемщика и современная  стоимость единовременно вносимой им суммы должны совпадать. Отсюда для  нахождения значения q получаем так  называемое уравнение эквивалентности  процентных ставок при дисконтировании:

 (9)

Параметр q можно непосредственно  определить из этой формулы. Пусть a и t - векторы платежей и периодов:

a=(a0,a1,…,ak-1) T, t=(t0,t1,…,tk-1) T. (10)

Будем вычислять q с помощью  функции conso(a,t,p) и вспомогательной  рекурсивной функции summa(a,t,p), служащей для нахождения сумм в (9). Значение q=conso(a,t,p) может оказаться дробным.

Выглядят эти функции  так:

 (11)

 (12)

Замечание. Величины tn (n=0. . k-1) можно измерять в долях целого периода. Например, если один период - это  год, то tn можно измерять в месяцах, днях, а при необходимости - и в  часах. При этом процентная ставка p должна быть скорректирована соответственно на p/12, p/365 или p/(365Ч24).

Контрольные примеры.

Платежи

 

Задача о равных платежах в конце каждого периода

 

Банк выдал заемщику кредит в S денежных единиц на k периодов с необходимостью выплаты долга равными частями  в конце каждого периода. Определить величину разовых выплат, если процентная ставка банка за один период равна p.

Решение. Эта задача весьма поучительна. Она дает нам возможность  на конкретном примере поговорить об одном необычном способе построения эффективных рекурсивных алгоритмов решения определенного класса задач, отправляясь от “алгоритмов с  бесконечным числом рекурсивных  обращений”. Обозначим через pay(S,p,k) решение задачи. Попробуем обсудить приведенный ниже текст программы вычисления pay(S,p,k):

 (13)

С точки зрения логики здесь  как будто бы все в порядке. Фактически записано, что если k=1, то есть расчет должен произойти в конце  первого периода, то выплатить придется всю задолженность сразу, а именно, SЧ(1+p/100) денежных единиц. В противном случае необходимо поступить так. Произвести расчет в конце первого периода и с оставшейся задолженностью

 (14)

рассчитываться следующие k-1 периодов. Что же в этом рассуждении не работает? Дело в том, что в (14) величина pay(S,p,k) неизвестна. Именно её по условию задачи и требуется вычислить. Поэтому попытка реально реализовать счет по программе-функции (13) всегда будет завершаться аварийно - переполнением стека рекурсивных вызовов. Иными словами, тело рекурсивной функции не может содержать ссылку на эту же функцию с тем же самым набором параметров! Но не будем отчаиваться. Подставим в теле (13) вместо pay(S,p,k) некоторый параметр X:

 (15)

Полученная функция payw() при  любом фиксированном X уже вполне пригодна для вычислений. Здесь рекурсия четко организована по параметру k. Правда, непонятно, что payw() вычисляет? Но это и знать незачем. Все, что  нам требуется - это зафиксировать X не произвольно, а таким образом, чтобы полученное в результате вычислений по (15) значение для payw(S,p,k) оказалось  равным X. В этом случае фактически будет  вычислено pay(S,p,k) в (13), то есть решена исходная задача. Однако метод хаотичных проб и ошибок вряд ли здесь может привести к успеху. Необходимо научиться управлять параметром X, изменяя его значение в правильном направлении. Для этих целей к аргументам функции payw(S,p,k) добавим X:

 (16)

Получили функцию paywi(). При  любом фиксированном X значения функций (15) и (16) равны. Поэтому поиск решения  исходной задачи окончательно свелся к нахождению в (16) такого X, при котором

g(S,p,k,X) єpaywi(S,p,k,X) - X=0.

Фиксируем значения S, p и k. Тогда g(S,p,k,X) - непрерывная на всей числовой оси функция одной переменной. Нам необходимо найти по крайней мере один её вещественный корень X* (g(S,p,k,X*) є0). Делать это можно по-разному. Например, определить отрезок, на котором g() принимает значения разных знаков, а затем использовать быстро сходящийся метод дихотомии (деления отрезка пополам).

Приведенная ниже рекурсивная  программа-функция dicho(f,a,b,e) для произвольной непрерывной на отрезке [a,b] (a<b) функции f(x) при условии f(a) Чf(b) Ј0 c заданной точностью e>0 находит некоторый вещественный корень f(x). Эту функцию и будем использовать далее:

 (17)

Контрольный пример. Подсчитать величину равных платежей в конце  каждого периода, если заем в 1000 денежных единиц взят под 10 процентов на каждый из 4 периодов.

Предложенный способ решения  задачи (10) не является наилучшим. Можно  было бы для этих целей предложить и такие рекурсивные функции:

 (18)

 (19)

Функция paywi1() отличается от функции paywi2() количеством рекурсивных  вызовов при вычислениях. Порядок  их в первом случае равен k, а во втором - log2(k).

Решение предложенной задачи может быть осуществлено и по конечной формуле (20). Выводится она так. Пусть W=W(S,p,k). С одной стороны, задолженность  через k периодов должна быть полностью  погашена, а с другой - её можно  подсчитать так:

Информация о работе Финансовые функции и рекурсия