Skip to content

Commit 68e535c

Browse files
feat(New Features) : Revamp PA & FI API code snippets to support new features (#93)
1 parent 14cabda commit 68e535c

File tree

3 files changed

+104
-26
lines changed

3 files changed

+104
-26
lines changed

examples/fi_example.py

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@
1414
from fds.protobuf.stach.extensions.StachVersion import StachVersion
1515
from fds.protobuf.stach.extensions.StachExtensionFactory import StachExtensionFactory
1616
from fds.analyticsapi.engines.model.fi_market_environment import FIMarketEnvironment
17+
from fds.analyticsapi.engines.model.fi_bank_loans import FIBankLoans
18+
from fds.analyticsapi.engines.model.fi_municipal_bonds import FIMunicipalBonds
19+
from fds.analyticsapi.engines.model.fi_municipal_bonds_for_job_settings import FIMunicipalBondsForJobSettings
1720

1821
from urllib3 import Retry
1922

2023
host = os.environ['FACTSET_HOST']
2124
fds_username = os.environ['FACTSET_USERNAME']
2225
fds_api_key = os.environ['FACTSET_API_KEY']
2326

27+
2428
def main():
2529
config = Configuration()
2630
config.host = host
@@ -53,34 +57,55 @@ def main():
5357
"Effective Convexity",
5458
"CF Coupon"]
5559

60+
fi_bank_loans_for_securities = FIBankLoans(
61+
ignore_sinking_fund=True
62+
)
63+
64+
fi_municipal_bonds_for_securities = FIMunicipalBonds(
65+
ignore_sinking_fund=True
66+
)
67+
5668
security1 = FISecurity(
57-
calc_from_method = "Price",
58-
calc_from_value = 100.285,
59-
face = 10000.0,
60-
symbol = "912828ZG8",
61-
settlement = "20201202",
62-
discount_curve = "UST"
69+
calc_from_method="Price",
70+
calc_from_value=100.285,
71+
face=10000.0,
72+
symbol="912828ZG8",
73+
settlement="20201202",
74+
discount_curve="UST",
75+
bank_loans=fi_bank_loans_for_securities,
76+
municipal_bonds=fi_municipal_bonds_for_securities
6377
)
6478
security2 = FISecurity(
65-
calc_from_method = "Price",
66-
calc_from_value = 101.138,
67-
face = 200000.0,
68-
symbol = "US037833AR12",
69-
settlement = "20201203",
70-
discount_curve = "UST"
79+
calc_from_method="Price",
80+
calc_from_value=101.138,
81+
face=200000.0,
82+
symbol="US037833AR12",
83+
settlement="20201203",
84+
discount_curve="UST",
85+
bank_loans=fi_bank_loans_for_securities,
86+
municipal_bonds=fi_municipal_bonds_for_securities
7187
)
7288
rate_path = FIMarketEnvironment(
73-
rate_path = "FLAT & FORWARD"
89+
rate_path="FLAT & FORWARD"
90+
)
91+
92+
fi_bank_loans_for_JobSettings = FIBankLoans(
93+
ignore_sinking_fund=True
94+
)
95+
96+
fi_municipal_bonds_for_JobSettings = FIMunicipalBondsForJobSettings(
97+
ignore_sinking_fund=True
7498
)
75-
7699

77100
# uncomment the below code line to setup cache control; max-stale=0 will be a fresh adhoc run and the max-stale value is in seconds.
78101
# Results are by default cached for 12 hours; Setting max-stale=300 will fetch a cached result which is 5 minutes older.
79102
# cache_control = "max-stale=0"
80103

81104
securities = [security1, security2]
82105

83-
jobSettings = FIJobSettings(as_of_date="20201201",partial_duration_months =[1,3,6], market_environment=rate_path)
106+
jobSettings = FIJobSettings(as_of_date="20201201", partial_duration_months=[1, 3, 6], market_environment=rate_path,
107+
bank_loans=fi_bank_loans_for_JobSettings,
108+
municipal_bonds=fi_municipal_bonds_for_JobSettings)
84109

85110
fi_calculation_parameters = FICalculationParameters(securities, calculations, jobSettings)
86111

@@ -91,7 +116,7 @@ def main():
91116
fi_calculation_parameters_root=fi_calculation_parameters_root)
92117
# comment the above line and uncomment the below line to run the request with the cache_control header defined earlier
93118
# run_calculation_response = fi_calculations_api.post_and_calculate(
94-
# fi_calculation_parameters_root=fi_calculation_parameters_root, cache_control=cache_control)
119+
# fi_calculation_parameters_root=fi_calculation_parameters_root, cache_control=cache_control)
95120
if run_calculation_response[1] != 202 and run_calculation_response[1] != 201:
96121
print_error(run_calculation_response)
97122
sys.exit()

