def bear_test():
    '''
    test the vaild of bull test: the class bull
    input paramter:
        short_Call: p=5.39 k=45 maturity=30 European
        long_Call: p=0.45 k=55 maturity=30 European
    output parameter:
        if S=35 
        then portfolio.value_at_maturity()=4.69
        if S=65
        then portfolio.value_at_maturity()=-0.31
    '''
    import matplotlib.pyplot as plt

    short = option.Call(5.39, 45, 30, 'E')
    long = option.Call(0.45, 55, 30, 'E')
    portfolio = bear.bear(short, long, 'C')
    print('S=35:', portfolio.value_at_maturity(35))
    print('S=65:', portfolio.value_at_maturity(65))
    plt.figure('Call Bear')
    portfolio.plot_value_at_maturity()
    '''
    test the vaild of bull test: the class bull
    input paramter:
        short_Put: p=0.02 k=40 maturity=30 European
        long_Put: p=9.96 k=60 maturity=30 European
    output parameter:
        if S=35 
        then portfolio.value_at_maturity()=10.06
        if S=65
        then portfolio.value_at_maturity()=-9.94
    '''
    short = option.Put(0.02, 40, 1 / 12, 'E')
    long = option.Put(9.96, 60, 1 / 12, 'E')
    portfolio = bear.bear(short, long, 'P')
    print('S=35:', portfolio.value_at_maturity(35))
    print('S=65:', portfolio.value_at_maturity(65))
    plt.figure('Put Bear')
    portfolio.plot_value_at_maturity()
    '''
    plot the probability of spot price at maturity 
    Y axis: pdf(normed(log(ST/S0)))
    X axis: S
    '''
    plt.figure('probability')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3))
    '''
    Calculate the expected return follow the formula
    sum{return(i)*prob(i)*interval(i)}
    test validity
    if S0=80
    then expected return is around -9.90
    if S0=35
    then expected return is around 10.00
    '''
    print('expected_profit:', portfolio.expectated_profit(35, 0.1, 0.3))
    print('expected_profit:', portfolio.expectated_profit(80, 0.1, 0.3))
def diagonal_spreads_test():
    '''
    test the validity of diagonal_spreads.
    input parameter:
        short_early_Call_k1: p=0.34 k=50 maturity=30/360 European
        long_late_Call_k2:p=0.51 k=55 maturity=93/360 European
        mu=0.1
        sigma=33.33%
        q=0
        r=0.015
        
    output parameters:
        if S=50
        then portfolio.value_at_maturity()=0.93
        if S=60
        then portfolio.value_at_maturity()=-3.76
        if S=35
        then portfolio.value_at_maturity()=around -0.20
        if S=51.35
        then portfolio.value_at_maturity()=0
        if S=44.04
        then portfolio.value_at_maturity()=0
    '''
    import matplotlib.pyplot as plt

    short_early_Call_k1 = option.Call(0.34, 50, 30 / 360, 'E')
    long_late_Call_k2 = option.Call(0.51, 55, 93 / 360, 'E')
    portfolio = diagonal_spreads.diagonal_spreads(short_early_Call_k1,
                                                  long_late_Call_k2, 'C', 'P',
                                                  'bear')
    print('S=50:', portfolio.value_at_maturity(50, 0.015, 0.3333, 0))
    print('S=60:', portfolio.value_at_maturity(60, 0.015, 0.3333, 0))
    print('S=35:', portfolio.value_at_maturity(35, 0.015, 0.3333, 0))
    print('S=51.35:', portfolio.value_at_maturity(51.35, 0.015, 0.3333, 0))
    print('S=44.04:', portfolio.value_at_maturity(44.04, 0.015, 0.3333, 0))
    plt.figure('Profit_diagonal_spreads')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.grid()
    plt.figure('probability_diagonal_spreads')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
