Пример #1
0
def testify_CFS_IV(S0, strike, T, r, q, fixVol, N1, N2, quantile):
    import BlackScholesOption
    import matplotlib.pyplot as plt
    numLoop = 10
    (a, b) = preprocessing.calculateToleranceInterval(S0, strike, T, r, q,
                                                      fixVol, quantile)
    coeffs_var = calculateImpliedVarianceCoefficientArray(
        S0, strike, T, r, q, fixVol, N1, N2, quantile, a, b)
    inverse_coeffs = series_reversion.inverseSeries(coeffs_var)
    # V0 = BlackScholesOption.putOptionPriceBSM(S0, strike, T, r, q, sigma)
    targetSigma = np.array([(i + 1) * 0.1 for i in range(10)])
    target_vars = np.power(targetSigma, 2)
    var_estimations = np.zeros(numLoop)
    for i in range(numLoop):
        target_sigma_i = targetSigma[i]
        V_i = BlackScholesOption.putOptionPriceBSM(S0, strike, T, r, q,
                                                   target_sigma_i)
        var_i = target_sigma_i**2
        Vi_List = [(V_i - coeffs_var[0])**l
                   for l in range(len(inverse_coeffs))]
        var_estimations[i] = np.exp(-r * T) * np.dot(inverse_coeffs, Vi_List)

    print("CFS: target var", target_vars)
    print("CFS: var estimation", var_estimations)

    return
Пример #2
0
def testifyExchangeSumOrder(S0, strike, T, r, q, sigma, a, b, N1, N2,
                            quantile):
    import BlackScholesOption
    chfk_IV = calculateChfkIV_CFS(S0, strike, T, r, q, sigma, a, b, N1, N2)
    chfk = calculate_chfk_BSM_CFS(S0, strike, T, r, q, sigma, a, b, N1)
    # coeffs_volT = calculateIVCoefficientArray(S0,strike,T,r,q,sigma,N1,N2,quantile)
    coeffs_var = calculateImpliedVarianceCoefficientArray(
        S0, strike, T, r, q, sigma, N1, N2, quantile, a, b)
    Vk = calculate_Vk_put_CFS(a, b, N1, strike)
    print("Vk", Vk)
    print("coeffs of var", coeffs_var)
    V0 = BlackScholesOption.putOptionPriceBSM(S0, strike, T, r, q, sigma)
    V1 = np.exp(-r * T) * np.dot(chfk, Vk)
    V2 = np.exp(-r * T) * np.dot(chfk_IV, Vk)
    varl = [(sigma**2)**l for l in range(N2)]
    V3 = np.exp(-r * T) * np.dot(coeffs_var, varl)
    print("Black Scholes Value:", V0)
    print("put price using original chf in CFS method:", V1)
    print("chf represented as a w power series:", V2)
    print(
        "exchange summation order, and let V represented as a var power series:",
        V3)
    inverse_coeffs = series_reversion.inverseSeries(coeffs_var)
    print("inverse coeffs:", inverse_coeffs)
    var_true = sigma**2
    y = V0 * np.exp(r * T) - coeffs_var[0]
    yl = [y**l for l in range(11)]
    var_est = np.dot(inverse_coeffs, yl)
    print("compare", var_est, var_true)
    return
Пример #3
0
def calculateImpliedVolatilityByPutOptionPrice(S0,
                                               strike,
                                               T,
                                               r,
                                               q,
                                               price,
                                               quantile,
                                               N1,
                                               N2,
                                               fixPoint,
                                               showDuration=False):
    (a, b) = preprocessing.calculateToleranceInterval(S0, strike, T, r, q,
                                                      fixPoint, quantile)
    m = preprocessing.calculateConstantTerm(S0, strike, T, r, q, a)
    tick = time.time()

    # coeffs = calculateCoefficientList(strike, m, a, b, numGrid=N1, truncationOrder=N2)
    # inverseCoeffs = inverseSeries(coeffs)
    # y = price * np.exp(r * T) - coeffs[0]
    # omega = polyval(y, inverseCoeffs)
    # # print(omega,T)
    # volEstimation = np.sqrt(omega/T)
    coeffs = calculateCoefficientList(strike,
                                      m,
                                      a,
                                      b,
                                      numGrid=N1,
                                      truncationOrder=N2)
    # print("coeff for COS:", coeffs)
    # inverseCoeffs_old = inverseSeries_old(coeffs)
    inverseCoeffs = inverseSeries(coeffs)
    print("new", inverseCoeffs)
    # print("old", inverseCoeffs_old)

    # print(inverseCoeffs)
    y = price * np.exp(r * T) - coeffs[0]
    w = polyval(y, inverseCoeffs)
    print("w", w)
    # print("T*sigmaBSM**2", sigmaBSM ** 2 * T)
    # print("absolute error:", (w - sigmaBSM ** 2 * T))
    volEstimation = np.sqrt(w / T)

    tack = time.time()
    if (showDuration == True):
        print("consuming time for calculating implied volatility:",
              tack - tick)
    return volEstimation
