#!/usr/bin/perl 

use 5.034;

# SIMULACIÓN

# Opciones de convertibilidad desde el momento 0
# con tara al... 49% por razones de no devaluar la propiedad.
# Adicionalmente el porcentaje de tara debe disminuir con
# el tiempo... p.ej. un 1% por año.

# Variables simuladas fundamentales: tipo de interés $i y 
# valor de la empresa (randomwalk) $V con respecto a $V0

# Otras variables: horizonte temporal (0..$N) $N=40
# Porcentaje inicial financiado $L de $V0 (p.ej. menos del 80%)

# Sobre si se supone responsabilidad limitada o ilimitada,
# creo que la opción más general es considerar ilimitada,
# porque si $V < 0, esas pérdidas se convierten en precio 
# de opción de compra de la empresa por otras empresas.

# Operativa año $n
# $V[$n] es el random walk
# Importante es que $V[$n] <=> $Vp[$n] + $Vd[$n]
# debido a que son valores sobre lo mismo y puede haber holgura o solapamiento
# $Vp[$n] = $p * $V[$n] donde $p = 0.51 + 0.01 * $n
# $Vd[$n] tiene valor mínimo en 0
# $Vd[$n] tiene un valor condicional de $V0*$L*(1+$i)**$n
# y otro valor condicional en $V[$n] * (1-$p)
# El dilema de que un valor sea mayor a otro debe arbitrarse
# en función de un coste de transacción (-$C) y/o de oportunidad

# También, para complicar, al acreedor le puede interesar 
# canjear parcialmente una proporción $beta < (1-$p)
# Es más, es de esperar que casi siempre le interese tener 
# una pequeña proporción $beta de no ser por los costes de arriba.

my $N = 20;
my $V0 = 100_000;      # no importa
my @L = (0.20,0.30,0.40,0.50,0.60,0.70,0.80);
my @i = (0.03,0.05);   # bajo, alto
my $p;
my (@V, @Vp, @Vd1, @Vd2);

say "  L     ",
  "   i    ",
  "   n    ",
  "   p    ",
  "    V    ",
  "    Vp   ",
  "    Vd1  ",
  "    Vd2  ";

for my $l (@L){
    for my $ii (@i){
	# init
	$V[0] = $V0;
	$p = 0.51;             # tope de deuda, lo complementario
	for my $n (1..$N){
	    $V[$n] = $V[$n-1] * ( 1+ (rand()-0.5)/10 );    # random walk
	    $p += 0.01;
	    $Vp[$n] = $p * $V[$n];
	    $Vd1[$n] = $V0 * $l * (1+$ii)**$n;   # puede haber opciones de pagar anticipadamente
	    $Vd2[$n] = $V[$n] - $Vp[$n];
	    $Vd2[$n] = ($Vd2[$n] < 0) ? 0 : $Vd2[$n]; 
	    # ...
	    my $deal = ($Vd2[$n] > $Vd1[$n]) ? " DEAL!" : "";
	    if ( $n % 5 == 0 ){
		# ...
		# report
		say f($l), f($ii), f($n), f($p), f( ($V[$n]/$V0) ), f( ($Vp[$n]/($V0*(1-$l))) ), f( ($Vd1[$n]/($V0*$l)) ), f( ($Vd2[$n]/($V0*$l)) ), $deal;
	    }
	}    
    }
}

exit 2;

sub f {
    my $val = shift;
    $val = sprintf( "%4.02f", $val );
    $val .= " " x (9-length $val);
    return $val;
}

