eqDividendCurveBuilder

Syntax

eqDividendCurveBuilder(referenceDate, termDates, method, [futPrices], [callPrices], [putPrices], [strikes], spot, discountCurve, dayCountConvention='Actual365', [curveName])

Details

Builds an equity dividend curve.

Parameters

referenceDate: A DATE scalar specifying the curve’s reference date.

termDates: A DATE vector specifying the curve’s term dates, which must be monotonically increasing and larger than referenceDate.

method: A STRING scalar specifying the calculating method, which can be “CallPutParity” or “FuturesPrice”.

  • When method = “CallPutParity”, implied dividend yields are derived via put-call parity. In this case, callPrices, putPrices, and strikes are required.

  • When method = “FuturesPrice”, implied dividend yields are deriving via the futures price formula. In this case, futPrices is required.

futPrices (optional): A positive DOUBLE vector specifying the future prices. It should have the same length as termDates.

callPrices (optional): A positive DOUBLE matrix specifying the call prices, which must have the same length as termDates.

putPrices (optional): A positive DOUBLE matrix specifying the put prices.

strikes (optional): A DOUBLE matrix specifying the strike prices, which must be monotonically increasing.

Notes:

  • callPrices, putPrices, and strikes must have the same shape and the number of columns should match the length of termDates.

  • futPrices must also have the same length as termDates.

spot: A positive DOUBLE scalar specifying the spot price of the underlying asset.

discountCurve: A MKTDATA object of type IrYieldCurve specifying the discount curve.

dayCountConvention: A STRING scalar specifying the day count convention to use, which can be:

  • "Actual365" (default): actual/365
  • "Actual360": actual/360
  • "Thirty360US": US (NASD) 30/360
  • "Thirty360EU": European 30/360
  • "ActualActualISMA": actual/actual according to ISMA (International Securities Market Association) convention
  • "ActualActualISDA": actual/actual according to ISDA (International Swaps and Derivatives Association) convention

curveName (optional): A STRING scalar specifying the curve name.

Returns

A MKTDATA object.

Examples

CallPutParity

Build a dividend curve for the SSE 50 ETF (510050.SH) using the put-call parity method.

referenceDate = 2026.02.13
spot = 3.114  // Close Price Of 510050.SH

// 1. Term Structure (Option Expiry Dates)
termDates = [2026.02.25, 2026.03.25, 2026.06.24, 2026.09.23]

// 2. Raw Data Matrices (Settlement Price)
callPrices = matrix(
    [0.2640, 0.2140, 0.1640, 0.1140, 0.0327, 0.0042, 0.0016, 0.0008, 0.0003, 0.0002],
    [0.2723, 0.2289, 0.1810, 0.1424, 0.0721, 0.0323, 0.0138, 0.0075, 0.0050, 0.0039],
    [0.3150, 0.2770, 0.2391, 0.2073, 0.1519, 0.1061, 0.0731, 0.0519, 0.0379, 0.0280],
    [0.3521, 0.3170, 0.2850, 0.2555, 0.2030, 0.1577, 0.1243, 0.0986, 0.0790, 0.0642]
)
putPrices = matrix(
    [0.0004, 0.0008, 0.0021, 0.0044, 0.0215, 0.0928, 0.1889, 0.2884, 0.3895, 0.4903],
    [0.0090, 0.0124, 0.0170, 0.0260, 0.0590, 0.1225, 0.1993, 0.2928, 0.3918, 0.4903],
    [0.0352, 0.0463, 0.0571, 0.0746, 0.1188, 0.1733, 0.2401, 0.3204, 0.4049, 0.4938],
    [0.0601, 0.0739, 0.0903, 0.1091, 0.1548, 0.2113, 0.2795, 0.3471, 0.4307, 0.5120]
)
strikes = matrix(
    [2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000],
    [2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000],
    [2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000],
    [2.8500, 2.9000, 2.9500, 3.0000, 3.1000, 3.2000, 3.3000, 3.4000, 3.5000, 3.6000]
)

// 3. Discount Curve 
// Data From https://www.chinamoney.com.cn/english/bmkycvirc/
terms = [1d, 1w, 2w, 3w, 1M, 2M, 3M, 6M, 9M, 1y, 18M, 2y, 3y]
dates = array(DATE, size(terms))
for(i in 0..(size(terms)-1)){
    dates[i] = transFreq(temporalAdd(referenceDate, terms[i]), "CFET", "right", "right")
}
discountCurveDict = {
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "curveName": "CNY_FR_007",
    "referenceDate": referenceDate,
    "currency": "CNY",
    "dayCountConvention": "Actual365",
    "compounding": "Continuous",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "dates": dates,
    "values":[1.5577, 1.5247, 1.5181, 1.5181, 1.5195, 1.5216, 1.5167, 1.4964, 1.4758, 1.4732, 1.4859, 1.4985,1.5306] \ 100
}
discountCurve = parseMktData(discountCurveDict)

// 4. Implied Dividend Curve
// Using Call-Put Parity on the full matrices
dividendCurve = eqDividendCurveBuilder(
    referenceDate, termDates, "CallPutParity", ,
    callPrices, putPrices, strikes, spot, discountCurve, "Actual365"
)

print(dividendCurve)

FuturesPrice

Build a dividend curve for the CSI 300 Index (000300.SH) using the futures price method.

referenceDate = 2026.02.13
spot = 4660.41  // Close Price Of 000300.SH

// 1. Futures Price
termDates = [2026.02.24, 2026.03.20, 2026.06.22, 2026.09.18] // IF2602/03/06/09 Expiry Date
futPrices = [4650.6, 4639.6, 4601.2, 4540.4]  // Settlement Price

// 2. Discount Curve
// Data From https://www.chinamoney.com.cn/english/bmkycvirc/
terms = [1d, 1w, 2w, 3w, 1M, 2M, 3M, 6M, 9M, 1y, 18M, 2y, 3y]
dates = array(DATE, size(terms))
for(i in 0..(size(terms)-1)){
    dates[i] = transFreq(temporalAdd(referenceDate, terms[i]), "CFET", "right", "right")
}
discountCurveDict = {
    "mktDataType": "Curve",
    "curveType": "IrYieldCurve",
    "curveName": "CNY_FR_007",
    "referenceDate": referenceDate,
    "currency": "CNY",
    "dayCountConvention": "Actual365",
    "compounding": "Continuous",
    "interpMethod": "Linear",
    "extrapMethod": "Flat",
    "dates": dates,
    "values":[1.5577, 1.5247, 1.5181, 1.5181, 1.5195, 1.5216, 1.5167, 1.4964, 1.4758, 1.4732, 1.4859, 1.4985, 1.5306] \ 100
}
discountCurve = parseMktData(discountCurveDict)

//3. Build Dividend Curve
dividendCurve = eqDividendCurveBuilder(referenceDate, termDates, "FuturesPrice", futPrices,
    , , , spot, discountCurve, "Actual365", "HS300")
print(dividendCurve)

Related Function: parseMktData