Пример #4
0
def testify_IV(S0, strike, T, r, q, a, b, N1, N2, quantile, fixVol):
    # import matplotlib.pyplot as plt

    sigmaList = np.array([(i + 1) * 0.1 for i in range(10)])
    varEstimation = np.zeros(10)
    # wEstimation = np.zeros(10)
    # (a,b)=preprocessing.calculateToleranceInterval(S0,strike,T,r,q,fixVol,quantile)
    # (a,b)=(-5,5)
    m = preprocessing.calculateConstantTerm(S0, strike, T, r, q, a)
    coeffs = calculateCoefficientList(strike, m, a, b, N1, N2)
    inverseCoeffs = inverseSeries(coeffs)
    putPriceTrue = []
    putPriceIV = []
    for i in range(10):
        sigma = sigmaList[i]
        putPrice = BlackScholesOption.putOptionPriceBSM(
            S0, strike, T, r, q, sigma)
        putPriceTrue.append(putPrice)
        w = [(sigma**2 * T)**l for l in range(len(coeffs))]
        putPriceIV.append(np.dot(coeffs, w) * np.exp(-r * T))
        y = putPrice * np.exp(r * T) - coeffs[0]
        yList = [y**l for l in range(len(inverseCoeffs))]
        # todo: cann't use len(coeffs)
        w = np.dot(yList, inverseCoeffs)
        varEstimation[i] = w / T
        # wEstimation[i] = w
    # print(sigmaEstimation-sigmaList)
    print("COS: fixVol", fixVol)
    print("COS: sigma list", sigmaList)
    print("COS: target price", putPriceTrue)
    print("COS: price estimations", putPriceIV)
    print("COS: target vars", sigmaList**2)
    print("COS: var estimations", varEstimation)

    # plt.plot(-sigmaList+sigmaEstimation)
    # plt.plot(wEstimation-sigmaList**2*T)

    # plt.plot((-sigmaList+sigmaEstimation)/sigmaList)
    # plt.show()
    return
Пример #5
0
def testifyVarSeries(S0, strike, T, r, q, sigma, N1, N2, quantile, a, b):
    import BlackScholesOption
    import matplotlib.pyplot as plt
    coeffs_var = calculateImpliedVarianceCoefficientArray(
        S0, strike, T, r, q, sigma, N1, N2, quantile, a, b)
    inverse_coeffs = series_reversion.inverseSeries(coeffs_var)
    # V0 = BlackScholesOption.putOptionPriceBSM(S0, strike, T, r, q, sigma)
    V_BSM_list = []
    V_CFSIV_list = []
    for sigma_i in np.linspace(0.1, 0.8, 8):
        V_i = BlackScholesOption.putOptionPriceBSM(S0, strike, T, r, q,
                                                   sigma_i)
        var_i = sigma_i**2
        var_list = [var_i**l for l in range(len(coeffs_var))]
        V_i_CFSIV = np.exp(-r * T) * np.dot(coeffs_var, var_list)
        V_BSM_list.append(V_i)
        V_CFSIV_list.append(V_i_CFSIV)
    plt.plot(V_BSM_list)
    plt.plot(V_CFSIV_list)
    print("sigma_i", np.linspace(0.1, 0.8, 8))
    print("V_BSM_LIST", V_BSM_list)
    print("V_CFSIV_LIST", V_CFSIV_list)
    plt.show()
    return