examples/pa_engine_multiple_unit_example.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
from fds.analyticsapi.engines import ApiException
77
from fds.analyticsapi.engines.api.pa_calculations_api import PACalculationsApi
88
from fds.analyticsapi.engines.api.components_api import ComponentsApi
9+
from fds.analyticsapi.engines.api.pricing_sources_api import PricingSourcesApi
910
from fds.analyticsapi.engines.api_client import ApiClient
1011
from fds.analyticsapi.engines.configuration import Configuration
1112
from fds.analyticsapi.engines.model.component_summary import ComponentSummary
1213
from fds.analyticsapi.engines.model.pa_calculation_parameters_root import PACalculationParametersRoot
1314
from fds.analyticsapi.engines.model.pa_calculation_parameters import PACalculationParameters
1415
from fds.analyticsapi.engines.model.pa_date_parameters import PADateParameters
1516
from fds.analyticsapi.engines.model.pa_identifier import PAIdentifier
17+
from fds.analyticsapi.engines.model.pa_calculation_data_sources import PACalculationDataSources
18+
from fds.analyticsapi.engines.model.pa_calculation_pricing_source import PACalculationPricingSource
1619
from fds.protobuf.stach.extensions.StachVersion import StachVersion
1720
from fds.protobuf.stach.extensions.StachExtensionFactory import StachExtensionFactory
1821

@@ -22,6 +25,7 @@
2225
fds_username = os.environ['FACTSET_USERNAME']
2326
fds_api_key = os.environ['FACTSET_API_KEY']
2427

28+
2529
def main():
2630
config = Configuration()
2731
config.host = host
@@ -39,6 +43,7 @@ def main():
3943
api_client = ApiClient(config)
4044

4145
components_api = ComponentsApi(api_client)
46+
pricingsources_api = PricingSourcesApi(api_client)
4247

4348
try:
4449
pa_document_name = "PA_DOCUMENTS:DEFAULT"
@@ -51,26 +56,48 @@ def main():
5156
frequency = "Monthly"
5257
holdings = "B&H"
5358
currency = "USD"
59+
pricing_source_name = "MSCI - Gross"
60+
pricing_source_category = "MSCI"
61+
pricing_source_directory = "Equity"
5462
# uncomment the below code line to setup cache control; max-stale=0 will be a fresh adhoc run and the max-stale value is in seconds.
55-
# Results are by default cached for 12 hours; Setting max-stale=300 will fetch a cached result which is 5 minutes older.
63+
# Results are by default cached for 12 hours; Setting max-stale=300 will fetch a cached result which is 5 minutes older.
5664
# cache_control = "max-stale=0"
5765
get_components_response = components_api.get_pa_components(document=pa_document_name)
5866
component_id = [id for id in list(
59-
get_components_response[0].data.keys()) if get_components_response[0].data[id].name == pa_component_name and get_components_response[0].data[id].category == pa_component_category][0]
67+
get_components_response[0].data.keys()) if get_components_response[0].data[id].name == pa_component_name and
68+
get_components_response[0].data[id].category == pa_component_category][0]
6069
print("PA Component Id: " + component_id)
6170
pa_accounts = [PAIdentifier(id=portfolio, holdingsmode=holdings)]
6271
pa_benchmarks = [PAIdentifier(id=benchmark, holdingsmode=holdings)]
6372
pa_dates = PADateParameters(
6473
startdate=startdate, enddate=enddate, frequency=frequency)
6574

75+
get_pricing_sources_response = pricingsources_api.get_pa_pricing_sources(name=pricing_source_name,
76+
category=pricing_source_category,
77+
directory=pricing_source_directory)
78+
pricing_source_id = [id for id in list(
79+
get_pricing_sources_response[0].data.keys()) if
80+
get_pricing_sources_response[0].data[id].name == pricing_source_name
81+
and get_pricing_sources_response[0].data[id].category == pricing_source_category
82+
and get_pricing_sources_response[0].data[id].directory == pricing_source_directory][0]
83+
84+
print("PA Pricing Source Id: " + pricing_source_id)
85+
86+
pa_pricing_sources = [PACalculationPricingSource(id=pricing_source_id)]
87+
88+
pa_datasources = PACalculationDataSources(portfoliopricingsources=pa_pricing_sources,
89+
useportfoliopricingsourcesforbenchmark=True)
90+
6691
pa_calculation_parameters = {"1": PACalculationParameters(componentid=component_id, accounts=pa_accounts,
67-
benchmarks=pa_benchmarks, dates=pa_dates, currencyisocode=currency),
92+
benchmarks=pa_benchmarks, dates=pa_dates,
93+
currencyisocode=currency, datasources=pa_datasources),
6894
"2": PACalculationParameters(componentid=component_id, accounts=pa_accounts,
69-
benchmarks=pa_benchmarks, dates=pa_dates, currencyisocode=currency)}
95+
benchmarks=pa_benchmarks, dates=pa_dates,
96+
currencyisocode=currency, datasources=pa_datasources)}
7097

7198
pa_calculation_parameter_root = PACalculationParametersRoot(
7299
data=pa_calculation_parameters)
73-
100+
74101
pa_calculations_api = PACalculationsApi(api_client)
75102

