question

Upvotes
Accepted
49 3 6 12

How to resolve the error 'The service failed to build the volatility surface'

When I executed the following script on CodeBook using RDP Libraries, I could plot a 3D chart of volatility surface, but I can NOT do so today having the following error message.

Can you please let me know the root cause of the error and how to resolve it?

INPUT:

import refinitiv.dataplatform as rdp
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D
import matplotlib.cm as cm
%matplotlib inline

session = rdp.open_desktop_session('DEFAULT_CODE_BOOK_APP_KEY')

endpoint = rdp.Endpoint(session, "https://api.refinitiv.com/data/quantitative-analytics-curves-and-surfaces/v1/surfaces")

request_body={
    "universe": [
        {   "surfaceTag": "RENAULT",
            "underlyingType": "Eti",
            "underlyingDefinition": {
                "instrumentCode": "RENA.PA"
            },
            "surfaceParameters": {
                "inputVolatilityType": "settle",
                "volatilityModel": "SSVI",
                "xAxis": "Date",
                "yAxis": "Moneyness"
            },
            "surfaceLayout": { "format": "Matrix" }
        },
        {   "surfaceTag": "PEUGEOT",
            "underlyingType": "Eti",
            "underlyingDefinition": {
                "instrumentCode": "PEUP.PA"
            },
            "surfaceParameters": {
                "inputVolatilityType": "settle",
                "volatilityModel": "SSVI",
                "xAxis": "Date",
                "yAxis": "Moneyness"
            },
            "surfaceLayout": { "format": "Matrix" }
        },
        {   "surfaceTag": "BMW",
            "underlyingType": "Eti",
            "underlyingDefinition": {
                "instrumentCode": "BMWG.DE"
            },
            "surfaceParameters": {
                "inputVolatilityType": "settle",
                "volatilityModel": "SSVI",
                "xAxis": "Date",
                "yAxis": "Moneyness"
            },
            "surfaceLayout": { "format": "Matrix" }
        },
        {   "surfaceTag": "VW",
            "underlyingType": "Eti",
            "underlyingDefinition": {
                "instrumentCode": "VOWG.DE"
            },
            "surfaceParameters": {
                "inputVolatilityType": "settle",
                "volatilityModel": "SSVI",
                "xAxis": "Date",
                "yAxis": "Moneyness"
            },
            "surfaceLayout": { "format": "Matrix" }
        }]
}

response = endpoint.send_request(
    method = rdp.Endpoint.RequestMethod.POST,
    body_parameters = request_body
)

def convert_yyyymmdd_to_float(time_axis):
    float_time_axis = []
    for time in time_axis:
        time = time.replace('-', '')
        float_time_axis.append(float(time))
    return float_time_axis

def plot_surface(surfaces, surfaceTag):
    #various imports removed for brevity
    surfaces = pd.DataFrame(data=surfaces)
    surfaces.set_index('surfaceTag', inplace=True)
    surface = surfaces[surfaces.index == surfaceTag]['surface'][0]
    
    strike_axis = surface[0][1:]
    surface = surface[1:]
    time_axis = []
    surface_grid = []
    for line in surface:
        time_axis.append(line[0])
        surface_grid_line = line[1:]
        surface_grid.append(surface_grid_line)

    time_axis = convert_yyyymmdd_to_float(time_axis)
    
    x = np.array(strike_axis, dtype=float)
    y = np.array(time_axis, dtype=float)
    ero = np.array(surface_grid, dtype=float)
    
    X,Y = np.meshgrid(x,y)
    Z = ero
    
    fig = plt.figure(figsize=[15,10])
    
    ax = plt.axes(projection='3d')
    ax.set_xlabel('moneyness')
    ax.set_ylabel('time to expiry')
    ax.set_zlabel('volatilities')
    
    surf = ax.plot_surface(X,Y,Z, cmap=cm.coolwarm, linewidth=0, antialiased=False)
    plt.show()

surfaces = response.data.raw['data']
plot_surface(surfaces, 'VW')

OUTPUT:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/opt/conda/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2894             try:
-> 2895                 return self._engine.get_loc(casted_key)
   2896             except KeyError as err:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'surface'

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
<ipython-input-35-aa5486f52eab> in <module>
      1 surfaces = response.data.raw['data']
----> 2 plot_surface(surfaces, 'VW')
      3 # plot_surface(surfaces, 'BMW')

<ipython-input-16-d9df2e95c642> in plot_surface(surfaces, surfaceTag)
     10     surfaces = pd.DataFrame(data=surfaces)
     11     surfaces.set_index('surfaceTag', inplace=True)
---> 12     surface = surfaces[surfaces.index == surfaceTag]['surface'][0]
     13 
     14     strike_axis = surface[0][1:]

/opt/conda/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key)
   2904             if self.columns.nlevels > 1:
   2905                 return self._getitem_multilevel(key)
-> 2906             indexer = self.columns.get_loc(key)
   2907             if is_integer(indexer):
   2908                 indexer = [indexer]

/opt/conda/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2895                 return self._engine.get_loc(casted_key)
   2896             except KeyError as err:
-> 2897                 raise KeyError(key) from err
   2898 
   2899         if tolerance is not None:

KeyError: 'surface'


INPUT:

surfaces

OUTPUT:

[{'surfaceTag': 'RENAULT',
  'error': {'id': '3b6ecb24-f876-4b9c-a965-9e05400fb629/e7b8fa38-c5b3-40b3-b1bb-8f7fad66fcde',
   'status': 'Error',
   'message': 'The service failed to build the volatility surface',
   'code': 'VolSurf.10300'}},
 {'surfaceTag': 'PEUGEOT',
  'error': {'id': '3b6ecb24-f876-4b9c-a965-9e05400fb629/4b652a29-ff3b-4277-9e44-d933273c8888',
   'status': 'Error',
   'message': 'Unknown underlying : PEUP.PA@RIC',
   'code': 'VolSurf.10008'}},
 {'surfaceTag': 'BMW',
  'error': {'id': '3b6ecb24-f876-4b9c-a965-9e05400fb629/854b01f4-a046-4340-a16e-8b5830496185',
   'status': 'Error',
   'message': 'The service failed to build the volatility surface',
   'code': 'VolSurf.10300'}},
 {'surfaceTag': 'VW',
  'error': {'id': '3b6ecb24-f876-4b9c-a965-9e05400fb629/2bee51a2-780f-40db-871b-15cdb883fc41',
   'status': 'Error',
   'message': 'The service failed to build the volatility surface',
   'code': 'VolSurf.10300'}}]
refinitiv-data-platformrefinitiv-data-platform-librariescodebookrdpipa
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

1 Answer

· Write an Answer
Upvotes
Accepted
25.3k 87 12 25

Hi @hiroko.yamaguchi1

If the code was working previously and has now stopped working - this is most likely due to a temporary issue with the IPA service.

I have just tried your code both in Codebook and as a standalone script connecting directly to RDP - and both are working fine.

If you are still having issues, and you have an RDP machineID + password etc, then I would recommend you try your code outside of Codebook.

If you continue to have issues, please raise a MyRefinitiv ticket for the 'Instrument Pricing Analytics - Refinitiv Data Platform ' Product or for Codebook - depending on whether your code works outside of Codebook or not.

Please attach your source code and output to the ticket.

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

I've confirmed I can retrieve the data successful again now. Thank you for looking into it!

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.