def calendar_option_test():
    '''
    test the vaild of calendar_option : the class calendar_option 
    input paramter:
        short_early_Call:p=1.98 k=50 maturity=30/360 European
        long_late_Call: p=2.91 k=50 maturity=65/360 European
        mu=0.1
        sigma=33.33%
        q=0
        r=0.015
        
    output parameter:
        if S=50
        then portfolio.value_at_maturity()=1.17
        if S=40
        then portfolio.value_at_maturity()=-0.90
        if S=47.19
        then portfolio.value_at_maturity()=0
        if S=53.35
        then portfolio.value_at_maturity()=0
        if S=60
        then portfolio.value_at_maturity()=around -0.5
    '''
    import matplotlib.pyplot as plt

    short_early_Call = option.Call(1.98, 50, 30 / 360, 'E')
    long_late_Call = option.Call(2.91, 50, 65 / 360, 'E')
    portfolio = calendar_option.calendar_option(short_early_Call,
                                                long_late_Call, 'P')
    print('S=50:', portfolio.value_at_maturity(50, 0.015, 0.3333, 0))
    print('S=40:', portfolio.value_at_maturity(40, 0.015, 0.3333, 0))
    print('S=47.19:', portfolio.value_at_maturity(47.19, 0.015, 0.3333, 0))
    print('S=53.35:', portfolio.value_at_maturity(53.35, 0.015, 0.3333, 0))
    print('S=60:', portfolio.value_at_maturity(60, 0.015, 0.3333, 0))
    plt.figure('Profit')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.figure('probability')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
    '''
def option_compound_test():
    import matplotlib.pyplot as plt
    '''
    input parameters:
        spread1:
            Call_Positive bear spread
            short_early_call_k1: p=0.45, k1=55, t=30/360
            long_late_call_k2: p=0.38, k2=60, t=65/360
        spread2: 
            Put_Positive bull spread
            long_late_put_k1: p=0.85, k1=45, t=65/360
            short_early_put_k2: p=1.89, k2=50, t=30/360
    
    output parameters:
        if S=50 
        then portfolio.value_at_maturity()=1.54
        if S=60
        then portfolio.value_at_maturity()=-3.28
        if S=43.51
        then portfolio.value_at_maturity()=0
        if S=52.06
        then portfolio.value_at_maturity()=0
    '''
    short_early_Call_k1 = option.Call(1.98, 50, 30 / 360, 'E')
    long_late_Call_k2 = option.Call(1.16, 55, 65 / 360, 'E')
    long_late_put_k1 = option.Put(0.15, 40, 65 / 360, 'E')
    short_early_put_k2 = option.Put(0.31, 45, 30 / 360, 'E')
    option_list_short = [short_early_Call_k1, short_early_put_k2]
    option_list_long = [long_late_Call_k2, long_late_put_k1]
    portfolio = option_compound.option_compound(option_list_short,
                                                option_list_long)
    print('S=50:', portfolio.value_at_maturity(50, 0.015, 0.3333, 0))
    print('S=60:', portfolio.value_at_maturity(60, 0.015, 0.3333, 0))
    print('S=43.51:', portfolio.value_at_maturity(43.51, 0.015, 0.3333, 0))
    print('S=52.06:', portfolio.value_at_maturity(52.06, 0.015, 0.3333, 0))
    plt.figure('Profit_double_spreads with positive bear')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.grid()
    plt.figure('probability_double_spreads with positive bear')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
    '''
    input parameter:
        call: p=0.45 k=55 maturity=30/360 European
        put:p=0.31 k=45 maturity=30/360 European
        mu=0.1
        sigma=33.33%
        q=0
        r=0.015
        
    output parameters:
        if S=50
        then portfolio.value_at_maturity()=-0.76
        if S=65
        then portfolio.value_at_maturity()=9.42
        if S=44.24
        then portfolio.value_at_maturity()=0
        if S=55.76
        then portfolio.value_at_maturity()=0
    '''
    call = option.Call(0.45, 55, 30 / 360, 'E')
    put = option.Put(0.31, 45, 30 / 360, 'E')
    option_list_short = []
    option_list_long = [call, put]
    portfolio = option_compound.option_compound(option_list_short,
                                                option_list_long)
    print('S=50:', portfolio.value_at_maturity(50, 0.015, 0.3333, 0))
    print('S=65:', portfolio.value_at_maturity(65, 0.015, 0.3333, 0))
    print('S=44.24:', portfolio.value_at_maturity(44.24, 0.015, 0.3333, 0))
    print('S=55.76:', portfolio.value_at_maturity(55.76, 0.015, 0.3333, 0))
    plt.figure('Profit_strangle')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.grid()
    plt.figure('probability_strangle')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
def straddle_test():
    '''
    test the validity of diagonal_spreads.
    input parameter:
        call: p=1.98 k=50 maturity=30/360 European
        put:p=1.89 k=50 maturity=30/360 European
        mu=0.1
        sigma=33.33%
        q=0
        r=0.015
        
    output parameters:
        if S=50
        then portfolio.value_at_maturity()=-3.87
        if S=60
        then portfolio.value_at_maturity()=6.32
        if S=46.13
        then portfolio.value_at_maturity()=0
        if S=53.87
        then portfolio.value_at_maturity()=0
    '''
    import matplotlib.pyplot as plt

    call = option.Call(1.98, 50, 30 / 360, 'E')
    put = option.Put(1.89, 50, 30 / 360, 'E')
    portfolio = straddle.straddle(call, put)
    print('S=50:', portfolio.value_at_maturity(50))
    print('S=60:', portfolio.value_at_maturity(60))
    print('S=46.13:', portfolio.value_at_maturity(46.13))
    print('S=53.87:', portfolio.value_at_maturity(53.87))
    plt.figure('Profit')
    portfolio.plot_value_at_maturity()
    plt.grid()
    plt.figure('probability')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:', portfolio.expectated_profit(40, 0.1, 0.3333))
    print('expected_profit:', portfolio.expectated_profit(50, 0.1, 0.3333))
    print('expected_profit:', portfolio.expectated_profit(60, 0.1, 0.3333))
    '''
    input parameter:
        call: p=0.45 k=55 maturity=30/360 European
        put:p=0.31 k=45 maturity=30/360 European
        mu=0.1
        sigma=33.33%
        q=0
        r=0.015
        
    output parameters:
        if S=50
        then portfolio.value_at_maturity()=-0.76
        if S=65
        then portfolio.value_at_maturity()=9.42
        if S=44.24
        then portfolio.value_at_maturity()=0
        if S=55.76
        then portfolio.value_at_maturity()=0
    '''
    call = option.Call(0.45, 55, 30 / 360, 'E')
    put = option.Put(0.31, 45, 30 / 360, 'E')
    portfolio = straddle.straddle(call, put)
    print('S=50:', portfolio.value_at_maturity(50))
    print('S=65:', portfolio.value_at_maturity(65))
    print('S=44.24:', portfolio.value_at_maturity(44.24))
    print('S=55.76:', portfolio.value_at_maturity(55.76))
    plt.figure('Profit_strangle')
    portfolio.plot_value_at_maturity()
    plt.grid()
    plt.figure('probability_strangle')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:', portfolio.expectated_profit(40, 0.1, 0.3333))
    print('expected_profit:', portfolio.expectated_profit(50, 0.1, 0.3333))
    print('expected_profit:', portfolio.expectated_profit(60, 0.1, 0.3333))
def double_diagonal_test():
    import matplotlib.pyplot as plt
    '''
    input parameters:
        spread1:
            Call_Positive_bear spread
            short_early_call_k1: p=0.45, k1=55, t=30/360
            long_late_call_k2: p=0.38, k2=60, t=65/360
        spread2:
            Put_Positive_bull spread
            long_late_Put_k1: p=0.15, k1=40, t=65/360
            short_early_Put_k2: p=0.31, k2=45, t=30/360
    output parameters:
        if S=45
        then portfolio.value_at_maturity()=around 0.50
        if S=55
        then portfolio.value_at_maturity()=0.91
        if S=44.43
        then portfolio.value_at_maturity()=0
        if S=56.22
        then portfolio.value_at_maturity()=0
        if S=40
        then portfolio.value_at_maturity()=-3.16
        if S=60
        then portfolio.value_at_maturity()=around -2.10
    '''
    short_early_Call_k1 = option.Call(0.45, 55, 30 / 360, 'E')
    long_late_Call_k2 = option.Call(0.38, 60, 65 / 360, 'E')
    long_late_Put_k1 = option.Put(0.15, 40, 65 / 360, 'E')
    short_early_Put_k2 = option.Put(0.31, 45, 30 / 360, 'E')
    spread1 = diagonal_spreads.diagonal_spreads(short_early_Call_k1,
                                                long_late_Call_k2, 'C', 'P',
                                                'bear')
    spread2 = diagonal_spreads.diagonal_spreads(long_late_Put_k1,
                                                short_early_Put_k2, 'P', 'P',
                                                'bull')
    portfolio = diagonal_spreads.double_diagonal(spread1, spread2)
    print('S=45:', portfolio.value_at_maturity(45, 0.015, 0.3333, 0))
    print('S=55:', portfolio.value_at_maturity(55, 0.015, 0.3333, 0))
    print('S=44.43:', portfolio.value_at_maturity(44.43, 0.015, 0.3333, 0))
    print('S=56.22:', portfolio.value_at_maturity(56.22, 0.015, 0.3333, 0))
    print('S=40:', portfolio.value_at_maturity(40, 0.015, 0.3333, 0))
    print('S=60:', portfolio.value_at_maturity(60, 0.015, 0.3333, 0))
    plt.figure('Profit_double_spreads')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.grid()
    plt.figure('probability_double_spreads')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
    '''
    input parameters:
        spread1:
            Call_Positive_bear spread
            short_early_call_k1: p=0.45, k1=55, t=30/360
            long_late_call_k2: p=0.38, k2=60, t=65/360
        spread2:
            Put_Positive_bull spread
            long_late_Put_k1: p=0.15, k1=40, t=65/360
            short_early_Put_k2: p=0.31, k2=45, t=30/360
            
    output parameters:
        if S=50
        then portfolio.value_at_maturity()=2.77
        if S=40
        then portfolio.value_at_maturity()=-2.94
        if S=60
        then portfolio.value_at_maturity()=-2.25
        if S=46.95
        then portfolio.value_at_maturity()=0
        if S=53.59
        then portfolio.value_at_maturity()=0
    '''
    short_early_Call_k1 = option.Call(1.98, 50, 30 / 360, 'E')
    long_late_Call_k2 = option.Call(1.16, 55, 65 / 360, 'E')
    long_late_Put_k1 = option.Put(0.85, 45, 65 / 360, 'E')
    short_early_Put_k2 = option.Put(1.89, 50, 30 / 360, 'E')
    spread1 = diagonal_spreads.diagonal_spreads(short_early_Call_k1,
                                                long_late_Call_k2, 'C', 'P',
                                                'bear')
    spread2 = diagonal_spreads.diagonal_spreads(long_late_Put_k1,
                                                short_early_Put_k2, 'P', 'P',
                                                'bull')
    portfolio = diagonal_spreads.double_diagonal(spread1, spread2)
    print('S=50:', portfolio.value_at_maturity(50, 0.015, 0.3333, 0))
    print('S=40:', portfolio.value_at_maturity(40, 0.015, 0.3333, 0))
    print('S=60:', portfolio.value_at_maturity(60, 0.015, 0.3333, 0))
    print('S=46.95:', portfolio.value_at_maturity(46.95, 0.015, 0.3333, 0))
    print('S=53.59:', portfolio.value_at_maturity(53.59, 0.015, 0.3333, 0))
    plt.figure('Profit_double_spreads with same strikes')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.grid()
    plt.figure('probability_double_spreads with same strikes')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
    '''
    input parameters:
        spread1:
            Call_Positive bear spread
            short_early_call_k1: p=0.45, k1=55, t=30/360
            long_late_call_k2: p=0.38, k2=60, t=65/360
        spread2: 
            Put_Positive bull spread
            long_late_put_k1: p=0.85, k1=45, t=65/360
            short_early_put_k2: p=1.89, k2=50, t=30/360
    
    output parameters:
        if S=55 
        then portfolio.value_at_maturity()=1.84
        if S=40
        then portfolio.value_at_maturity()=-3.69
        if S=48.14
        then portfolio.value_at_maturity()=0
        if S=57.55
        then portfolio.value_at_maturity()=0
    '''
    short_early_Call_k1 = option.Call(0.45, 55, 30 / 360, 'E')
    long_late_Call_k2 = option.Call(0.38, 60, 65 / 360, 'E')
    long_late_put_k1 = option.Put(0.85, 45, 65 / 360, 'E')
    short_early_put_k2 = option.Put(1.89, 50, 30 / 360, 'E')
    spread1 = diagonal_spreads.diagonal_spreads(short_early_Call_k1,
                                                long_late_Call_k2, 'C', 'P',
                                                'bear')
    spread2 = diagonal_spreads.diagonal_spreads(long_late_put_k1,
                                                short_early_put_k2, 'P', 'P',
                                                'bull')
    portfolio = diagonal_spreads.double_diagonal(spread1, spread2)
    print('S=55:', portfolio.value_at_maturity(55, 0.015, 0.3333, 0))
    print('S=40:', portfolio.value_at_maturity(40, 0.015, 0.3333, 0))
    print('S=48.14:', portfolio.value_at_maturity(48.14, 0.015, 0.3333, 0))
    print('S=57.55:', portfolio.value_at_maturity(57.55, 0.015, 0.3333, 0))
    plt.figure('Profit_double_spreads with positive bull')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.grid()
    plt.figure('probability_double_spreads with positive bull')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
    '''
    input parameters:
        spread1:
            Call_Positive bear spread
            short_early_call_k1: p=0.45, k1=55, t=30/360
            long_late_call_k2: p=0.38, k2=60, t=65/360
        spread2: 
            Put_Positive bull spread
            long_late_put_k1: p=0.85, k1=45, t=65/360
            short_early_put_k2: p=1.89, k2=50, t=30/360
    
    output parameters:
        if S=50 
        then portfolio.value_at_maturity()=1.54
        if S=60
        then portfolio.value_at_maturity()=-3.28
        if S=43.51
        then portfolio.value_at_maturity()=0
        if S=52.06
        then portfolio.value_at_maturity()=0
    '''
    short_early_Call_k1 = option.Call(1.98, 50, 30 / 360, 'E')
    long_late_Call_k2 = option.Call(1.16, 55, 65 / 360, 'E')
    long_late_put_k1 = option.Put(0.15, 40, 65 / 360, 'E')
    short_early_put_k2 = option.Put(0.31, 45, 30 / 360, 'E')
    spread1 = diagonal_spreads.diagonal_spreads(short_early_Call_k1,
                                                long_late_Call_k2, 'C', 'P',
                                                'bear')
    spread2 = diagonal_spreads.diagonal_spreads(long_late_put_k1,
                                                short_early_put_k2, 'P', 'P',
                                                'bull')
    portfolio = diagonal_spreads.double_diagonal(spread1, spread2)
    print('S=50:', portfolio.value_at_maturity(50, 0.015, 0.3333, 0))
    print('S=60:', portfolio.value_at_maturity(60, 0.015, 0.3333, 0))
    print('S=43.51:', portfolio.value_at_maturity(43.51, 0.015, 0.3333, 0))
    print('S=52.06:', portfolio.value_at_maturity(52.06, 0.015, 0.3333, 0))
    plt.figure('Profit_double_spreads with positive bear')
    portfolio.plot_value_at_maturity(0.015, 0.3333, 0)
    plt.grid()
    plt.figure('probability_double_spreads with positive bear')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3333))
    plt.grid()
    print('expected_profit:',
          portfolio.expectated_profit(40, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(50, 0.1, 0.3333, 0.015, 0))
    print('expected_profit:',
          portfolio.expectated_profit(60, 0.1, 0.3333, 0.015, 0))
def butterfly_test():
    '''
    test the vaild of bull test: the class bull
    input paramter:
        short_Call_1: p=1.98 k=50 maturity=30 European
        short_Call_2:  p=1.98 k=50 maturity=30 European
        long_Call_1: p=0.45 k=55 maturity=30 European
        long_Call_2: p=5.39 k=45 maturity=30 European
    output parameter:
        if S=40 
        then portfolio.value_at_maturity()=-1.88
        if S=60
        then portfolio.value_at_maturity()=-1.88
        if S=50
        then portfolio.value_at_maturity()=3.12
        if S=46.88
        then portfolio.value_at_maturity()=0
        if S=53.12
        then portfolio.value_at_maturity()=0
    '''
    import matplotlib.pyplot as plt

    short_1 = option.Call(1.98, 50, 30, 'E')
    short_2 = option.Call(1.98, 50, 30, 'E')
    long_1 = option.Call(0.45, 55, 30, 'E')
    long_2 = option.Call(5.39, 45, 30, 'E')
    portfolio = butterfly.butterfly(short_1, short_2, long_1, long_2, 'C')
    print('S=40:', portfolio.value_at_maturity(40))
    print('S=60:', portfolio.value_at_maturity(60))
    print('S=50:', portfolio.value_at_maturity(50))
    print('S=46.88:', portfolio.value_at_maturity(46.88))
    print('S=53.12:', portfolio.value_at_maturity(53.12))
    plt.figure('Call Butterfly')
    portfolio.plot_value_at_maturity()
    '''
    test the vaild of bull test: the class bull
    input paramter:
        short_Put: p=0.02 k=40 maturity=30 European
        long_Put: p=9.96 k=60 maturity=30 European
    output parameter:
        if S=40 
        then portfolio.value_at_maturity()=-18.9
        if S=60
        then portfolio.value_at_maturity()=-18.9
        if S=50
        then portfolio_value_at_maturity()=3.11
        if S=46.89
        then portfolio_value_at_maturity()=0
        if S=53.11
        then portfolio_value_at_maturity()=0
    '''
    short_1 = option.Put(1.89, 50, 1 / 12, 'E')
    short_2 = option.Put(1.89, 50, 1 / 12, 'E')
    long_1 = option.Put(5.36, 55, 1 / 12, 'E')
    long_2 = option.Put(0.31, 45, 1 / 12, 'E')
    portfolio = butterfly.butterfly(short_1, short_2, long_1, long_2, 'P')
    print('S=40:', portfolio.value_at_maturity(40))
    print('S=60:', portfolio.value_at_maturity(60))
    print('S=50:', portfolio.value_at_maturity(50))
    print('S=46.89:', portfolio.value_at_maturity(46.89))
    print('S=53.11:', portfolio.value_at_maturity(53.11))
    plt.figure('Put Butterfly')
    portfolio.plot_value_at_maturity()
    '''
    plot the probability of spot price at maturity 
    Y axis: pdf(normed(log(ST/S0)))
    X axis: S
    '''
    plt.figure('probability')
    plt.plot(portfolio.S, portfolio.prob_value_at_maturity(50, 0.1, 0.3))
    '''
    Calculate the expected return follow the formula
    sum{return(i)*prob(i)*interval(i)}
    test validity
    if S0=80
    then expected return is around -9.90
    if S0=35
    then expected return is around 10.00
    '''
    print('expected_profit:', portfolio.expectated_profit(40, 0.1, 0.3))
    print('expected_profit:', portfolio.expectated_profit(50, 0.1, 0.3))
    print('expected_profit:', portfolio.expectated_profit(60, 0.1, 0.3))