Ладно, это заняло довольно много времени, и решение - полный медведь. Благодарим @Floris за помощь в решении этой проблемы.
Вопрос требует, чтобы все закончилось единой формулой, но я собираюсь разбить все на части, а затем собрать их вместе.
Я собираюсь замять некоторые основы сложного интереса. Для ознакомления с основными понятиями см. Https://www.investopedia.com/terms/c/compoundinterest.asp для концепций и формулу Excel для преобразования годовой процентной ставки в ежедневную и еженедельную ставку для простых примеров математики, стоящей за ней. первенствует.
Начнем с нашей стандартной формулы процента:
FV = PV(1+r/n)^(t*n)
где т в годах. Это означает, что ежедневная рецептура (для нормального года)
FV = PV*(1+r/365)^DaysNotLeap
И наше начисление процентов на високосный год
FV = PV*(1+R/366)^DaysInLeapYears
Нам математически разрешено объединить этих двоих так:
FV= PV*(1+r/365)^DaysNotLeap*(1+R/366)^DaysInLeapYears
Теперь дело в том, чтобы выяснить, сколько дней в високосных годах и сколько дней - нормальные дни между двумя датами. Это довольно сложно, но как только у нас есть одно, у нас есть другое.
Я собираюсь называть их StartDate и EndDate.
Сколько дней между двумя?
DaysDifference=EndDate-StartDate+1
DaysDifference=Days(EndDate,StartDate)+1
Эти две формулы - одно и то же, просто написано немного по-разному. Один использует встроенную функцию дней в Excel, другой - простое вычитание.
Почему +1? Если я начну 2 января и закончу 3 января, у меня будет 2 и 3 января. Но если я вычту даты, я получу только 1. Нужно добавить один обратно, чтобы компенсировать.
Это было просто. Сколько високосных лет между ними, в том числе если мы начинаем високосный год, заканчиваем високосный год или полностью пропускаем високосный год? Мы можем сделать это, рассчитав, сколько дней мы ожидаем между двумя годами и сколько дней у нас на самом деле между этими двумя годами.
DaysInYearsBetween=DAYS(DATE(YEAR(enddate)+1,1,1),DATE(YEAR(startdate),1,1))
Дни у нас на самом деле есть
Дни, которые мы ожидаем иметь: сначала мы рассчитываем, сколько лет проходит между двумя днями:
YearsBetween=YEAR(enddate)-YEAR(startdate)+1
Тогда мы умножаем на 365
ExpectedDaysBetween=YearsBetween*365
Полное раскрытие всех формул произойдет на последнем этапе.
Так сколько же високосных лет? Давайте вычтем наши два числа:
LeapYearsInvolved = DaysInYearsBetween - ExpectedDaysBetween
Это работает, потому что каждый високосный год добавляет один дополнительный день, поэтому количество дополнительных дней, которое у нас есть, равно количеству високосных лет. Большой!
Нам нужно знать, является ли последний или конечный год високосным. Это можно сделать с помощью пары тестов, тестирование аналогично:
IsStartDateLeap=IF(DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366,TRUE,FALSE)
Это очень ясно и показывает все необходимое. Если вы немного потрясены своим превосходством, я рекомендую выше. Вы можете сократить его до:
IsStartDateLeap=DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366
И пара:
IsEndDateLeap=DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366
Это дает нам довольно простое значение true/false, если наш начальный или конечный год - високосный, который мы можем использовать, чтобы помочь вычислить, где эти дни принадлежат.
Далее нам нужно количество дней в году, которые не использовались ни в начале, ни в конце. Например, если мы начали 27 января, то в этом году 26 дней мы не использовали.
UnusedStartDays=startdate - DATE(YEAR(startdate)-1,12,31)
UnusedEndDays=DATE(YEAR(enddate)+1,1,1)-enddate
Итак, теперь у нас есть все части - давайте свяжем их вместе. Високосные дни - длинная версия:
DaysInLeapYear=LeapYearsInvolved*366-if(IsStartDateLeap,UnusedStartDays,0)-if(IsEndDateLeap,UnusedEndDays)
Leap Days - короткая версия
DaysInLeapYear=LeapYearsInvolved*366-IsStartDateLeap*UnusedStartDays-IsEndDateLeap*UnusedEndDays
Обратите внимание, что в Excel 2010 и более ранних версиях вам может потребоваться преобразовать его в формат (--IsStartDateLeap), чтобы принудительно преобразовать логическое значение в число.
DaysNotLeap=DaysDifference-DaysInLeapYear
Как упоминалось ранее, если мы знаем один, мы знаем оба.
У нас есть все кусочки головоломки. Время собрать их с помощью простой замены. Я не буду подробно останавливаться на деталях замены, просто буду публиковать сообщения на разных этапах.
FV= PV*(1+r/365)^(DaysDifference-DaysInLeapYear)*(1+R/366)^DaysInLeapYears
,
FV= PV*(1+r/365)^(DaysDifference-(LeapYearsInvolved*366-if(IsStartDateLeap,UnusedStartDays,0)-if(IsEndDateLeap,UnusedEndDays)))*(1+R/366)^(LeapYearsInvolved*366-if(IsStartDateLeap,UnusedStartDays,0)-if(IsEndDateLeap,UnusedEndDays))
,
FV= PV*(1+r/365)^(DaysDifference-(LeapYearsInvolved*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate))))*(1+R/366)^(LeapYearsInvolved*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate)))
,
FV= PV*(1+r/365)^((Days(EndDate,StartDate)+1)-((DaysInYearsBetween - ExpectedDaysBetween)*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate))))*(1+R/366)^((DaysInYearsBetween - ExpectedDaysBetween)*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate)))
,
FV= PV*(1+r/365)^((Days(EndDate,StartDate)+1)-((DAYS(DATE(YEAR(enddate)+1,1,1),DATE(YEAR(startdate),1,1)) - YearsBetween*365)*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate))))*(1+R/366)^((DAYS(DATE(YEAR(enddate)+1,1,1),DATE(YEAR(startdate),1,1)) - YearsBetween*365)*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate)))
И мы наконец получаем:
FV= PV*(1+r/365)^((Days(EndDate,StartDate)+1)-((DAYS(DATE(YEAR(enddate)+1,1,1),DATE(YEAR(startdate),1,1)) - (YEAR(enddate)-YEAR(startdate)+1)*365)*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate))))*(1+R/366)^((DAYS(DATE(YEAR(enddate)+1,1,1),DATE(YEAR(startdate),1,1)) - (YEAR(enddate)-YEAR(startdate)+1)*365)*366-if((DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366),(startdate - DATE(YEAR(startdate)-1,12,31)),0)-if((DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366),(DATE(YEAR(enddate)+1,1,1)-enddate)))
И там мы идем. Как рассчитать ежедневный начисляемый процент между двумя датами, скорректированный на високосные годы.
На вопрос "Разве это не довольно близко друг к другу" - да, они есть. При первоначальном значении в 10 000, в течение 8 лет, с 24 апреля 2008 года по 2 февраля 2016 года, Compounding "должным образом" дает нам значение 14 753,70 долл. США, в то время как сложное "ненадлежащее" значение дает нам 14 757,28 долл. США.