Пример #6
0
print("priory error estimation:",errorUpperBound)
putPriceCOS = COS_expansion_utils.putOptionPriceCOS(S0,strike,T,r,q,sigmaBSM,quantile=quantile,numGrid=N1,showDuration=True)
print("put price:", putPriceCOS)
print("absolute error:", np.abs(putPriceCOS-putPriceBSM))
callPriceCOS = COS_expansion_utils.callOptionPriceCOS(S0,strike,T,r,q,sigmaBSM,quantile,numGrid=N1,showDuration=True)
print("call price:", callPriceCOS)
print("absolute error:", np.abs(callPriceCOS-callPriceBSM))
print("***************************************************************************")
print("calculate put option price using CFS method:")
print("N1:",N1)
putPriceCFS = CFS_expansion_utils.putOptionPriceCFS(S0,strike,T,r,q,sigmaBSM,quantile,numGrid=N1,showDuration=True)
print("put price:", putPriceCFS)
print("absolute error:", np.abs(putPriceCFS-putPriceBSM))
coeffsCFS = CFS_expansion_utils.calculateIVCoefficientArray(S0,strike,T,r,q,sigmaBSM,N1,N2,quantile)
print("coeff for CFS:",coeffsCFS)
inverseCoeffsCFS = series_reversion.inverseSeries(coeffsCFS)
print("inverse coeffs for CFS:",inverseCoeffsCFS)
targetVolCFS = 0.25
putPriceBSM_2 = float(BlackScholesOption.putOptionPriceBSM(S0,strike,T,r,q,targetVolCFS))
yCFS = putPriceBSM_2*np.exp(r*T) - coeffsCFS[0]
wCFS = polyval(yCFS,inverseCoeffsCFS)
print("w",wCFS)
print("absolute error for implied volatility:",np.abs(wCFS-sigmaBSM**2*T))
print("***************************************************************************")
print("calculate put option price using IV expansion method:")
print("N1:",N1,"N2:",N2)
putPriceIV=IV_expansion_utils.putOptionPriceIV(S0,strike,T,r,q,sigmaBSM,quantile,numGrid=N1,truncationOrder=N2,showDuration=True)
print("put price:", putPriceIV)
print("absolute error:", np.abs(putPriceIV-putPriceBSM))
print("***************************************************************************")
print("same volatility:")
Пример #7
0
def testify_IV_iteration(S0, strike, T, r, q, quantile, N1, N2, fixVol, n_iter,
                         testSigma):
    # import matplotlib.pyplot as plt
    # sigma=fixVol
    len_coeffs = 2 * (N2 // 2)
    sigmaList = np.array(testSigma)
    varEstimation = np.zeros(10)
    sigmaEstimation = np.zeros(len(testSigma))
    # wEstimation = np.zeros(10)

    # m = preprocessing.calculateConstantTerm(S0,strike,T,r,q,a)
    # coeffs = calculateCoefficientList(strike, m, a, b, N1, N2)
    # inverseCoeffs = inverseSeries(coeffs)
    putPriceTrue = []
    putPriceIV = []
    for i in range(len(sigmaList)):
        sigma = fixVol
        putPriceEstimation = 0
        target_sigma = sigmaList[i]
        putPrice = BlackScholesOption.putOptionPriceBSM(
            S0, strike, T, r, q, target_sigma)
        putPriceTrue.append(putPrice)
        targit_w = [(target_sigma**2 * T)**l for l in range(len_coeffs)]
        for j in range(n_iter):
            (a,
             b) = preprocessing.calculateToleranceInterval(S0,
                                                           strike,
                                                           T,
                                                           r,
                                                           q,
                                                           sigmaBSM=sigma,
                                                           quantile=quantile)
            # print("a,b",a,b)
            m = preprocessing.calculateConstantTerm(S0, strike, T, r, q, a)
            coeffs = calculateCoefficientList(strike, m, a, b, N1, N2)
            inverseCoeffs = inverseSeries(coeffs)

            w = [(target_sigma**2 * T)**l for l in range(len(coeffs))]

            y = putPrice * np.exp(r * T) - coeffs[0]
            yList = [y**l for l in range(len(inverseCoeffs))]
            # todo: cann't use len(coeffs)
            w2 = np.dot(yList, inverseCoeffs)

            # if w2<0:
            #     w2=-w2

            sigma = np.sqrt(w2 / T)
            # print("n_iter:", j, "var:", w2,"sigma",sigma)
            putPriceEstimation = np.dot(coeffs, w) * np.exp(-r * T)

        putPriceIV.append(putPriceEstimation)
        sigmaEstimation[i] = sigma
        varEstimation[i] = sigma**2
        # wEstimation[i] = w
    # print(sigmaEstimation-sigmaList)
    print("COS_it: fixVol", fixVol)
    print("COS_it: sigma list", sigmaList)
    print("COS_it: target price", putPriceTrue)
    print("COS_it: price estimations", putPriceIV)
    print("COS_it: target sigmas", sigmaList)
    print("COS_it: sigma estimations", sigmaEstimation)

    # plt.plot(-sigmaList+sigmaEstimation)
    # plt.plot(wEstimation-sigmaList**2*T)

    # plt.plot((-sigmaList+sigmaEstimation)/sigmaList)
    # plt.show()
    return