ANEXOS A Módulo de Clase Public Class Solucion 'Estructura de la Cartera o Portafolio Public Structure Cartera Dim Nombres() As String Dim Porcentaje() As Double Dim VecRend() As Double Dim MatCov(,) As Double Dim Rendimiento As Double Dim Variacion As Double Dim DesvEst As Double Dim Penalizacion As Double 'Dim Suma As Double End Structure 'Caracteristicas de la Cartera Ingresadas por Usuario Public Shared Nombres() As String 'Nombres de los Activos de la Cartera Public Shared vectorRend() As Double 'Vector de Rendimientos Public Shared matrizCov(,) As Double 'Matriz de Covarianzas o Variaciones de TODOS LOS ACTIVOS Public Shared nreng, ncolu, nTotAct As Integer 'Renglones y columnas y Total de Activos Public Shared RendEsp, RendEspMax As Double 'Rendimiento Esperado de la Cartera Public Shared Iteraciones As Integer 'Numero de Iteraciones que hará el algoritmo (genético) Public Shared selElitista, selRuleta, selMetodo As Integer 'Metodo para saber el número de seleccionados por cada método Public Shared ccACT, ccCAR As Single 'Modificando Los activos: frecuencia de cambio por activo y por cartera, frecuencia de mutacion de un activo donde muta uno al azar y los demas se ajustan Public Shared fcACT, fcCAR, fmActivo As Single 'Sin modificar Los activos: frecuencia de cambio por activo y por cartera, frecuencia de mutacion de un activo donde muta uno al azar y los demas se ajustan Public Shared xmin, xmax As Single 'Para limite inferior y superior del activo i: xmin y xmax se incluyeron en el metodo de penalización Public Shared Bmin, Smin As Single 'Para Combra (buy) y venta(sale) minima: se reflejan en los metodos mutacion para los mismos activos Public Shared seleccionSolInicio As Integer 'selecciona el tipo de solucion de inicio (aleatorio o ingresando por el usuario) Public Shared P00, P01, P02, P000, P001, P002, P010, P011, P012, P020, P021, P022 As Double 'Probabilidades del Árbol de Escenarios Public Shared R0, R00, R01, R02, R000, R001, R002, R010, R011, R012, R020, R021, R022 As Double 'Rendimientos del Árbol de Esceanrios 119 'Variables del Proyecto Public Shared vecesQueAbre, vecesQueAbreAE, cuentaParaSalir, cuentaErrores As Integer Public Shared iniIngresa As Boolean 'Escoger si escojo una Solucion Inicial a Ingresar o Predeterminada Public Shared recadoErr As Boolean 'recado si es que el rendimiento del escenario no esta en el rango deseado Public Shared sumaRecadoErr As Integer 'cuenta el nuero de veces que no se llego al rendimiento esperado para cada escenario Public Shared todoElModelo As Boolean = False ' nos avisa durante el programa si queremos el resultado de todo el modelo o imprimimos otra cosa. Private Xaux() As Cartera Public Shared limCuentaParaSalir As Integer = 10000 'para salir si n llega al rendimiento Public Shared Xi(), Xn(), Xmodelo As Cartera Public Shared X0(), X00(), X01(), X02(), X000(), X001(), X002(), X010(), X011(), X012(), X020(), X021(), X022() As Cartera Public Shared XResultados() As Cartera 'Un vector con el mejor resultado de cada escenario Public Shared nombresXResultados() As String Public Shared Escenarios As Boolean = False Public Shared CierraResultadoEscenarios As Boolean = False Public Shared DeNuezPredeterminada As Boolean = True Public Shared CuentaEscenarios As Integer Public Shared RendTotalModelo(), VarTotalModelo() As Double Public Shared noRepitoActivo() As Integer 'Aplico escenarios a principal Sub EscenariosCarteraPredeterminada() recadoErr = False sumaRecadoErr = 0 For CuentaEscenarios = 0 To 12 '({1 escenario en t0} + {3 escenario en t1} + {9 escenario en t2} - 1) Principal() LlenoCarterasT1y2() 'Lleno las carteras del tiempo 0, 1 y 2 Beep() Next frmMain.BarraProgreso.Visible = False Dim res As New frmResultadosEscenarios res.ShowDialog() End Sub 'Obtengo el resultado de todo el modelo Public Shared Sub todoModelo() Dim s As Integer ReDim RendTotalModelo(nreng - 1) ReDim VarTotalModelo(nreng - 1) For s = 0 To nreng - 1 120 RendTotalModelo(s) = P00 * (P000 * X000(s).Rendimiento + P001 * X001(s).Rendimiento + P002 * X002(s).Rendimiento) RendTotalModelo(s) += P01 * (P010 * X010(s).Rendimiento + P011 * X011(s).Rendimiento + P012 * X012(s).Rendimiento) RendTotalModelo(s) += P02 * (P020 * X020(s).Rendimiento + P021 * X021(s).Rendimiento + P022 * X022(s).Rendimiento) VarTotalModelo(s) = P00 * (P000 * (X000(s).Rendimiento ^ 2) + P001 * (X001(s).Rendimiento ^ 2) + P002 * (X002(s).Rendimiento ^ 2)) VarTotalModelo(s) += P01 * (P010 * (X010(s).Rendimiento ^ 2) + P011 * (X011(s).Rendimiento ^ 2) + P012 * (X012(s).Rendimiento ^ 2)) VarTotalModelo(s) += P02 * (P020 * (X020(s).Rendimiento ^ 2) + P021 * (X021(s).Rendimiento ^ 2) + P022 * (X022(s).Rendimiento ^ 2)) VarTotalModelo(s) -= (RendTotalModelo(s) ^ 2) Next If recadoErr = True Then MsgBox("No se mostrará el Rendimiento ni la Varianza del Modelo debido" & Chr(13) _ & " a que en " & sumaRecadoErr & " escenarios no se logró el rendimiento esperado. " & Chr(13) _ & " Se mostrarán los resultados a continuación.", MsgBoxStyle.Critical, "CUIDADO") Dim respuesta As New frmResultados respuesta.ShowDialog() End If If recadoErr = False Then Dim respuesta As New frmResultados respuesta.ShowDialog() End If End Sub 'Public Sub principal() Sub Principal() Dim i, k As Integer 'Índices o Contadores Randomize() cuentaErrores=0 If ((Escenarios = False) Or ((Escenarios = True) And (CuentaEscenarios = 0))) Then If ((Escenarios = True) And (CuentaEscenarios = 0)) Then Dim ae As New frmArbolEscenarios ae.ShowDialog() End If 'construye y manda a llamar para llenar las variables de numero de renglones y numero de columnas de la solucion Dim ryc As New frmParametros ryc.ShowDialog() 'redefine cartera de solucion, vector y matriz de ingreso de parametros redefinir() 121 'lleno Rendimientos y Variaciones dependiendo del Ingreso Inicial If iniIngresa = True Then Dim ver As New frmIngresoRR ver.ShowDialog() Else inicialPredeterminado() End If Else For i = 0 To nreng - 1 Xi(i).Rendimiento = 0 Xn(i).Rendimiento = 0 Xaux(i).Rendimiento = 0 Xi(i).Variacion = 0 Xn(i).Variacion = 0 Xaux(i).Variacion = 0 Next End If If ((Escenarios = True) And (CuentaEscenarios > 0)) Then ReDim Xn(nreng - 1) 'ReDim Xaux(nreng - 1) For i = 0 To nreng - 1 ReDim Xn(i).Porcentaje(ncolu - 1) ReDim Xn(i).Nombres(ncolu - 1) ReDim Xn(i).VecRend(ncolu - 1) ReDim Xn(i).MatCov(ncolu - 1, ncolu - 1) 'ReDim Xaux(i).Porcentaje(ncolu - 1) Next cambiarendimientosesperados() End If 'lleno la poblacion inicial de carteras de inversion de manera aleatoria For x As Integer = 0 To nreng - 1 LlenaCartera(x) 'lleno una cartera de inversion Next 'Subrutina que hace la nueva cartera a partir de la inicial nuevaPoblacion() If Iteraciones = 0 Then penalizaITERACION_CERO() 'Subrutina comunmente llamado burbuja: ordenamos el RIESGO en Cartera Inicial ordena() For k = 0 To Iteraciones - 1 'se ve lo que es la barra de progreso... barraprogresoBueno(k) seleccionNP() 'Seleccion para la nueva población de carteras 122 'CAMBIOS DE LOS ACTIVOS Q PARTICIPAN EN LA CARTERA POR OTROS cambiodeActivosPorOtroActivo() cambiodeTotaldeActivos() 'CAMBIOS ALTERARANDO UNICAMENTE A LOS ACTIVOS Q PARTICIPAN EN LA CARTERA 'NOTA: los 3 metodos siguientes se utilizan en la poblacion excepto en los selecc. por elitismo cambioCartera() 'Cambia una cartera de Pob.auxiliar por otra nueva con los mismos activos cambioActivo() 'Cambia un activo por otro en caso de la frecuencia de cambio, pero de la misma lista de activos q se tenia mutacion() 'mutacion de un activo donde muta uno al azar y los demas se ajustan 'metodos para obtener resultados en cada corrida penaliza() nuevaPoblacion2() 'Convierte la poblacion auxiliar a la nueva poblacion ordena() 'Ordena la nueva poblacion Next If (Escenarios = False) Then If cuentaErrores > 0 Then MsgBox("Se tuvieron " & cuentaErrores & " número de errores", , cuentaErrores & " VECES NO LLEGO AL RENDIMIENTO ESPERADO EN ALGUNO DE LOS PASOS PARA LA CREACION DE ALGUNA CARTERA") End If Solucion.todoElModelo = False frmMain.BarraProgreso.Visible = False Dim res As New frmResultados res.ShowDialog() Else 'si es cartera me muestar el resultado, si es escenario entonces resultados se imprimiran de otro userform paraImprimir() End If End Sub Sub barraprogresoBueno(ByVal k As Integer) If (Escenarios = False) Or ((Escenarios = True) And (CuentaEscenarios = 0)) Then frmMain.BarraProgreso.Visible = True End If If (Escenarios = True) Then If CuentaEscenarios = 0 Then frmMain.BarraProgreso.Visible = True End If frmMain.BarraProgreso.Value = (100 * CuentaEscenarios / 13) + ((100 * k) / (13 * (Iteraciones - 1))) frmMain.BarraProgreso.Show() Else 123 frmMain.BarraProgreso.Value = 100 * (k / (Iteraciones - 1)) frmMain.BarraProgreso.Show() End If End Sub Private Sub paraImprimir() Dim i As Integer If CuentaEscenarios = 0 Then nombresXResultados(CuentaEscenarios) = "0 : " Else If CuentaEscenarios <= 3 Then nombresXResultados(CuentaEscenarios) = "0" & CuentaEscenarios - 1 & " :" Else If CuentaEscenarios <= 6 Then nombresXResultados(CuentaEscenarios) = "00" & CuentaEscenarios - 4 & ":" Else If CuentaEscenarios <= 9 Then nombresXResultados(CuentaEscenarios) = "01" & CuentaEscenarios - 7 &":" Else If CuentaEscenarios <= 12 Then nombresXResultados(CuentaEscenarios) = "02" & CuentaEscenarios - 10 & " : " End If End If End If End If End If For i = 0 To ncolu - 1 XResultados(CuentaEscenarios).Porcentaje(i) = Xn(0).Porcentaje(i) XResultados(CuentaEscenarios).Nombres(i) = Xn(0).Nombres(i) Next XResultados(CuentaEscenarios).Rendimiento = Xn(0).Rendimiento If ((Xn(0).Rendimiento < RendEsp) Or (Xn(0).Rendimiento > RendEspMax)) Then sumaRecadoErr += 1 recadoErr = True End If XResultados(CuentaEscenarios).Variacion = Xn(0).Variacion XResultados(CuentaEscenarios).DesvEst = Xn(0).DesvEst 'striVe &= "DE " & Xn(0).DesvEst & " " & Chr(13) End Sub Public Sub redefinir() Dim i As Integer ReDim Xi(nreng - 1) ReDim Xn(nreng - 1) ReDim Xaux(nreng - 1) 124 ReDim noRepitoActivo(ncolu - 1) For i = 0 To nreng - 1 ReDim Xi(i).Nombres(ncolu - 1) ReDim Xn(i).Nombres(ncolu - 1) ReDim Xaux(i).Nombres(ncolu - 1) ReDim Xi(i).Porcentaje(ncolu - 1) ReDim Xn(i).Porcentaje(ncolu - 1) ReDim Xaux(i).Porcentaje(ncolu - 1) ReDim Xi(i).VecRend(ncolu - 1) ReDim Xn(i).VecRend(ncolu - 1) ReDim Xaux(i).VecRend(ncolu - 1) ReDim Xi(i).MatCov(ncolu - 1, ncolu - 1) ReDim Xn(i).MatCov(ncolu - 1, ncolu - 1) ReDim Xaux(i).MatCov(ncolu - 1, ncolu - 1) Next ReDim Nombres(nTotAct - 1) ReDim vectorRend(nTotAct - 1) ReDim matrizCov(nTotAct - 1, nTotAct - 1) ReDim X0(nreng - 1) ReDim X00(nreng - 1) ReDim X01(nreng - 1) ReDim X02(nreng - 1) ReDim X000(nreng - 1) ReDim X001(nreng - 1) ReDim X002(nreng - 1) ReDim X010(nreng - 1) ReDim X011(nreng - 1) ReDim X012(nreng - 1) ReDim X020(nreng - 1) ReDim X021(nreng - 1) ReDim X022(nreng - 1) For i = 0 To nreng - 1 ReDim X0(i).Nombres(ncolu - 1) ReDim X00(i).Nombres(ncolu - 1) ReDim X01(i).Nombres(ncolu - 1) ReDim X02(i).Nombres(ncolu - 1) ReDim X000(i).Nombres(ncolu - 1) ReDim X001(i).Nombres(ncolu - 1) ReDim X002(i).Nombres(ncolu - 1) ReDim X010(i).Nombres(ncolu - 1) ReDim X011(i).Nombres(ncolu - 1) ReDim X012(i).Nombres(ncolu - 1) ReDim X020(i).Nombres(ncolu - 1) ReDim X021(i).Nombres(ncolu - 1) ReDim X022(i).Nombres(ncolu - 1) 125 ReDim X0(i).Porcentaje(ncolu - 1) ReDim X00(i).Porcentaje(ncolu - 1) ReDim X01(i).Porcentaje(ncolu - 1) ReDim X02(i).Porcentaje(ncolu - 1) ReDim X000(i).Porcentaje(ncolu - 1) ReDim X001(i).Porcentaje(ncolu - 1) ReDim X002(i).Porcentaje(ncolu - 1) ReDim X010(i).Porcentaje(ncolu - 1) ReDim X011(i).Porcentaje(ncolu - 1) ReDim X012(i).Porcentaje(ncolu - 1) ReDim X020(i).Porcentaje(ncolu - 1) ReDim X021(i).Porcentaje(ncolu - 1) ReDim X022(i).Porcentaje(ncolu - 1) ReDim X0(i).VecRend(ncolu - 1) ReDim X00(i).VecRend(ncolu - 1) ReDim X01(i).VecRend(ncolu - 1) ReDim X02(i).VecRend(ncolu - 1) ReDim X000(i).VecRend(ncolu - 1) ReDim X001(i).VecRend(ncolu - 1) ReDim X002(i).VecRend(ncolu - 1) ReDim X010(i).VecRend(ncolu - 1) ReDim X011(i).VecRend(ncolu - 1) ReDim X012(i).VecRend(ncolu - 1) ReDim X020(i).VecRend(ncolu - 1) ReDim X021(i).VecRend(ncolu - 1) ReDim X022(i).VecRend(ncolu - 1) ReDim X0(i).MatCov(ncolu - 1, ncolu - 1) ReDim X00(i).MatCov(ncolu - 1, ncolu - 1) ReDim X01(i).MatCov(ncolu - 1, ncolu - 1) ReDim X02(i).MatCov(ncolu - 1, ncolu - 1) ReDim X000(i).MatCov(ncolu - 1, ncolu - 1) ReDim X001(i).MatCov(ncolu - 1, ncolu - 1) ReDim X002(i).MatCov(ncolu - 1, ncolu - 1) ReDim X010(i).MatCov(ncolu - 1, ncolu - 1) ReDim X011(i).MatCov(ncolu - 1, ncolu - 1) ReDim X012(i).MatCov(ncolu - 1, ncolu - 1) ReDim X020(i).MatCov(ncolu - 1, ncolu - 1) ReDim X021(i).MatCov(ncolu - 1, ncolu - 1) ReDim X022(i).MatCov(ncolu - 1, ncolu - 1) Next ReDim XResultados(13 - 1) ReDim nombresXResultados(13 - 1) For i = 0 To XResultados.Length - 1 ReDim XResultados(i).Nombres(ncolu - 1) ReDim XResultados(i).Porcentaje(ncolu - 1) ReDim XResultados(i).VecRend(ncolu - 1) ReDim XResultados(i).MatCov(ncolu - 1, ncolu - 1) 126 Next End Sub Public Sub cambiodeActivosPorOtroActivo() 'LO Q HAY Q HACER ES: SACAR A UN ACTIVO DE LA CARTERA Y METER OTRO Q NO ESTE ADENTRO. Randomize() Dim i, j, ii As Integer Dim aleN2(), aleN2aux(), escojeAlea(), siguiente, cuenta As Integer Dim aleatorio, sacoAleatoriamente, aux As Integer Dim suma As Double = 0 Dim ran As Single If nTotAct > ncolu Then For i = selElitista To nreng - 1 cuentaParaSalir = 0 ran = Rnd() If ran < ccACT Then Do ReDim aleN2aux(nTotAct - 1) ReDim escojeAlea(ncolu - 1) siguiente = 0 cuenta = 0 For ii = 0 To nTotAct - 1 aleN2aux(ii) = ii Next For ii = 0 To nTotAct - 1 For j = 0 To ncolu - 1 If Nombres(ii) = Xaux(i).Nombres(j) Then aleN2aux(ii) = -1 escojeAlea(cuenta) = ii cuenta += 1 Else If aleN2aux(ii) = -1 Then ii += 1 j=0 End If End If Next Next ReDim aleN2(nTotAct - ncolu - 1) For ii = 0 To nTotAct - 1 If aleN2aux(ii) <> -1 Then aleN2(siguiente) = aleN2aux(ii) siguiente += 1 End If Next 127 aleatorio = Int(Rnd() * aleN2.Length) sacoAleatoriamente = Int(Rnd() * ncolu) escojeAlea(sacoAleatoriamente) = aleN2(aleatorio) 'ordeno For ii = 1 To ncolu - 1 For j = 0 To ncolu - 2 If escojeAlea(j + 1) < escojeAlea(j) Then aux = escojeAlea(j) escojeAlea(j) = escojeAlea(j + 1) escojeAlea(j + 1) = aux End If Next Next 'lo pongo en forma del texto For ii = 0 To ncolu - 1 Xaux(i).Nombres(ii) = Nombres(escojeAlea(ii)) Xaux(i).VecRend(ii) = vectorRend(escojeAlea(ii)) For j = 0 To ncolu - 1 Xaux(i).MatCov(ii, j) = matrizCov(escojeAlea(ii), escojeAlea(j)) Next Next 'Vector aleatorios - creo aleatorios para cada uno de los activos For ii = 0 To ncolu - 1 Xaux(i).Porcentaje(ii) = Rnd() * Rnd() suma += Xaux(i).Porcentaje(ii) Next For ii = 0 To ncolu - 1 Xaux(i).Porcentaje(ii) /= suma Next 'Rendimiento esperado de la cartera o portafolio Xaux(i).Rendimiento = 0 For ii = 0 To ncolu - 1 Xaux(i).Rendimiento += (Xaux(i).VecRend(ii) * Xaux(i).Porcentaje(ii)) Next cuentaParaSalir += 1 Loop Until (((Xaux(i).Rendimiento >= RendEsp) And (Xaux(i).Rendimiento <= RendEspMax)) Or (cuentaParaSalir = limCuentaParaSalir)) If cuentaParaSalir = limCuentaParaSalir Then cuentaErrores += 1 128 Xaux(i).Penalizacion += 0.5 'Le sumo una vario con grande para sacarlo de la poblacion optima End If For j = 0 To ncolu - 1 For ii = 0 To ncolu - 1 Xaux(i).Variacion += (Xaux(i).MatCov(ii, j) * Xaux(i).Porcentaje(ii) * Xaux(i).Porcentaje(j)) Next Xaux(i).DesvEst = (Xaux(i).Variacion) ^ 0.5 Next End If Next End If End Sub Public Sub cambiodeTotaldeActivos() Randomize() Dim i, j, k, ii As Integer Dim aleN2(), aleN2aux(), escojeAlea(), siguiente, cuenta As Integer Dim aleatorio, aux As Integer Dim suma As Double = 0 If nTotAct > ncolu Then For i = selElitista To nreng - 1 cuentaParaSalir = 0 If Rnd() < ccCAR Then Do ReDim aleN2aux(nTotAct - 1) ReDim escojeAlea(ncolu - 1) siguiente = 0 cuenta = 0 For ii = 0 To nTotAct - 1 aleN2aux(ii) = ii Next For ii = 0 To ncolu - 1 ReDim aleN2(nTotAct - 1 - ii) k=0 For j = 0 To nTotAct - 1 If aleN2aux(j) <> -1 Then aleN2(k) = aleN2aux(j) k += 1 End If Next aleatorio = Int(Rnd() * aleN2.Length) escojeAlea(ii) = aleN2(aleatorio) aleN2aux(aleN2(aleatorio)) = -1 Next 129 'ordeno For ii = 1 To ncolu - 1 For j = 0 To ncolu - 2 If escojeAlea(j + 1) < escojeAlea(j) Then aux = escojeAlea(j) escojeAlea(j) = escojeAlea(j + 1) escojeAlea(j + 1) = aux End If Next Next 'lo pongo en forma del texto For ii = 0 To ncolu - 1 Xaux(i).Nombres(ii) = Nombres(escojeAlea(ii)) Xaux(i).VecRend(ii) = vectorRend(escojeAlea(ii)) For j = 0 To ncolu - 1 Xaux(i).MatCov(ii, j) = matrizCov(escojeAlea(ii), escojeAlea(j)) Next Next 'Vector aleatorios - creo aleatorios para cada uno de los activos For ii = 0 To ncolu - 1 Xaux(i).Porcentaje(ii) = Rnd() * Rnd() suma += Xaux(i).Porcentaje(ii) Next For ii = 0 To ncolu - 1 Xaux(i).Porcentaje(ii) /= suma Next 'Rendimiento esperado de la cartera o portafolio Xaux(i).Rendimiento = 0 For ii = 0 To ncolu - 1 Xaux(i).Rendimiento += (Xaux(i).VecRend(ii) * Xaux(i).Porcentaje(ii)) Next cuentaParaSalir += 1 Loop Until (((Xaux(i).Rendimiento >= RendEsp) And (Xaux(i).Rendimiento <= RendEspMax)) Or (cuentaParaSalir = limCuentaParaSalir)) If cuentaParaSalir = limCuentaParaSalir Then cuentaErrores += 1 Xaux(i).Penalizacion += 0.5 'Le sumo una vario con grande para sacarlo de la poblacion optima End If For j = 0 To ncolu - 1 For ii = 0 To ncolu - 1 130 Xaux(i).Variacion += (Xaux(i).MatCov(ii, j) * Xaux(i).Porcentaje(ii) * Xaux(i).Porcentaje(j)) Next Xaux(i).DesvEst = (Xaux(i).Variacion) ^ 0.5 Next End If Next End If End Sub Public Sub mutacion() Randomize() Dim i, j As Integer 'Índices o Contadores Dim aleatorio, ki As Integer Dim sum, sumR, mmul As Double Dim auxAux() As Double Dim suma As Double For i = selElitista To nreng - 1 ' para que sea igual al 100% suma = 0 For j = 0 To ncolu - 1 suma += Xaux(i).Porcentaje(j) Next For j = 0 To ncolu - 1 Xaux(i).Porcentaje(j) /= suma Next If Rnd() < fmActivo Then cuentaParaSalir = 0 Do ReDim auxAux(ncolu - 1) For j = 0 To ncolu - 1 auxAux(j) = Xaux(i).Porcentaje(j) Next sum = 0 sumR = 0 aleatorio = CInt(Rnd() * (ncolu - 1)) sum = 1 - auxAux(aleatorio) mmul = Rnd() * 0.025 If Rnd() > 0.5 Then If auxAux(aleatorio) + (mmul) < 1 Then auxAux(aleatorio) += (mmul + Bmin) Else auxAux(aleatorio) = 1 End If Else If auxAux(aleatorio) - (mmul) > 0 Then auxAux(aleatorio) -= (mmul + Smin) Else 131 auxAux(aleatorio) = 0 End If End If For j = 0 To ncolu - 1 If j <> aleatorio Then auxAux(j) *= (1 - auxAux(aleatorio)) / sum End If Next For j = 0 To ncolu - 1 sumR += (Xaux(i).VecRend(j) * auxAux(j)) Next cuentaParaSalir += 1 Loop Until (((sumR >= RendEsp) And (sumR <= RendEspMax)) Or (cuentaParaSalir = limCuentaParaSalir)) If cuentaParaSalir = limCuentaParaSalir Then cuentaErrores += 1 Xaux(i).Penalizacion += 0.5 'Le sumo una vario con grande para sacarlo de la poblacion optima Else For j = 0 To ncolu - 1 For ki = 0 To ncolu - 1 Xaux(i).Variacion = 0 Next Next For j = 0 To ncolu - 1 Xaux(i).Porcentaje(j) = auxAux(j) Next obtenerRendyVar() End If End If Next End Sub Public Sub cambioCartera() Randomize() Dim i, j As Integer 'Índices o Contadores Dim Suma As Double If fcCAR > 0 Then For i = selElitista To nreng - 1 cuentaParaSalir = 0 Do Suma = 0 If Rnd() < fcCAR Then Xaux(i).Rendimiento = 0 Xaux(i).Variacion = 0 For j = 0 To ncolu - 1 Xaux(i).Porcentaje(j) = Rnd() Suma += Xaux(i).Porcentaje(j) Next 132 For j = 0 To ncolu - 1 Xaux(i).Porcentaje(j) /= Suma Next obtenerRendyVar() End If cuentaParaSalir += 1 Loop Until (((Xaux(i).Rendimiento >= RendEsp) And (Xaux(i).Rendimiento <= RendEspMax)) Or (cuentaParaSalir = limCuentaParaSalir)) If cuentaParaSalir = limCuentaParaSalir Then cuentaErrores += 1 Xaux(i).Penalizacion += 0.5 'Le sumo una vario con grande para sacarlo de la poblacion optima End If Next End If End Sub Public Sub cambioActivo() Randomize() Dim i, j As Integer 'Índices o Contadores Dim aleatorio As Integer Dim auxW, suma As Double Dim ban As Boolean = False If fcACT <> 0 Then For i = selElitista To nreng - 1 cuentaParaSalir = 0 Do suma = 0 For j = 0 To ncolu - 1 If Rnd() < fcACT Then Xaux(i).Rendimiento = 0 Xaux(i).Variacion = 0 Do aleatorio = CInt(Rnd() * (ncolu - 1)) Loop Until (aleatorio <> j) auxW = Xaux(i).Porcentaje(j) Xaux(i).Porcentaje(j) = Xaux(i).Porcentaje(aleatorio) Xaux(i).Porcentaje(aleatorio) = auxW End If Next For j = 0 To ncolu - 1 ' para que sea igual al 100% suma += Xaux(i).Porcentaje(j) Next For j = 0 To ncolu - 1 Xaux(i).Porcentaje(j) /= suma Next obtenerRendyVar() cuentaParaSalir += 1 Loop Until (((Xaux(i).Rendimiento >= RendEsp) And (Xaux(i).Rendimiento <= RendEspMax)) Or (cuentaParaSalir = limCuentaParaSalir)) 133 If cuentaParaSalir = limCuentaParaSalir Then cuentaErrores += 1 Xaux(i).Penalizacion += 0.5 'Le sumo una vario con grande para sacarlo de la poblacion optima End If Next End If End Sub Public Sub seleccionNP() Randomize() Dim i, j As Integer 'Índices o Contadores Dim wAux(ncolu - 1) As Double Dim wEsco As Double Dim escojo, m As Integer 'lleno la una parte de la cartera auxiliar de forma ELITISTA For i = 0 To selElitista - 1 For j = 0 To ncolu - 1 Xaux(i).Porcentaje(j) = Xn(i).Porcentaje(j) Xaux(i).Nombres(j) = Xn(i).Nombres(j) Xaux(i).VecRend(j) = Xn(i).VecRend(j) For m = 0 To ncolu - 1 Xaux(i).MatCov(j, m) = Xn(i).MatCov(j, m) Next Next Xaux(i).Penalizacion = Xn(i).Penalizacion Next 'lleno una parte de la cartera auxiliar por SELECCION DE RULETA For i = 0 To ncolu - 1 If i = 0 Then wAux(i) = (ncolu - i) / ((ncolu * (ncolu + 1)) / 2) Else wAux(i) = wAux(i - 1) + ((ncolu - i) / ((ncolu * (ncolu + 1)) / 2)) End If Next For i = selElitista To selElitista + selRuleta - 1 wEsco = Rnd() escojo = 0 For j = 0 To ncolu - 1 If wEsco > wAux(j) Then escojo = j End If Next For j = 0 To ncolu - 1 Xaux(i).Porcentaje(j) = Xn(escojo).Porcentaje(j) Xaux(i).Nombres(j) = Xn(escojo).Nombres(j) Xaux(i).VecRend(j) = Xn(escojo).VecRend(j) 134 For m = 0 To ncolu - 1 Xaux(i).MatCov(j, m) = Xn(escojo).MatCov(j, m) Next Next Xaux(i).Penalizacion = Xn(escojo).Penalizacion Next 'cuentaParaSalir = 0 ' Do 'cuentaParaSalir += 1 ' Loop Until (((Xaux(i).Rendimiento >= RendEsp) And (Xaux(i).Rendimiento <= RendEspMax)) Or (cuentaParaSalir = limCuentaParaSalir)) 'If cuentaParaSalir = limCuentaParaSalir Then ' cuentaErrores += 1 ' Xaux(i).Penalizacion += 0.5 'Le sumo una vario con grande para sacarlo de la poblacion optima 'End If 'NO NOS VA A SERVIR PARA MODELO FINAL POR LO Q DIJO RUBÉN L. HARO 'lleno la ultima parte de la cartera auxiliar por seleccion de OTRO METODO mencionado en Cap.3 If nTotAct = ncolu Then Dim selNo As Integer = selElitista + selRuleta Dim ii, ji, ki As Integer 'Dim cuantosReng(nreng - selNo) As Integer Dim alea As Integer Dim suma As Double 'inicio porcentajes en cero de todas las carteras For ii = selNo To nreng - 1 For ki = 0 To ncolu - 1 Xaux(ii).Porcentaje(ki) = 0 Next Next 'lleno los porcentajes For ii = selNo To nreng - 1 'cuantosReng(ii - selNo) = CInt((nreng - 1) * Rnd() * 0.5) 'a lo mucho metere 50% de las carteras para hacer el promedio suma = 0 For ji = 0 To CInt((nreng - 1) * Rnd() * 0.75) alea = CInt((nreng - 1) * Rnd()) For ki = 0 To ncolu - 1 Xaux(ii).Porcentaje(ki) += Xn(alea).Porcentaje(ki) suma += Xn(alea).Porcentaje(ki) Next Next For ki = 0 To ncolu - 1 Xaux(ii).Porcentaje(ki) /= suma Next 135 Next 'obtener rendimientos y variaciones despues de aplicra los priterios de selección obtenerRendyVar() For i = 0 To nreng - 1 If ((Xaux(i).Rendimiento < RendEsp) Or (Xaux(i).Rendimiento > RendEspMax)) Then Xaux(i).Penalizacion += 0.5 End If Next End If End Sub Public Sub nuevaPoblacion() Dim i, j, g As Integer For i = 0 To nreng - 1 For j = 0 To ncolu - 1 Xn(i).Porcentaje(j) = Xi(i).Porcentaje(j) Xn(i).Nombres(j) = Xi(i).Nombres(j) Xn(i).VecRend(j) = Xi(i).VecRend(j) For g = 0 To ncolu - 1 Xn(i).MatCov(j, g) = Xi(i).MatCov(j, g) Next Next Xn(i).Rendimiento = Xi(i).Rendimiento Xn(i).Variacion = Xi(i).Variacion Xn(i).DesvEst = Xi(i).DesvEst Xn(i).Penalizacion = Xi(i).Penalizacion Next End Sub Public Sub nuevaPoblacion2() Dim i, j, kk As Integer 'Índices o Contadores For i = 0 To nreng - 1 For j = 0 To ncolu - 1 Xn(i).Porcentaje(j) = Xaux(i).Porcentaje(j) Xn(i).Nombres(j) = Xaux(i).Nombres(j) Xn(i).VecRend(j) = Xaux(i).VecRend(j) For kk = 0 To ncolu - 1 Xn(i).MatCov(j, kk) = Xaux(i).MatCov(j, kk) Next Next Xn(i).Rendimiento = Xaux(i).Rendimiento Xn(i).Variacion = Xaux(i).Variacion Xn(i).DesvEst = Xaux(i).DesvEst Xn(i).Penalizacion = Xaux(i).Penalizacion Next End Sub Public Sub penaliza() Dim io, jo As Integer 'Restriccion que hace que si el porcentaje invertido en el activo i no esta dentro del 136 ' rango deseado entonces se penaliza con un 25% sobre la variacion por cada uno de los ' activos en que incumpla For io = 0 To nreng - 1 For jo = 0 To ncolu - 1 If ((Xaux(io).Porcentaje(jo) < xmin) Or (Xaux(io).Porcentaje(jo) > xmax)) Then Xaux(io).Variacion += 0.25 End If Next Next For io = 0 To nreng - 1 If ((Xaux(io).Rendimiento < RendEsp) Or (Xaux(io).Rendimiento > RendEspMax)) Then Xaux(io).Variacion += Xaux(io).Penalizacion End If Xaux(io).DesvEst = Xaux(io).Variacion ^ 0.5 Xaux(io).Penalizacion = 0 Xi(io).Penalizacion = 0 Xn(io).Penalizacion = 0 Next End Sub Public Sub penalizaITERACION_CERO() Dim io, jo As Integer 'Restriccion que hace que si el porcentaje invertido en el activo i no esta dentro del ' rango deseado entonces se penaliza con un 25% sobre la variacion por cada uno de los ' activos en que incumpla For io = 0 To nreng - 1 For jo = 0 To ncolu - 1 If ((Xn(io).Porcentaje(jo) < xmin) Or (Xn(io).Porcentaje(jo) > xmax)) Then Xn(io).Variacion += 0.25 End If Next Next For io = 0 To nreng - 1 If ((Xn(io).Rendimiento < RendEsp) Or (Xn(io).Rendimiento > RendEspMax)) Then Xn(io).Variacion += Xn(io).Penalizacion End If Xn(io).DesvEst = Xn(io).Variacion ^ 0.5 Xn(io).Penalizacion = 0 Next End Sub Public Sub obtenerRendyVar() Dim io, jo, ko As Integer For io = 0 To nreng - 1 Xaux(io).Rendimiento = 0 Xaux(io).Variacion = 0 137 Next For io = 0 To nreng - 1 For jo = 0 To ncolu - 1 Xaux(io).Rendimiento += (Xaux(io).VecRend(jo) * Xaux(io).Porcentaje(jo)) For ko = 0 To ncolu - 1 Xaux(io).Variacion += (Xaux(io).MatCov(ko, jo) * Xaux(io).Porcentaje(ko) * Xaux(io).Porcentaje(jo)) Next Next Next End Sub Public Sub ordena() Dim m, n As Integer Dim i, j As Integer 'Índices o Contadores Dim temporal As Double Dim tempoNom As String 'For i = 0 To nreng - 1 'For j = 0 To nreng - 2 For i = 1 To nreng - 1 For j = 0 To nreng - 2 If Xn(j).Variacion >= Xn(j + 1).Variacion Then temporal = Xn(j).Variacion Xn(j).Variacion = Xn(j + 1).Variacion Xn(j + 1).Variacion = temporal temporal = Xn(j).DesvEst Xn(j).DesvEst = Xn(j + 1).DesvEst Xn(j + 1).DesvEst = temporal temporal = Xn(j).Rendimiento Xn(j).Rendimiento = Xn(j + 1).Rendimiento Xn(j + 1).Rendimiento = temporal For m = 0 To ncolu - 1 temporal = Xn(j).Porcentaje(m) Xn(j).Porcentaje(m) = Xn(j + 1).Porcentaje(m) Xn(j + 1).Porcentaje(m) = temporal tempoNom = Xn(j).Nombres(m) Xn(j).Nombres(m) = Xn(j + 1).Nombres(m) Xn(j + 1).Nombres(m) = tempoNom temporal = Xn(j).VecRend(m) Xn(j).VecRend(m) = Xn(j + 1).VecRend(m) Xn(j + 1).VecRend(m) = temporal For n = 0 To ncolu - 1 temporal = Xn(j).MatCov(m, n) Xn(j).MatCov(m, n) = Xn(j + 1).MatCov(m, n) 138 Xn(j + 1).MatCov(m, n) = temporal Next Next End If Next Next End Sub Public Sub LlenaCartera(ByVal x As Integer) Randomize() Dim i, j As Integer 'Índices o Contadores cuentaParaSalir = 0 Do auxiliarLlenaCartera(x) cuentaParaSalir += 1 Loop Until (((Xi(x).Rendimiento >= RendEsp) And (Xi(x).Rendimiento <= RendEspMax)) Or (cuentaParaSalir = limCuentaParaSalir)) 'LIMITE INFERIOR Y SUPERIOR If cuentaParaSalir = limCuentaParaSalir Then cuentaErrores += 1 Xi(x).Penalizacion += 0.5 'Le sumo una vario con grande para sacarlo de la poblacion optima End If For j = 0 To ncolu - 1 For i = 0 To ncolu - 1 Xi(x).Variacion += (Xi(x).MatCov(i, j) * Xi(x).Porcentaje(i) * Xi(x).Porcentaje(j)) Next Xi(x).DesvEst = (Xi(x).Variacion) ^ 0.5 Next End Sub Public Sub auxiliarLlenaCartera(ByVal x As Integer) Randomize() Dim Suma As Double = 0 Dim banana As Boolean = True Dim aleN2(), aleN2aux(), escojeAlea() As Integer Dim i, j, k As Integer Dim aleatorio, aux As Integer ReDim aleN2(nTotAct - 1) ReDim aleN2aux(nTotAct - 1) ReDim escojeAlea(ncolu - 1) For i = 0 To nTotAct - 1 aleN2aux(i) = i Next For i = 0 To ncolu - 1 139 ReDim aleN2(nTotAct - 1 - i) k=0 For j = 0 To nTotAct - 1 If aleN2aux(j) <> -1 Then aleN2(k) = aleN2aux(j) k += 1 End If Next aleatorio = Int(Rnd() * aleN2.Length) escojeAlea(i) = aleN2(aleatorio) aleN2aux(aleN2(aleatorio)) = -1 Next 'ordeno For i = 1 To ncolu - 1 For j = 0 To ncolu - 2 If escojeAlea(j + 1) < escojeAlea(j) Then aux = escojeAlea(j) escojeAlea(j) = escojeAlea(j + 1) escojeAlea(j + 1) = aux End If Next Next 'lo pongo en forma del texto For i = 0 To ncolu - 1 Xi(x).Nombres(i) = Nombres(escojeAlea(i)) Xi(x).VecRend(i) = vectorRend(escojeAlea(i)) For j = 0 To ncolu - 1 Xi(x).MatCov(i, j) = matrizCov(escojeAlea(i), escojeAlea(j)) Next Next 'Vector aleatorios - creo aleatorios para cada uno de los activos For i = 0 To ncolu - 1 Xi(x).Porcentaje(i) = Rnd() * Rnd() Suma += Xi(x).Porcentaje(i) Next For i = 0 To ncolu - 1 Xi(x).Porcentaje(i) /= Suma Next 'Rendimiento esperado de la cartera o portafolio Xi(x).Rendimiento = 0 For i = 0 To ncolu - 1 Xi(x).Rendimiento += (Xi(x).VecRend(i) * Xi(x).Porcentaje(i)) Next End Sub Public Sub inicialPredeterminado() Dim ver As New frmIngresoRR With ver.spsIngresa.Sheets("Ingreso_Rendimientos") 140 .cells(1, 1) = "B5 años" .cells(1, 2) = "B10 años" .cells(1, 3) = "IPC" .cells(1, 4) = "ICN" .cells(1, 5) = "ICM" .cells(1, 6) = "ICT" .cells(1, 7) = "CEMEX" .cells(1, 8) = "UNEFON" .cells(1, 9) = "WALMEX.V" .cells(2, 1) = "21.75%" .cells(2, 2) = "18.35%" .cells(2, 3) = "15.72%" .cells(2, 4) = "18.74%" .cells(2, 5) = "12.92%" .cells(2, 6) = "16.26%" .cells(2, 7) = "12.35%" .cells(2, 8) = "-12.11%" .cells(2, 9) = "19.96%" End With With ver.spsIngresa.Sheets("Ingreso_Matriz_Covarianzas") .cells(1, 2) = "B5 años" .cells(1, 3) = "B10 años" .cells(1, 4) = "IPC" .cells(1, 5) = "ICN" .cells(1, 6) = "ICM" .cells(1, 7) = "ICT" .cells(1, 8) = "CEMEX" .cells(1, 9) = "UNEFON" .cells(1, 10) = "WALMEX.V" .cells(2, 1) = "B5 años" .cells(3, 1) = "B10 años" .cells(4, 1) = "IPC" .cells(5, 1) = "ICN" .cells(6, 1) = "ICM" .cells(7, 1) = "ICT" .cells(8, 1) = "CEMEX" .cells(9, 1) = "UNEFON" .cells(10, 1) = "WALMEX.V" .cells(2, 2) = ".012831774" .cells(2, 3) = ".005916547" .cells(2, 4) = "-.020663583" .cells(2, 5) = "-.016686564" .cells(2, 6) = "-.011005269" .cells(2, 7) = "-.0244418" .cells(2, 8) = "-.014456963" .cells(2, 9) = "-.015137884" .cells(2, 10) = ".003597833" 141 .cells(3, 2) = ".005916547" .cells(3, 3) = ".007320869" .cells(3, 4) = "-.007450093" .cells(3, 5) = "-.004671657" .cells(3, 6) = "-.003149685" .cells(3, 7) = "-.009805214" .cells(3, 8) = "-3.07126E-05" .cells(3, 9) = "-.005936188" .cells(3, 10) = ".002592824" .cells(4, 2) = "-.020663583" .cells(4, 3) = "-.007450093" .cells(4, 4) = ".069298104" .cells(4, 5) = ".07209848" .cells(4, 6) = ".047995004" .cells(4, 7) = ".076779292" .cells(4, 8) = ".068042655" .cells(4, 9) = ".024891741" .cells(4, 10) = ".022317634" .cells(5, 2) = "-.016686564" .cells(5, 3) = "-.004671657" .cells(5, 4) = ".07209848" .cells(5, 5) = ".086191654" .cells(5, 6) = ".049941969" .cells(5, 7) = ".074952889" .cells(5, 8) = ".072460074" .cells(5, 9) = ".012483203" .cells(5, 10) = ".022581556" .cells(6, 2) = "-.011005269" .cells(6, 3) = "-.003149685" .cells(6, 4) = ".047995004" .cells(6, 5) = ".049941969" .cells(6, 6) = ".035627714" .cells(6, 7) = ".053561608" .cells(6, 8) = ".051004001" .cells(6, 9) = ".01583398" .cells(6, 10) = ".023035954" .cells(7, 2) = "-.0244418" .cells(7, 3) = "-.00985214" .cells(7, 4) = ".076779292" .cells(7, 5) = ".074952889" .cells(7, 6) = ".053561608" .cells(7, 7) = ".087351107" .cells(7, 8) = ".074965373" .cells(7, 9) = ".033254771" .cells(7, 10) = ".026292038" 142 .cells(8, 2) = "-.014456963" .cells(8, 3) = "-3.07126E-05" .cells(8, 4) = ".068042655" .cells(8, 5) = ".072460074" .cells(8, 6) = ".051004001" .cells(8, 7) = ".074965373" .cells(8, 8) = ".075541326" .cells(8, 9) = ".020247925" .cells(8, 10) = ".033786739" .cells(9, 2) = "-.015137884" .cells(9, 3) = "-.005936188" .cells(9, 4) = ".024891741" .cells(9, 5) = ".012483203" .cells(9, 6) = ".01583398" .cells(9, 7) = ".033254771" .cells(9, 8) = ".020247925" .cells(9, 9) = ".020685681" .cells(9, 10) = ".003467606" .cells(10, 2) = ".003597833" .cells(10, 3) = ".002592824" .cells(10, 4) = ".022317634" .cells(10, 5) = ".022581556" .cells(10, 6) = ".023035954" .cells(10, 7) = ".026292038" .cells(10, 8) = ".033786739" .cells(10, 9) = ".003467606" .cells(10, 10) = ".025076281" End With ver.ShowDialog() End Sub Public Sub LlenoCarterasT1y2() Dim im, jm, km As Integer Select Case CuentaEscenarios Case 0 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X0(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X0(im).Nombres(jm) = Xn(im).Nombres(jm) X0(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X0(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X0(im).Rendimiento = Xn(im).Rendimiento X0(im).Variacion = Xn(im).Variacion X0(im).DesvEst = Xn(im).DesvEst Next 143 Case 1 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X00(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X00(im).Nombres(jm) = Xn(im).Nombres(jm) X00(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X00(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X00(im).Rendimiento = Xn(im).Rendimiento X00(im).Variacion = Xn(im).Variacion X00(im).DesvEst = Xn(im).DesvEst Next Case 2 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X01(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X01(im).Nombres(jm) = Xn(im).Nombres(jm) X01(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X01(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X01(im).Rendimiento = Xn(im).Rendimiento X01(im).Variacion = Xn(im).Variacion X01(im).DesvEst = Xn(im).DesvEst Next Case 3 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X02(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X02(im).Nombres(jm) = Xn(im).Nombres(jm) X02(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X02(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X02(im).Rendimiento = Xn(im).Rendimiento X02(im).Variacion = Xn(im).Variacion X02(im).DesvEst = Xn(im).DesvEst Next Case 4 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X000(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X000(im).Nombres(jm) = Xn(im).Nombres(jm) X000(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 144 X000(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X000(im).Rendimiento = Xn(im).Rendimiento X000(im).Variacion = Xn(im).Variacion X000(im).DesvEst = Xn(im).DesvEst Next Case 5 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X001(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X001(im).Nombres(jm) = Xn(im).Nombres(jm) X001(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X001(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X001(im).Rendimiento = Xn(im).Rendimiento X001(im).Variacion = Xn(im).Variacion X001(im).DesvEst = Xn(im).DesvEst Next Case 6 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X002(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X002(im).Nombres(jm) = Xn(im).Nombres(jm) X002(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X002(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X002(im).Rendimiento = Xn(im).Rendimiento X002(im).Variacion = Xn(im).Variacion X002(im).DesvEst = Xn(im).DesvEst Next Case 7 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X010(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X010(im).Nombres(jm) = Xn(im).Nombres(jm) X010(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X010(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X010(im).Rendimiento = Xn(im).Rendimiento X010(im).Variacion = Xn(im).Variacion X010(im).DesvEst = Xn(im).DesvEst Next Case 8 145 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X011(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X011(im).Nombres(jm) = Xn(im).Nombres(jm) X011(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X011(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X011(im).Rendimiento = Xn(im).Rendimiento X011(im).Variacion = Xn(im).Variacion X011(im).DesvEst = Xn(im).DesvEst Next Case 9 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X012(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X012(im).Nombres(jm) = Xn(im).Nombres(jm) X012(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X012(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X012(im).Rendimiento = Xn(im).Rendimiento X012(im).Variacion = Xn(im).Variacion X012(im).DesvEst = Xn(im).DesvEst Next Case 10 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X020(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X020(im).Nombres(jm) = Xn(im).Nombres(jm) X020(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X020(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X020(im).Rendimiento = Xn(im).Rendimiento X020(im).Variacion = Xn(im).Variacion X020(im).DesvEst = Xn(im).DesvEst Next Case 11 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X021(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X021(im).Nombres(jm) = Xn(im).Nombres(jm) X021(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X021(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next 146 Next X021(im).Rendimiento = Xn(im).Rendimiento X021(im).Variacion = Xn(im).Variacion X021(im).DesvEst = Xn(im).DesvEst Next Case 12 For im = 0 To nreng - 1 For jm = 0 To ncolu - 1 X022(im).Porcentaje(jm) = Xn(im).Porcentaje(jm) X022(im).Nombres(jm) = Xn(im).Nombres(jm) X022(im).VecRend(jm) = Xn(im).VecRend(jm) For km = 0 To ncolu - 1 X022(im).MatCov(jm, km) = Xn(im).MatCov(jm, km) Next Next X022(im).Rendimiento = Xn(im).Rendimiento X022(im).Variacion = Xn(im).Variacion X022(im).DesvEst = Xn(im).DesvEst Next End Select End Sub Public Sub cambiarendimientosesperados() Dim rang As Decimal = 0.005 Select Case CuentaEscenarios Case 1 RendEsp = R00 RendEspMax = R00 + rang Case 2 RendEsp = R01 RendEspMax = R01 + rang Case 3 RendEsp = R02 RendEspMax = R02 + rang Case 4 RendEsp = R000 RendEspMax = R000 + rang Case 5 RendEsp = R001 RendEspMax = R001 + rang Case 6 RendEsp = R002 RendEspMax = R002 + rang Case 7 RendEsp = R010 RendEspMax = R010 + rang Case 8 RendEsp = R011 RendEspMax = R011 + rang Case 9 RendEsp = R012 147 RendEspMax = R012 + rang Case 10 RendEsp = R020 RendEspMax = R020 + rang Case 11 RendEsp = R021 RendEspMax = R021 + rang Case 12 RendEsp = R022 RendEspMax = R022 + rang End Select End Sub End Class 148