76103
post_and_calculate_response = pa_calculations_api.post_and_calculate(
@@ -134,4 +161,4 @@ def generate_excel(data_frames_list):
134161

135162

136163
if __name__ == '__main__':
137-
main()
164+
main()

examples/pa_engine_single_unit_example.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
from fds.analyticsapi.engines import ApiException
77
from fds.analyticsapi.engines.api.pa_calculations_api import PACalculationsApi
88
from fds.analyticsapi.engines.api.components_api import ComponentsApi
9+
from fds.analyticsapi.engines.api.pricing_sources_api import PricingSourcesApi
910
from fds.analyticsapi.engines.api_client import ApiClient
1011
from fds.analyticsapi.engines.configuration import Configuration
1112
from fds.analyticsapi.engines.model.component_summary import ComponentSummary
1213
from fds.analyticsapi.engines.model.pa_calculation_parameters_root import PACalculationParametersRoot
1314
from fds.analyticsapi.engines.model.pa_calculation_parameters import PACalculationParameters
1415
from fds.analyticsapi.engines.model.pa_date_parameters import PADateParameters
1516
from fds.analyticsapi.engines.model.pa_identifier import PAIdentifier
17+
from fds.analyticsapi.engines.model.pa_calculation_data_sources import PACalculationDataSources
18+
from fds.analyticsapi.engines.model.pa_calculation_pricing_source import PACalculationPricingSource
1619
from fds.protobuf.stach.extensions.StachVersion import StachVersion
1720
from fds.protobuf.stach.extensions.StachExtensionFactory import StachExtensionFactory
1821

@@ -22,6 +25,7 @@
2225
fds_username = os.environ['FACTSET_USERNAME']
2326
fds_api_key = os.environ['FACTSET_API_KEY']
2427

28+
2529
def main():
2630
config = Configuration()
2731
config.host = host
@@ -39,6 +43,7 @@ def main():
3943
api_client = ApiClient(config)
4044

4145
components_api = ComponentsApi(api_client)
46+
pricingsources_api = PricingSourcesApi(api_client)
4247

4348
try:
4449
pa_document_name = "PA_DOCUMENTS:DEFAULT"
@@ -51,21 +56,42 @@ def main():
5156
frequency = "Monthly"
5257
currency = "USD"
5358
holdings = "B&H"
59+
pricing_source_name = "MSCI - Gross"
60+
pricing_source_category = "MSCI"
61+
pricing_source_directory = "Equity"
5462
# uncomment the below code line to setup cache control; max-stale=0 will be a fresh adhoc run and the max-stale value is in seconds.
5563
# Results are by default cached for 12 hours; Setting max-stale=300 will fetch a cached result which is 5 minutes older.
5664
# cache_control = "max-stale=0"
5765
get_components_response = components_api.get_pa_components(document=pa_document_name)
5866
component_id = [id for id in list(
59-
get_components_response[0].data.keys()) if get_components_response[0].data[id].name == pa_component_name and get_components_response[0].data[id].category == pa_component_category][0]
67+
get_components_response[0].data.keys()) if get_components_response[0].data[id].name == pa_component_name and
68+
get_components_response[0].data[id].category == pa_component_category][0]
6069
print("PA Component Id: " + component_id)
6170
pa_accounts = [PAIdentifier(id=portfolio, holdingsmode=holdings)]
6271
pa_benchmarks = [PAIdentifier(id=benchmark, holdingsmode=holdings)]
72+
6373
pa_dates = PADateParameters(
6474
startdate=startdate, enddate=enddate, frequency=frequency)
6575

66-
pa_calculation_parameters = {"1": PACalculationParameters(componentid=component_id, accounts=pa_accounts,
67-
benchmarks=pa_benchmarks, dates=pa_dates, currencyisocode=currency)}
76+
get_pricing_sources_response = pricingsources_api.get_pa_pricing_sources(name=pricing_source_name,
77+
category=pricing_source_category,
78+
directory=pricing_source_directory)
79+
pricing_source_id = [id for id in list(
80+
get_pricing_sources_response[0].data.keys()) if
81+
get_pricing_sources_response[0].data[id].name == pricing_source_name
82+
and get_pricing_sources_response[0].data[id].category == pricing_source_category
83+
and get_pricing_sources_response[0].data[id].directory == pricing_source_directory][0]
84+
85+
print("PA Pricing Source Id: " + pricing_source_id)
6886

87+
pa_pricing_sources = [PACalculationPricingSource(id=pricing_source_id)]
88+
89+
pa_datasources = PACalculationDataSources(portfoliopricingsources=pa_pricing_sources,
90+
useportfoliopricingsourcesforbenchmark=True)
91+
92+
pa_calculation_parameters = {"1": PACalculationParameters(componentid=component_id, accounts=pa_accounts,
93+
benchmarks=pa_benchmarks, dates=pa_dates,
94+
currencyisocode=currency, datasources=pa_datasources)}
6995
pa_calculation_parameter_root = PACalculationParametersRoot(
7096
data=pa_calculation_parameters)
7197

@@ -135,4 +161,4 @@ def generate_excel(data_frames_list):
135161

136162

137163
if __name__ == '__main__':
138-
main()
164+
main()

0 commit comments

Comments
 (0)