Samedi 18 avril 2009
6
18
/04
/2009
12:18
J'ai enfin trouvé le temps de recoder mes classes financières et je mets donc en ligne la classe Black&Scholes avec en plus les méthodes statiques pour les grecs.
package fx.bidesign.maths
{
import fx.bidesign.maths.ProbabilityTools;
public class BlackScholes
{
public function BlackScholes()
{
}
// (sous-jacent, prix d'exercice, jours restant, volatilté, taux sans risque, dividende, parité)
public static function value( s:Number, k:Number, t:Number, v:Number, r:Number, c:Number, p:Number = 1 ):Array
{
var d1:Number = ( Math.log( s / k ) + ( r + Math.pow( v, 2 ) / 2 ) * t ) / ( v * Math.sqrt( t ) );
var d2:Number = d1 - ( v * Math.sqrt( t ) );
var call:Number = s * Math.exp( - c * t ) * ProbabilityTools.normalDistribution( d1 ) - k * Math.exp( - r * t ) *
ProbabilityTools.normalDistribution( d2 );
var put:Number = - s * Math.exp( - c * t ) * ProbabilityTools.normalDistribution( - d1 ) + k * Math.exp( - r * t ) *
ProbabilityTools.normalDistribution( - d2 );
return [call / p, put / p ];
}
// (sous-jacent, prix d'exercice, jours restant, volatilté, taux sans risque, dividende, parité)
public static function delta( s:Number, k:Number, t:Number, v:Number, r:Number, c:Number, p:Number = 1 ):Array
{
var d1:Number = ( Math.log( s / k ) + ( r + Math.pow( v, 2 ) / 2 ) * t ) / ( v * Math.sqrt( t ) );
var d2:Number = d1 - ( v * Math.sqrt( t ) );
var call:Number = Math.exp( - c * t) * ProbabilityTools.normalDistribution( d1 );
var put:Number = Math.exp( - c * t ) * ( ProbabilityTools.normalDistribution( d1 ) - 1 );
return [call * 100, put * 100];
}
// (sous-jacent, prix d'exercice, jours restant, volatilté, taux sans risque, dividende, parité)
public static function gamma( s:Number, k:Number, t:Number, v:Number, r:Number, c:Number, p:Number = 1 ):Array
{
var d1:Number = ( Math.log( s / k ) + ( r + Math.pow( v, 2 ) / 2 ) * t ) / ( v * Math.sqrt( t ) );
var d2:Number = d1 - ( v * Math.sqrt( t ) );
var call:Number = Math.exp( - c * t ) * ( ProbabilityTools.normalDensity( d1 ) / ( s * v * Math.sqrt( t ) ) );
var put:Number = call;
return [call / ( p / 100 ), put / ( p / 100 )];
}
// (sous-jacent, prix d'exercice, jours restant, volatilté, taux sans risque, dividende, prime du put ou du call, parité)
public static function theta( s:Number, k:Number, t:Number, v:Number, r:Number, c:Number, fv:Number, p:Number = 1 ):Array
{
var d1:Number = ( Math.log( s / k ) + ( r + Math.pow( v, 2 ) / 2 ) * t ) / ( v * Math.sqrt( t ) );
var d2:Number = d1 - ( v * Math.sqrt( t ) );
var call:Number = - Math.exp( - c * t ) * s * ProbabilityTools.normalDensity( d1 ) * v / ( 2 * Math.sqrt( t ) );
call += - r * k * Math.exp( - r * t ) * ProbabilityTools.normalDistribution( d2 );
call += c * s * Math.exp( - c * t ) * ProbabilityTools.normalDistribution( d1 );
var put:Number = - ( s * Math.exp( - c * t ) * v ) / ( 2 * Math.sqrt( t ) ) * ProbabilityTools.normalDensity( d1 );
put += + r * k * Math.exp( -r * t ) * ( 1 - ProbabilityTools.normalDistribution( d2 ) );
put += - c * s * Math.exp( - c * t) * ProbabilityTools.normalDistribution( 1 - d1 );
return [call / 52 / fv * 100, put / 52 / fv * 100];
}
// (sous-jacent, prix d'exercice, jours restant, volatilté, taux sans risque, dividende, prime du put ou du call, parité)
public static function rho( s:Number, k:Number, t:Number, v:Number, r:Number, c:Number, fv:Number, p:Number = 1 ):Array
{
var d1:Number = ( Math.log( s / k ) + ( r + Math.pow( v, 2 ) / 2 ) * t ) / ( v * Math.sqrt( t ) );
var d2:Number = d1 - ( v * Math.sqrt( t ) );
var call:Number = k * t * Math.exp( - r * t ) * ProbabilityTools.normalDistribution( d2 );
var put:Number = k * t * Math.exp( - r * t ) * ( ProbabilityTools.normalDistribution( d2 ) - 1 );
return [call / fv, put / fv];
}
// (sous-jacent, prix d'exercice, jours restant, volatilté, taux sans risque, dividende, prime du put ou du call, parité)
public static function vega( s:Number, k:Number, t:Number, v:Number, r:Number, c:Number, fv:Number, p:Number = 1 ):Array
{
var d1:Number = ( Math.log( s / k ) + ( r + Math.pow( v, 2 ) / 2 ) * t ) / ( v * Math.sqrt( t ) );
var d2:Number = d1 - ( v * Math.sqrt( t ) );
var call:Number = s * Math.exp(- c * t ) * ProbabilityTools.normalDensity( d1 ) * Math.sqrt( t );
var put:Number = call;
return [call / fv, put / fv];
}
// (sous-jacent, valeur du delta, prime du put ou du call)
public static function elasticity( s:Number, del:Number, fv:Number ):Array
{
var call:Number = s * del / fv;
var put:Number = s * del / fv;
return [call / 100, put / 100];
}
}
}
Cette classe appartient au package fx.bidesign.maths. Les sources seront mises à dispositions lorsques l'ensemble des tutoriaux concernant le pricer seront publiés