public void AjustarTaxaParaPontosEmDiasNaoUteis(ref IList <CurvaExecucaoPonto> listaVertices, int CodigoModeloCalculo, int tipoVerticeInterpolacao, int interpolacaoID, int baseDias) { int duAnt = 0; if (CodigoModeloCalculo == METODO_AJUST_BASEFATOR || CodigoModeloCalculo == METODO_AJUST_BASETAXA) { ConversorTaxasBS conversor = new ConversorTaxasBS(); if (CodigoModeloCalculo == METODO_AJUST_BASEFATOR) { if (tipoVerticeInterpolacao == VERTICE_INTERPOLACAO_TAXA && interpolacaoID == LINEAR) { //taxaOver = vertices[0].ValorVertice; listaVertices = conversor.ConverterTaxasLinearesParaFatorDiario(listaVertices, baseDias); } else if (tipoVerticeInterpolacao == VERTICE_INTERPOLACAO_TAXA && interpolacaoID == EXPONENCIAL) { //Se tipo de vertice para interpolacao for TAXA e o tipo de interpolacao for Exponencial converter a taxa para fator diário. listaVertices = conversor.ConverterTaxasExponenciaisParaFatorDiario(listaVertices, baseDias); } } for (int i = 0; i < listaVertices.Count; i++) { CurvaExecucaoPonto pontoCurva = listaVertices[i]; //Se quantidade de dias uteis é igual à quantidade de dias uteis anterior, então não é um dia util. if (pontoCurva.QuantidadeDiasUteis == duAnt && duAnt != 0) { for (int j = i + 1; j < listaVertices.Count; j++) { if (listaVertices[j].QuantidadeDiasUteis == duAnt + 1) { duAnt = pontoCurva.QuantidadeDiasUteis; //pontoCurva.QuantidadeDiasUteis = listaVertices[j].QuantidadeDiasUteis; pontoCurva.ValorVertice = listaVertices[j].ValorVertice; break; } } } else { duAnt = pontoCurva.QuantidadeDiasUteis; } } if (CodigoModeloCalculo == METODO_AJUST_BASEFATOR) { if (tipoVerticeInterpolacao == VERTICE_INTERPOLACAO_TAXA && interpolacaoID == LINEAR) { //taxaOver = vertices[0].ValorVertice; listaVertices = conversor.ConverteFatoresDiariosParaLinear(listaVertices, baseDias); } else if (tipoVerticeInterpolacao == VERTICE_INTERPOLACAO_TAXA && interpolacaoID == EXPONENCIAL) { listaVertices = conversor.ConverteFatoresDiariosExponenciais(listaVertices, baseDias); } } } }
public IList <CurvaExecucaoPonto> ConverteFatoresDiariosParaLinear(IList <CurvaExecucaoPonto> listaPontos, int baseDias) { List <CurvaExecucaoPonto> novaListaPontos = null; CurvaExecucaoPonto novoPonto = null; novaListaPontos = new List <CurvaExecucaoPonto>(); foreach (CurvaExecucaoPonto curvaExecucaoPonto in listaPontos) { novoPonto = new CurvaExecucaoPonto(); novoPonto.DataVencimento = curvaExecucaoPonto.DataVencimento; novoPonto.IndicadorVertice = curvaExecucaoPonto.IndicadorVertice; novoPonto.QuantidadeDiasCorridos = curvaExecucaoPonto.QuantidadeDiasCorridos; novoPonto.QuantidadeDiasUteis = curvaExecucaoPonto.QuantidadeDiasUteis; novoPonto.ValorVertice = curvaExecucaoPonto.ValorVertice; // Verifica a quantidade base de dias if (baseDias == 252) { // Verifica a quantidade de dias corridos if ((curvaExecucaoPonto.QuantidadeDiasUteis != 0)) { novoPonto.ValorVertice = (double)100 * ((curvaExecucaoPonto.ValorVertice - 1) * ((double)baseDias / curvaExecucaoPonto.QuantidadeDiasUteis)); } else { novoPonto.ValorVertice = 0; } } else { // Verifica a quantidade de dias corridos if ((curvaExecucaoPonto.QuantidadeDiasCorridos != 0)) { novoPonto.ValorVertice = (double)100 * ((curvaExecucaoPonto.ValorVertice - 1) * ((double)baseDias / curvaExecucaoPonto.QuantidadeDiasCorridos)); } else { novoPonto.ValorVertice = 0; } } // Adiciona o objeto na lista novaListaPontos.Add(novoPonto); } // Retorna a lista return(novaListaPontos); }
private void InterpolacaoLinear(IList <CurvaExecucaoPonto> vertices, DateTime dataBase, int baseDias, IList <CurvaExecucaoPonto> curvaInterpolada) { int iAnt, iProx; iProx = 0; iAnt = 0; for (int i = 0; i < vertices.Count; i++) { iProx = i; //Pula o Primeiro Fator if (iProx > 0) { for (int j = vertices[iAnt].QuantidadeDiasCorridos + 1; j < (vertices[iProx].QuantidadeDiasCorridos); j++) { CurvaExecucaoPonto pontoCurva = new CurvaExecucaoPonto(); if (baseDias == BASE_252) { //Calcula o valor vertice no do ponto interpolado curvaInterpolada[j].ValorVertice = vertices[iAnt].ValorVertice + (vertices[iProx].ValorVertice - vertices[iAnt].ValorVertice) * ((double)(curvaInterpolada[j].QuantidadeDiasUteis - vertices[iAnt].QuantidadeDiasUteis) / (vertices[iProx].QuantidadeDiasUteis - vertices[iAnt].QuantidadeDiasUteis)); } else { //Calcula o valor vertice no do ponto interpolado curvaInterpolada[j].ValorVertice = vertices[iAnt].ValorVertice + (vertices[iProx].ValorVertice - vertices[iAnt].ValorVertice) * ((double)(curvaInterpolada[j].QuantidadeDiasCorridos - vertices[iAnt].QuantidadeDiasCorridos) / (vertices[iProx].QuantidadeDiasCorridos - vertices[iAnt].QuantidadeDiasCorridos)); } } } iAnt = iProx; } }
private IList <CurvaExecucaoPonto> Interpolar(ref IList <CurvaExecucaoPonto> vertices, Double taxaOver, ref DateTime dataBase, int antepolacaoID, int interpolacaoID, int extrapolacaoID, int baseDias, int tipoVerticeInterpolacao, CalendarioReguaBS calRegua) { IList <CurvaExecucaoPonto> curvaInterpolada; try { if (antepolacaoID == NA) { return(vertices); } int QteDC_Curva = calRegua.NumeroMaxDiasCorridos; curvaInterpolada = new List <CurvaExecucaoPonto>(QteDC_Curva); for (int index = 0; index < QteDC_Curva; index++) { bool isVertice = false; CurvaExecucaoPonto pontoCurva = new CurvaExecucaoPonto(); //Verifica na lista de vertices se o ponto atual é um vertice. foreach (CurvaExecucaoPonto item in vertices) { if (item.QuantidadeDiasCorridos == index) { isVertice = true; pontoCurva = item; pontoCurva.QuantidadeDiasCorridos = index; pontoCurva.DataVencimento = dataBase.AddDays(index); pontoCurva.QuantidadeDiasUteis = calRegua.ObterQuantidadeDiasUteis(pontoCurva.DataVencimento.ToString("yyyyMMdd")); } } //Se não for vertice inclui as informações da curva. if (!isVertice) { pontoCurva.DataVencimento = dataBase.AddDays(index); pontoCurva.QuantidadeDiasCorridos = index; pontoCurva.QuantidadeDiasUteis = calRegua.ObterQuantidadeDiasUteis(pontoCurva.DataVencimento.ToString("yyyyMMdd")); } curvaInterpolada.Add(pontoCurva); } ConversorTaxasBS conversor = new ConversorTaxasBS(); if (antepolacaoID == EXPONENCIAL) { AntepolacaoExponencial(vertices, dataBase, baseDias, curvaInterpolada); } else if (antepolacaoID == LINEAR) { AntepolacaoLinear(vertices, dataBase, baseDias, curvaInterpolada); } if (interpolacaoID == EXPONENCIAL) { InterpolacaoExponencial(vertices, dataBase, baseDias, curvaInterpolada); } else if (interpolacaoID == LINEAR) { InterpolacaoLinear(vertices, dataBase, baseDias, curvaInterpolada); } //else if (interpolacaoID == CUBIC_SPLINE) //{ // listaInterpolacao = InterpolacaoCubicSpline(vertices); //} if (extrapolacaoID == EXPONENCIAL) { ExtrapolacaoExponencial(vertices, dataBase, baseDias, curvaInterpolada); } else if (extrapolacaoID == LINEAR) { ExtrapolacaoLinear(vertices, dataBase, baseDias, curvaInterpolada); } return(curvaInterpolada.ToList()); } finally { calRegua.Dispose(); calRegua = null; } }