Quant-Framework

 view release on metacpan or  search on metacpan

t/VolSurface/Moneyness/convert_moneyness_to_delta.t  view on Meta::CPAN

    'volsurface_delta',
    {
        underlying_config => $underlying_config,
        recorded_date     => Date::Utility->new,
        chronicle_reader  => $chronicle_r,
        chronicle_writer  => $chronicle_w,
    });

subtest "convert moneyness to delta" => sub {
    plan tests => 6;

    my $smile = {
        100 => 0.2781706925,
        101 => 0.2745433458,
        102 => 0.2709204185,
        103 => 0.2673091695,
        104 => 0.2637163519,
        105 => 0.182182369,
        106 => 0.1878046744,
        107 => 0.195581881,
        108 => 0.2050003166,
        109 => 0.2154778087,
        110 => 0.2264321512,
        90  => 0.3110673914,
        91  => 0.3084866463,
        92  => 0.3056723805,
        93  => 0.3026373821,
        94  => 0.2994163006,
        95  => 0.2960460985,
        96  => 0.2925637385,
        97  => 0.2890061831,
        98  => 0.2854096085,
        99  => 0.2817951997,
    };
    my $surface = {
        7  => {smile => $smile},
        14 => {smile => $smile},
    };
    my $calculated_delta_from_csv = {
        75 => 0.2875,
        50 => 0.2779,
        25 => 0.2668,
    };

    my $recorded_date = Date::Utility->new;
    my $v             = Quant::Framework::VolSurface::Moneyness->new(
        underlying_config => $underlying_config,
        recorded_date     => $recorded_date,
        surface           => $surface,
        spot_reference    => 7099.7,
        chronicle_reader  => $chronicle_r,
        chronicle_writer  => $chronicle_w,
    );

    lives_ok { $v->_convert_moneyness_smile_to_delta(7) } "can convert moneyness smile to delta smile";
    throws_ok { $v->_convert_moneyness_smile_to_delta('asd') } qr/must be a number/,
        "from and to dates must be defined";

    my $deltas = $v->_convert_moneyness_smile_to_delta(7);

    my $BOM_25 = $v->get_volatility({
        delta => 25,
        from  => $v->recorded_date,
        to    => $v->effective_date->plus_time_interval('7d'),
    });
    my $BOM_50 = $v->get_volatility({
        delta => 50,
        from  => $v->recorded_date,
        to    => $v->effective_date->plus_time_interval('7d'),
    });
    my $BOM_75 = $v->get_volatility({
        delta => 75,
        from  => $v->recorded_date,
        to    => $v->effective_date->plus_time_interval('7d'),
    });
    cmp_ok(abs($BOM_25 - $calculated_delta_from_csv->{25}), "<=", 0.0005, "correct 25D vol");
    cmp_ok(abs($BOM_50 - $calculated_delta_from_csv->{50}), "<=", 0.0005, "correct 50D vol");
    cmp_ok(abs($BOM_75 - $calculated_delta_from_csv->{75}), "<=", 0.0005, "correct 75D vol");
    my @shuffled_deltas = shuffle(keys %{$deltas});
    is(
        $v->get_volatility({
                delta => $shuffled_deltas[0],
                from  => $v->recorded_date,
                to    => $v->recorded_date->plus_time_interval('7d'),
            }
        ),
        $deltas->{$shuffled_deltas[0]},
        "return corresponding volatility if sought delta is on smile"
    );

};

done_testing;



( run in 2.087 seconds using v1.01-cache-2.11-cpan-5c0b1e786e0 )