#!/usr/local/bin/perl

use 5.040.3;

my $DEBUG = 0;

# Cálculo de idoneidad de plazo obligaciones por simulación

my $base = 100;       # de los ingresos por periodo
my $interes = 0.1;

my $leverage;
my $deuda;            # montante porcentual que inicialmente se destina 
                      # a intereses más cupón o fondo de amortización
                      # (me quito de enmedio el tipo de emisión y amortización)
                      # Básicamente, tienen poco que ver emisiones al descuento 
                      # con las de amortiz. aleatoria o al final
                      # Todo esto no me importa porque se trata de una sim. a
                      # largo, y el .05 es trimestral, lo que da cantidad 
                      # suficiente anual para reflejar la carga total 
                      # No poca cosa -> está visto desde el lado del emisor
                      # No poca cosa -> los números redondos para fechas son los 
                      # que se usan normalmente, y con lo que se puede estar en
                      # duda (pueden ser otros múltiplos)

my $cuota;            # Esto significa que la deuda es FIJA, mientras que
                      # lo demás es variable

# my $incrdeuda = $deuda /10;  # se aplica sobre el porcentaje anterior
                               # (igual me pierdo con tanta vitualización) 

my $riesgo = 0.4;     # en base de 0 a 0.5 (más es inasumible) 

my $capital = 1000;   # Números redondos, pero facilitadores en orden de magnitud 
my $reservas;         # ditto. pero en la simulación
my $neto;
my $pneto;            # porcentaje $reservas / $capital
                      # Obviamente, por aquí intento llegar a una tasa de, digamos,
                      # fracaso de la emisión, que lleva a la renegociación o concurso, etc.
my $impago = 0;
                      # Tengo que imprimir la conf. inicial y mirar cómo la incluyo en la 
                      # simulación

my $ITER = 1_000_000;

my %rdo;
my %rdo2;
my %contador;
my %contador2;
my $flag = 0;

my $margen_trimestre ;

