Tudo bem, isso levou bastante tempo, e a solução é um urso completo. Agradecemos a @Floris por me ajudar a resolver isso.
A questão exige que tudo acabe em uma única fórmula, mas vou dividir as partes e depois reuni-las novamente.
Vou passar algumas informações básicas sobre juros compostos. Para primers, veja link para os conceitos, e fórmula do Excel para converter a taxa de juros por ano para capitalizar as taxas diárias e semanais para exemplos simples da matemática por trás dele no excel.
Começaremos com nossa fórmula de interesse padrão:
FV = PV(1+r/n)^(t*n)
, onde t é em anos. Isso significa que a composição diária (por um ano normal) é
FV = PV*(1+r/365)^DaysNotLeap
E o nosso interesse de composição para um ano bissexto é
FV = PV*(1+R/366)^DaysInLeapYears
Estamos matematicamente autorizados a juntar os dois assim:
FV= PV*(1+r/365)^DaysNotLeap*(1+R/366)^DaysInLeapYears
Agora, o truque é descobrir quantos dias são em anos bissextos e quantos dias são dias normais entre duas datas. Isto é bastante complicado, mas uma vez que temos um, temos o outro.
Vou chamá-los de StartDate e EndDate.
Quantos dias tem entre os dois?
DaysDifference=EndDate-StartDate+1
DaysDifference=Days(EndDate,StartDate)+1
Essas duas fórmulas são a mesma coisa, apenas escritas de maneira um pouco diferente. Um usa a função interna do Excel, o outro é a subtração simples.
Por que o +1? Se eu começar em 2 de janeiro e terminar em 3 de janeiro, tenho o segundo e o terceiro. Mas se eu subtrair as datas, eu só recebo 1. Preciso adicionar um de volta para compensar.
Isso foi fácil. Quantos anos bissextos existem entre os dois, incluindo se começarmos em um ano bissexto, terminar em um ano bissexto ou pular completamente um ano bissexto? Podemos fazer isso calculando quantos dias esperamos entre os dois anos versus quantos dias realmente temos entre os dois anos.
DaysInYearsBetween=DAYS(DATE(YEAR(enddate)+1,1,1),DATE(YEAR(startdate),1,1))
Dias que realmente temos
Dias que esperamos ter: primeiro calculamos quantos anos há entre os dois dias:
YearsBetween=YEAR(enddate)-YEAR(startdate)+1
Então, nós multiplicamos por 365
ExpectedDaysBetween=YearsBetween*365
A expansão completa de todas as fórmulas ocorrerá na etapa final.
Então, quantos anos bissextos estão envolvidos? Vamos subtrair nossos dois números:
LeapYearsInvolved = DaysInYearsBetween - ExpectedDaysBetween
Isso funciona porque cada ano bissexto adiciona um dia extra, então o número de dias extras que temos é o número de anos bissextos envolvidos. Ótimo!
Precisamos saber se um ano final ou final é um ano bissexto. Isso pode ser feito com um par de testes, testando de maneira semelhante:
IsStartDateLeap=IF(DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366,TRUE,FALSE)
Isso está sendo muito explícito e mostrando tudo o que é necessário. Se você é um pouco shakey com o seu excel, eu recomendo o acima. Você pode encurtá-lo para:
IsStartDateLeap=DAYS(DATE(YEAR(startdate),12,31), DATE(YEAR(startdate)-1, 12, 31))=366
E o par:
IsEndDateLeap=DAYS(DATE(YEAR(Enddate),12,31), DATE(YEAR(Enddate)-1, 12, 31))=366
Isso nos dá um verdadeiro / falso razoavelmente simples se nosso ano inicial ou final for salto, o que podemos usar para ajudar a calcular onde esses dias pertencem.
Em seguida, precisamos do número de dias do ano não usados em nossas datas de início e fim. Por exemplo, se começamos em 27 de janeiro, há 26 dias naquele ano que não utilizamos.
UnusedStartDays=startdate - DATE(YEAR(startdate)-1,12,31)
UnusedEndDays=DATE(YEAR(enddate)+1,1,1)-enddate
Então agora temos todas as peças - vamos juntá-las. Leap days - Long version:
DaysInLeapYear=LeapYearsInvolved*366-if(IsStartDateLeap,UnusedStartDays,0)-if(IsEndDateLeap,UnusedEndDays)
Dias bissextos - versão resumida
DaysInLeapYear=LeapYearsInvolved*366-IsStartDateLeap*UnusedStartDays-IsEndDateLeap*UnusedEndDays
Por favor, note no Excel 2010 e anteriores você pode precisar transformá-lo no formato de (--IsStartDateLeap) para forçar a conversão de um booleano para um número.
DaysNotLeap=DaysDifference-DaysInLeapYear
Como mencionado anteriormente, se conhecemos um, conhecemos ambos.
Temos todas as peças do quebra-cabeça. Hora de colocá-los juntos via simples substituição. Não vou repassar todos os detalhes da substituição, apenas postando em vários estágios.
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)))
E finalmente conseguimos:
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)))
E lá vamos nós. Como calcular os juros compostos diários entre duas datas, ajustados para anos bissextos.
Para a pergunta "Não é muito parecido" - sim, eles são. Em um valor inicial de 10.000, mais de 8 anos de 24 de abril de 2008 a 2 de fevereiro de 2016, o Composto "corretamente" nos dá um valor de US $ 14.753,70, enquanto que a composição "indevida" nos dá um valor de US $ 14.757,28.