public static List<Treinamento> SelecionarTreinamentos_V2(List<DadosBE> dadosBE, int janelaEntrada, int n)
        {
            if (n <= 0)
                n = 1;

            List<Treinamento> treinamentos = new List<Treinamento>();
            for (int divisao = 0; divisao < numeroDivisoesCrossValidation; divisao++)
            {
                for (int i = dadosBE.Count / numeroDivisoesCrossValidation * divisao; i < dadosBE.Count / numeroDivisoesCrossValidation * (divisao + 1); i += n)
                {
                    //i deve ter valor menor que o numero de elementos de dadosBE - a quantidade de elementos que serão selecionados (janelaentrada + 1[janela saida])
                    if (i >= dadosBE.Count - janelaEntrada)
                        break;
                    Treinamento treinamento = new Treinamento();
                    treinamento.DivisaoCrossValidation = divisao;
                    List<DadosBE> dadosBEInput = dadosBE.Skip(i).Take(janelaEntrada).ToList();

                    treinamento.Input = SelecionarInput_V2(dadosBEInput);

                    DadosBE dadoBEOutput = dadosBE.Skip(i + janelaEntrada).First();
                    treinamento.Output = new List<double>() { dadoBEOutput.ValorNormalizado, (double)dadoBEOutput.CotacaoDolarNormalizado };
                    treinamentos.Add(treinamento);
                }
            }

            //Comentado por enquanto //Pode não haver dados suficientes para terminar de preencher o output, gerando um output com menos dados do que o solicitado
            return treinamentos;     //.Where(trein => trein.Output.Count == janelaSaida).ToList();
        }
        public static Treinamento TransformarDadoBE_Em_Treinamento_RNV5(DadosBE dadoBE, double versao)
        {
            Treinamento treinamento = new Treinamento();
            treinamento.Input = new List<double>();
            treinamento.Input.Add(dadoBE.ValorNormalizado);

            if (dicIndicesRN[versao].Contains("PercentualCrescimentoValorAtivo"))
                //Adiciona cada um dos percentuais dos n dias anteriores e do dia da cotação
                dadoBE.PercentualCrescimentoValorAtivo.ForEach(percent => treinamento.Input.Add(percent));

            if (dicIndicesRN[versao].Contains("ValorBollinger"))
                treinamento.Input.Add(dadoBE.ValorBollinger);

            if (dicIndicesRN[versao].Contains("Pontuacao3MediasMoveis"))
                treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);

            if (dicIndicesRN[versao].Contains("PercentualTotalNegociacoesMediaNDias"))
                treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);

            if (dicIndicesRN[versao].Contains("PercentualTotalNegociacoes"))
                treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);

            if (dicIndicesRN[versao].Contains("PercentualCrescimentoDolar"))
                treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);

            if (dicIndicesRN[versao].Contains("PercentualCrescimentoValorAtivoMediaNDias"))
                treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);

            if (dicIndicesRN[versao].Contains("PercentualDesviosPadroesEmRelacaoNDias"))
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);

            if (dicIndicesRN[versao].Contains("DiaSemana"))
                treinamento.Input.Add(dadoBE.DiaSemana);

            if (dicIndicesRN[versao].Contains("PercentualValorAtivo_Max_Min_Med"))
                treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);

            if (dicIndicesRN[versao].Contains("PercentualCrescimentoAtivoEm2Indices"))
                dadoBE.PercentualCrescimentoAtivoEm2Indices.ForEach(val => treinamento.Input.Add(val));

            if (dicIndicesRN[versao].Contains("ValoresAtivoSemanaPassada"))
            {
                treinamento.Input.Add(dadoBE.ValorAtivoDMenos7);
                treinamento.Input.Add(dadoBE.ValorAtivoDMenos8);
            }

            if (dicIndicesRN[versao].Contains("ValoresAtivoSemanaPassada_PERCENTUAL"))
                treinamento.Input.Add(dadoBE.PercentualAtivoSemanaPassadaD_7_D_8);

            if (dicIndicesRN[versao].Contains("ValoresAtivoMesPassado"))
            {
                treinamento.Input.Add(dadoBE.ValorAtivoDMenos30);
                treinamento.Input.Add(dadoBE.ValorAtivoDMenos31);
            }

            if (dicIndicesRN[versao].Contains("ValoresAtivoMesPassado_PERCENTUAL"))
                treinamento.Input.Add(dadoBE.PercentualAtivoMesPassadoD_30_D_31);

            treinamento.Output = new List<double>() { dadoBE.ValorNormalizadoDiaSeguinte };

            return treinamento;
        }
        public static List<Treinamento> SelecionarTreinamentos(List<double> dados, int janelaEntrada, int janelaSaida, int n)
        {
            if (n <= 0)
                n = 1;

            List<Treinamento> treinamentos = new List<Treinamento>();
            for (int divisao = 0; divisao < numeroDivisoesCrossValidation; divisao++)
            {
                for (int i = dados.Count / numeroDivisoesCrossValidation * divisao; i < dados.Count / numeroDivisoesCrossValidation * (divisao + 1); i += n)
                {
                    Treinamento treinamento = new Treinamento();
                    treinamento.DivisaoCrossValidation = divisao;
                    treinamento.Input = dados.Skip(i).Take(janelaEntrada).ToList();
                    treinamento.Output = dados.Skip(i + janelaEntrada).Take(janelaSaida).ToList();
                    treinamentos.Add(treinamento);
                }
            }

            //Pode não haver dados suficientes para terminar de preencher o output, gerando um output com menos dados do que o solicitado
            return treinamentos.Where(trein => trein.Output.Count == janelaSaida).ToList();
        }
        public static Treinamento TransformarDadoBE_Em_Treinamento_RNV3(DadosBE dadoBE, double versao)
        {
            Treinamento treinamento = new Treinamento();
            treinamento.Input = new List<double>();

            //Adiciona cada um dos percentuais dos n dias anteriores e do dia da cotação
            dadoBE.PercentualCrescimentoValorAtivo.ForEach(percent => treinamento.Input.Add(percent));
            treinamento.Input.Add(dadoBE.ValorNormalizado);
            if (versao == 3)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                treinamento.Input.Add(dadoBE.DiaSemana);
                treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.2)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                //treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                //treinamento.Input.Add(dadoBE.DiaSemana);
                treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.3)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                ////treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.4)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                ////treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.5)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                //treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.6)
            {//Apenas tiramos o ValorBollinger para ver se houve alguma diferença
                //treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                //treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.7)
            {//Com todos os índices possíveis para previsao em cima de previsao, mas agora com 2 percentuais em relação aos dias anteriores ao invés de 4
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                //treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.8)
            {//Com todos os índices possíveis para previsao em cima de previsao, mas agora com 10 percentuais em relação aos dias anteriores ao invés de 4
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                //treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 3.9)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                //treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 4.01)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                //treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 4.02)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                treinamento.Input.Add(dadoBE.DiaSemana);
                //treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 4.03)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                ////treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
            }
            if (versao == 4.04)
            {
                treinamento.Input.Add(dadoBE.ValorBollinger);
                ////treinamento.Input.Add(dadoBE.Pontuacao3MediasMoveis);
                ////treinamento.Input.Add(dadoBE.PercentualTotalNegociacoesMediaNDias);
                //treinamento.Input.Add(dadoBE.PercentualTotalNegociacoes);
                //treinamento.Input.Add(dadoBE.PercentualCrescimentoDolar);
                ////treinamento.Input.Add(dadoBE.PercentualCrescimentoValorAtivoMediaNDias);
                treinamento.Input.Add(dadoBE.PercentualDesviosPadroesEmRelacaoNDias);
                ////treinamento.Input.Add(dadoBE.DiaSemana);
                treinamento.Input.Add(dadoBE.PercentualValorAtivo_Max_Min_Med);
                treinamento.Input.Add(1);//Valor Bias
            }

            treinamento.Output = new List<double>() { dadoBE.ValorNormalizadoDiaSeguinte };

            return treinamento;
        }