for my $plazo (5 .. 50){      # en años
    
    my $jm = 0;               # plazo promedio
    my $coste_gestion = $plazo * 4; 

    %rdo =();
    %rdo2 =();
    %contador = ();
    %contador2 = ();
    
    for my $i (0 .. $ITER){
	
	# Estado inicial (lo que da sentido) (y se reinicia)
    
	$reservas = rand() * $capital;           # luego $neto sale >= $capital y < 2*$capital
	$neto = $capital + $reservas;
	$pneto = centiles($reservas / $capital);           # esto indica +/- el estado de salud previo
	$impago = 0;
	$leverage = rand();     # se podría meter un máximo endeudable
	$deuda = $leverage * $reservas / (4 * $plazo);   # cantidad sólo amortizable -> no el capital
	$cuota = $interes * ($leverage * $reservas) /4 + $deuda;       # cantidad trimestral 
	$flag = 0;
	$contador2{centiles($leverage)}++;                         # porcentaje deuda entera 
	$contador{$pneto}++;                                       # como porcentaje de neto
	
	say "Neto inicial = $neto" if $DEBUG;    
	say "Deuda sobre neto = ", $leverage * $reservas if $DEBUG;
	say "Rentabilidad inicial = ", $base * 4 / $neto if $DEBUG;      #  trimestres (algo hay que suponer)
		
	for my $p (0 .. $plazo * 4){
	
	    $margen_trimestre = (rand()-$riesgo) * $base;            #  (0.999-0.4, 0-0.4]  # no es simétrico
	    
	    if ($margen_trimestre > $impago + $cuota){
		
		$impago = 0;
		$neto += $margen_trimestre - $impago - $cuota;       # obvio ya reservas
		
	    }elsif ($margen_trimestre > $cuota){
		
		$impago = $impago;                                   # que sigue igual
		$neto += $margen_trimestre - $cuota;	    
	    
	    }elsif ($margen_trimestre > 0){
		
		$neto += $margen_trimestre;
		$impago += $cuota;
		
	    }else{         # margen negativo 
		
		$impago += $cuota;
		$neto += $margen_trimestre;  # esto es restar
		
	    }

#	    $neto = $capital + $reservas;           # por simplicidad, puede haber reservas < 0 

	    # Aparte, chequeo de viabilidad
	    
	    if ($neto < $impago){   # se considera el capital intocable por deuda		
		$jm += $p;       # interesa finura en ver el plazo: esto son trimestres, no años
		last;				
	    }

	    $flag =1 if ($p == $plazo * 4 && $impago < $reservas);         # éxito
	}
	
	if ($flag == 1){      # referido a estado inicial (tamaño del colchón)
	    $rdo{$pneto}++ ;      # contador de éxitos
	    $rdo2{centiles( $leverage )}++;  # esto no va a interesar, de momento
	}else{
	    # se va actualizando promediando
	    say "\rPlazo medio fracaso/renegociar = ", $jm/$i if $DEBUG;	    
	}
    }

    # REPORTE: qué se espera. Comportamiento decreciente, pero no se sabe cómo 
    
    system ("clear");
    say "Contador de éxitos para plazo de $plazo AÑOS     Índice de costes = ", $coste_gestion;
    my $c = 0;
    # 0j0: esto, al $pneto final cae por redondeo de la parte de rand() < 1
    for my $k (sort keys %rdo){        # habrá puntos para los que no esté definido de todo el porcentaje
	if (++$c % 2 ==1){
	    print " " x 80;                   # la partición de pantalla del hombre pobre
	}                                     # solución NASA: pantalla vertical de > 100 líneas
	# Como divisor, $contador daría el % de todos los éxitos. Pero si son 100_000 iteraciones se espera
	# que pasen (rand() uniforme) unas 1000 por perecentil
	# Tercer intento: Por uniforme que sea, no hay gaarantías. Uso contador dedicado
	if ( defined ($contador{$k}) ){
	    print "Porcentaje de reservas $k => ", centiles($rdo{$k}/$contador{$k});
	}else{
	    print " " x 80;
	}
	say "" if ($c % 2==1);
    }
    say "\nContador de éxitos sobre deuda sobre reservas";
    $c = 0;
    for my $k2 (sort keys %rdo2){        # habrá puntos para los que no esté definido de todo el porcentaje
	if (++$c % 2 ==1){
	    print " " x 80;                   # la partición de pantalla del hombre pobre
	}                                     # solución NASA: pantalla vertical de > 100 líneas
	# Como divisor, $contador daría el % de todos los éxitos. Pero si son 100_000 iteraciones se espera
	# que pasen (rand() uniforme) unas 1000 por perecentil
	# Tercer intento: Por uniforme que sea, no hay gaarantías. Uso contador dedicado
	if ( defined ($contador2{$k2}) ){
	    print "Sobre leverage $k2 => ", centiles($rdo2{$k2}/$contador2{$k2});
	}else{
	    print " " x 80;
	}
	say "" if ($c % 2==1);
    }
    sleep 1 if $ITER <= 100_000;
}

say "";

exit 3;


sub centiles {        # importante para no perderse en detalles
    my $n = shift;
#    return sprintf "%.02f", $n;   # no uso esto pq a su vez viene de rand() y hay intervalo cojo
    return int (0.5+$n*100)/100;   # esto intenta ser un redondeo mejor
}


__END__
  

Entre tipos de obligaciones, la amortización aleatoria de una cantidad fija
  de obligaciones es claramente una opción inferior a la posibilidad de 
  amortizar anticipadamente una cantidad voluntaria de obligaciones, porque
  la obligación tendría mucho menos valor en época de intereses más bajos.
  
En cuanto a emisiones, se suele utilizar al descuento, con interés implícito
  a corto plazo, ya que es en el momento de la emisión donde hay más certidumbre
  de un diferencial de intereses.
  
Nota técnica: El leverage L normalmente se considera como la deuda entre los 
  fondos propios totales (hasta el remanente), pero a mí me resulta más útil
  considerar el capital social como no financiable a interés fijo, deuda.
  Creo que es lo más general y que se joroben los contables o quien sea.
  
