龙听期货论坛's Archiver

龙听 发表于 2022-11-2 11:31

【OptionsComplex】

[code]inputs:
        MyAssetType( numericsimple ),
        DaysLeft( numericsimple ),
        StrikePr( numericsimple ),
        AssetPr( numericsimple ),
        Rate100( numericsimple ),
        Yield100( numericsimple ),
        ForeignRate100( numericsimple ),
        Volty100( numericsimple ),
        PutCall( numericsimple ),
        EuroAmer01( numericsimple ),
        oOptPriceValue( numericref ),
        oDelta( numericref ),
        oGamma( numericref ),
        oVega( numericref ),
        oTheta( numericref ),
        oRho( numericref ) ;

variables:
        var0( false ),
        var1( 0 ),
        var2( 0 ),
        var3( 0 ),
        var4( 0 ),
        var5( 0 ),
        var6( 0 ),
        var7( 0 ),
        var8( 0 ),
        var9( 0 ),
        var10( 0 ),
        var11( 0 ),
        var12( 0 ),
        var13( 0 ),
        var14( 0 ),
        var15( 0 ) ;
                                                                               
                 

var0 = ( MyAssetType <> 1 and MyAssetType <> 2 and MyAssetType <> 3 and
MyAssetType <> 4 ) or StrikePr <= 0 or Volty100 <= 0 or ( PutCall <> 2 and
PutCall <> 3 ) ;

condition1 = var0 or AssetPr <= 0 or DaysLeft <= 0 ;
if condition1 then
        begin
        oOptPriceValue = 0 ;
        oDelta = 0 ;
        oGamma = 0 ;
        oVega = 0 ;
        oTheta = 0 ;
        oRho = 0 ;
        if var0 = false then
                begin
                if DaysLeft <= 0 then
                        begin
                        if PutCall = 3 and StrikePr <= AssetPr then
                                oDelta = 1
                        else if PutCall = 2 and StrikePr >= AssetPr then
                                oDelta = -1 ;
                        oOptPriceValue = OS_Intrinsic( AssetPr, PutCall, StrikePr ) ;
                        end ;
                if AssetPr = 0 and PutCall = 2 then
                        oOptPriceValue = StrikePr ;
                end ;
        OptionsComplex = -1 ;
        end
else
        begin
        var1 = Rate100 * 0.01 ;
        var3 = Yield100 * 0.01 ;
        var4 = ForeignRate100 * 0.01 ;

        if MyAssetType = 1                             then
                var5 = var1
        else if        MyAssetType = 2                         then
                var5 = var1 - var3
        else if MyAssetType = 3           then
                var5 = 0
        else if MyAssetType = 4              then
                var5 = var1 - var4 ;

        var2 = Volty100 * 0.01 ;
        var6 = DaysLeft * 0.002739726027               ;
        var7 = SquareRoot( var6 ) ;
        var8 = var2 * var7 ;
        var9 = StrikePr * ExpValue( -var1 * var6 ) ;
        var10 = ExpValue( ( var5 - var1 ) * var6 ) ;
        var11 = ( Log( AssetPr / StrikePr ) + ( var5 + Power( var2, 2 ) / 2 ) * var6 )
         / var8 ;
        var12 = ExpValue( -Square( var11 ) * 0.5 ) * 0.398942280407                   ;
        var13 = NormSCDensity( var11 ) ;
        var14 = var11 - var8 ;
        var15 = NormSCDensity( var14 ) ;

        if PutCall = 3 then
                begin
                oOptPriceValue = var13 * AssetPr * var10  - var15 * var9 ;
                oDelta = var13 * var10 ;
                oTheta = ( -var12 * AssetPr * var2 * var10 / ( 2 * var7 ) - var13
                 * ( var5 - var1 ) * AssetPr * var10 - var15 * var1 * var9 )
                 * 0.002739726027               ;
                oRho = var15 * var6 * var9 * 0.01 ;
                end
        else if PutCall = 2 then
                begin
                if EuroAmer01 = 0 then
                        oOptPriceValue = ( var13 - 1 ) * AssetPr * var10  + ( 1 - var15 ) * var9
                else if EuroAmer01 = 1 then
                        oOptPriceValue = BjerkStensCall( StrikePr, AssetPr, var6, var1 - var5,
                         -var5, var2 ) ;
                oDelta = ( var13 - 1 ) * var10 ;
                oTheta = ( -var12 * AssetPr * var2 * var10 / ( 2 * var7 ) + ( 1 - var13 )
                 * ( var5 - var1 ) * AssetPr * var10 + ( 1 - var15 ) * var1 * var9 )
                 * 0.002739726027               ;
                oRho = ( var15 - 1 ) * var6 * var9 * 0.01 ;
                end ;

        oGamma = ( var12 * var10 ) / ( AssetPr * var8 ) ;
        oVega = var12 * AssetPr * var7 * var10 * 0.01 ;

        OptionsComplex = 1 ;
        end ;
[/code]

页: [1]