diff --git a/examples/README.md b/examples/README.md index a68b9fcd..54cc294f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -30,6 +30,7 @@ This repository contains Jupyter notebooks that show how to use [LUSID](https:// | [Paging and limiting LUSID's API calls.ipynb]() | Paging and limiting LUSID's API calls | Shows how to slice up large requests to LUSID into smaller requests using the limit and page parameters. | paging | | [Processing Corporate Actions as input transactions.ipynb]() | Processing Corporate Actions as input transactions | Demonstration of booking corporate action transactions using LUSID's standard input transactions | cocoon - seed_data, holdings, transaction configuration, transactions | | [Processing Corporate Actions as native LUSID transitions.ipynb]() | Processing Corporate Actions using LUSID transitions | Demonstration of booking corporate actions using LUSID's transitions | cocoon - seed_data, corporate actions, holdings, transaction configuration, transactions | +| [Structured Results Store for Portfolio Level Data.ipynb]() | Loading Portfolio Level data into SRS | Shows how you can load portfolio level valuation data into the Structured Results Store | Structured Result Store | | [Sub-holding Keys.ipynb]() | Sub-Holding Keys | Demonstration of how to set up and use sub-holding keys | cocoon - seed_data, holdings, properties, prorated, sub-holding keys | | [TimeVariant Properties.ipynb]() | Time-variant Properties (e.g. coupon schedule) in LUSID | Illustrates the use of time-variant properties, a type of property that depend on different effective dates. | coupon schedules, multi-valued properties, time-variant properties | @@ -78,9 +79,15 @@ This repository contains Jupyter notebooks that show how to use [LUSID](https:// | [Safely and efficiently test changes to your system.ipynb]() | Testing system changes | Demonstration of how to safely test changes to your data in a production environment | derived portfolios, instrument definitions, instruments, set holdings, transactions | | [Set up a sandbox trading environment.ipynb]() | Sandbox trading environment | Learn how to setup a virtual trading environment in LUSID. | aggregation, instruments, properties, quotes, reference portfolios, set holdings, transactions | +## examples/use-cases/data-quality-control +| filename | title | description | features | +| --- | --- | --- | --- | +| [Custom Entities.ipynb]() | Custom Entities in LUSID | Illustrates the use of Custom Entities. | Custom Entities, Data Quality, Portfolios, Relationship | + ## examples/use-cases/ibor | filename | title | description | features | | --- | --- | --- | --- | +| [Combining instrument properties with holding properties.ipynb]() | Combining instrument and holdings properties | | derived properties, security master, sub holding keys | | [Corporate Actions.ipynb]() | Equity - Handling Corporate Actions | | bonus issue, corporate actions, dividend, equity, merger, recipes, spin-off, split, valuations | | [Creating Portfolios With Different Tax Lot Management Methods.ipynb]() | Creating portfolios with different tax lot management methods | This notebook demonstrates how to create transaction portfolios under different tax lot accounting methodologies. | accounting, holdings, taxlots, transactions | | [Generating Corporate actions natively in LUSID.ipynb]() | Corporate Actions in LUSID | Demonstrates how to create and apply a corporate action to a portfolio. | corporate actions, derived portfolios, holdings, transactions | @@ -97,6 +104,7 @@ This repository contains Jupyter notebooks that show how to use [LUSID](https:// | [Portfolio types and portfolio groups in LUSID.ipynb]() | Portfolios and Portfolio Groups | Demonstrates how to do various operations with portfolios and portfolio groups. | commands, corporate actions, portfolio groups, portfolios, transactions | | [Reporting withholding tax separately for cash dividend corporate actions.ipynb]() | Reporting withholding tax separately for cash dividend corporate actions | | corporate actions, tax rule sets, transaction types | | [Running a Global Fund.ipynb]() | Running a global fund | Demonstration of using LUSID to run funds fed from multiple source systems across multiple regions | aggregation, cocoon, cut labels, instruments, quotes, recipes, transaction configuration, transactions | +| [Upserting a Large Payload.ipynb]() | Batch upserting Holdings | Illustrates how large payload of Holdings data that exceeds API limits can be batched. | Batch Upsert, Holdings | | [Using cut-labels to manage your business across different time-zones.ipynb]() | Cut Labels | Demonstrates how to use cut labels to simplify timestamps and streamline usage of LUSID when used across multiple timezones. | cut labels, holdings, instruments, transactions | ## examples/use-cases/instruments @@ -107,6 +115,8 @@ This repository contains Jupyter notebooks that show how to use [LUSID](https:// | [Equity Option.ipynb]() | Equity Option - Booking and valuing an Equity Option with physical settlement | | P&L, equity option, physical settlement, recipes, valuations | | [Equity Options - Pricing and risk using Black-Scholes.ipynb]() | Equity Option - Pricing and risk | | black scholes, equity option, exposure, inline valuations, market value, option delta | | [FX Forward.ipynb]() | FX Forward - Valuation Workflow | | FX Forwards, complex market data, recipes, valuations | +| [FX Option Vanilla.ipynb]() | Vanilla FX Options in LUSID | Modelling and valuing Vanilla FX Options. | FX Option | +| [Forward Rate Agreement.ipynb]() | Modelling Forward Rate Agreement in LUSID | Shows how you can model, load, and value FRAs in LUSID | A2B, Cashflows, Complex Market Data, Discounting Valuation Model, Forward Rate Agreement, Instruments | | [Funding Leg Swap.ipynb]() | Variable Funding Leg + Equity or Cash Instrument | Demonstrates creation and pricing of a funding leg with
variable notional and constructing a related position in
an stock or underlying instrument. This construct can be used
to represent the mechanics of a total return or equity swap. | aggregation, funding leg swap, instruments, market data store, quotes, results store | | [Interest Rate Swap.ipynb]() | Interest Rate Swap Valuation | Demonstrates pricing of an Interest Rate Swap based on a user defined Instrument. | instruments, lifecycle events, market data store, quotes, results store, valuation | | [Simple Equity.ipynb]() | Equity - Computing P&L and Handling Dividends for Equities | | P&L, dividend, equity, recipes, valuations | @@ -160,11 +170,14 @@ This repository contains Jupyter notebooks that show how to use [LUSID](https:// | [Futures Valuation with Differing Cost Basis Treatments (Synthetic Cash Method).ipynb]() | Futures Valuation Workflow | | futures, recipes, transaction types, valuations | | [Futures Valuation with Differing Cost Basis Treatments.ipynb]() | Futures Valuation Workflow | | futures, recipes, transaction types, valuations | | [Futures Valuation with notional cost and variation margin.ipynb]() | Futures Valuation Workflow | | futures, recipes, transaction types, valuations | +| [Fx Forward Upsert & Valuation.ipynb]() | FX Forward in LUSID | Modelling, upserting and valuing FX Forward in LUSID | FX Forward | +| [Inline Valuations with Inferred FX Rates.ipynb]() | Valuing inline portfolio w/ inferred fx rates | | inferred fx rates, inline portfolio | | [Look-through valuation (multi-level).ipynb]() | Look-through Valuation with Multiple Levels | The following notebook details how to compute PVs across different levels of look-through for
both securitised funds and Index Futures | futures, instruments, recipes, securitised portfolios, transactions, valuation | | [Look-through valuation.ipynb]() | Portfolio look-through in LUSID | Shows how to compute the value of a child portfolio's holding as though they were directly held by the parent portfolio. | holdings, look through, portfolios, securitised portfolios, valuations | | [SRS csv Example.ipynb]() | Structured Results Store for storage of Portfolio data | | luminesce, structured_results_store, virtual_document | | [Simple Valuation.ipynb]() | Simple valuation with default recipes | This notebook shows how to value a portfolio using defatul recipes, for an out of the box look at positions and valuations | manifests, recipes, transactions, valuation | | [Valuation Analysis.ipynb]() | Valuation Debugging | | instruments, recipes, transactions, valuation, valuation manifest | +| [Valuations with Inferred FX Rates.ipynb]() | Inferred FX Rates in LUSID | Valuing Portfolio in LUSID using inferred FX rates | inferred fx rates | | [Valuations with recipes.ipynb]() | Valuation with recipes | This notebook shows how to value a portfolio using recipes with different pricing sources | manifests, recipes, transactions, valuation | ## examples/use-cases/wealth-management diff --git a/examples/features/core-lusid/Structured Results Store for Portfolio Level Data.ipynb b/examples/features/core-lusid/Structured Results Store for Portfolio Level Data.ipynb index 51b14e2d..7213f8f8 100644 --- a/examples/features/core-lusid/Structured Results Store for Portfolio Level Data.ipynb +++ b/examples/features/core-lusid/Structured Results Store for Portfolio Level Data.ipynb @@ -35,6 +35,15 @@ "source": [ "from lusidtools.jupyter_tools import toggle_code\n", "\n", + "\"\"\"Loading Portfolio Level data into SRS\n", + "\n", + "Shows how you can load portfolio level valuation data into the Structured Results Store\n", + "\n", + "Attributes\n", + "----------\n", + "Structured Result Store\n", + "\"\"\"\n", + "\n", "toggle_code(\"Toggle Docstring\")\n" ] }, diff --git a/examples/use-cases/data-quality-control/Custom Entities.ipynb b/examples/use-cases/data-quality-control/Custom Entities.ipynb index b826b075..8f43b1ed 100644 --- a/examples/use-cases/data-quality-control/Custom Entities.ipynb +++ b/examples/use-cases/data-quality-control/Custom Entities.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using Custom Entities to track Portfolio data quality\n", - "\n", - "In this Notebook, we demonstrate how Custom Entities can be used to support Data Quality check on Portfolios.\n", - "We will create a new Custom Entity type named Portfolio_DataQuality which stores a list of attributes defining the 'Quality' of a Portfolio.\n", - "Each Portfolio will be linked ([Relationship feature](https://support.lusid.com/knowledgebase/article/KA-01679/)) to one or many Portfolio_DataQuality entities." - ] - }, { "cell_type": "code", "execution_count": 1, @@ -54,12 +43,25 @@ "Custom Entities\n", "Portfolios\n", "Data Quality\n", - "RelationShip\n", + "Relationship\n", "\"\"\"\n", "\n", "toggle_code(\"Toggle Docstring\")" ] }, + { + "cell_type": "markdown", + "source": [ + "# Using Custom Entities to track Portfolio data quality\n", + "\n", + "In this Notebook, we demonstrate how Custom Entities can be used to support Data Quality check on Portfolios.\n", + "We will create a new Custom Entity type named Portfolio_DataQuality which stores a list of attributes defining the 'Quality' of a Portfolio.\n", + "Each Portfolio will be linked ([Relationship feature](https://support.lusid.com/knowledgebase/article/KA-01679/)) to one or many Portfolio_DataQuality entities." + ], + "metadata": { + "collapsed": false + } + }, { "cell_type": "code", "execution_count": 2, diff --git a/examples/use-cases/ibor/Combining instrument properties with holding properties.ipynb b/examples/use-cases/ibor/Combining instrument properties with holding properties.ipynb index be7319c0..8bcaf122 100644 --- a/examples/use-cases/ibor/Combining instrument properties with holding properties.ipynb +++ b/examples/use-cases/ibor/Combining instrument properties with holding properties.ipynb @@ -1,5 +1,27 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from lusidtools.jupyter_tools import toggle_code\n", + "\n", + "\"\"\"Combining instrument and holdings properties\n", + "\n", + "Attributes\n", + "----------\n", + "security master\n", + "derived properties\n", + "sub holding keys\n", + "\"\"\"\n", + "\n", + "toggle_code(\"Toggle Docstring\")" + ], + "metadata": { + "collapsed": false + } + }, { "cell_type": "markdown", "metadata": {}, diff --git a/examples/use-cases/ibor/Upserting a Large Payload.ipynb b/examples/use-cases/ibor/Upserting a Large Payload.ipynb index 66a9c2fa..53c84f3b 100644 --- a/examples/use-cases/ibor/Upserting a Large Payload.ipynb +++ b/examples/use-cases/ibor/Upserting a Large Payload.ipynb @@ -1,9 +1,30 @@ { "cells": [ { - "attachments": {}, + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from lusidtools.jupyter_tools import toggle_code\n", + "\n", + "\"\"\"Batch upserting Holdings\n", + "\n", + "Illustrates how large payload of Holdings data that exceeds API limits can be batched.\n", + "\n", + "Attributes\n", + "----------\n", + "Holdings\n", + "Batch Upsert\n", + "\"\"\"\n", + "\n", + "toggle_code(\"Toggle Docstring\")" + ], + "metadata": { + "collapsed": false + } + }, + { "cell_type": "markdown", - "metadata": {}, "source": [ "# Upserting a Large Payload of Holdings\n", "\n", @@ -13,12 +34,14 @@ "- 1. [Creating Sample Holdings Data](#1.-Creating-Sample-Holdings-Data)\n", "- 2. [Dividing the Data](#2.-Dividing-the-Data)\n", "- 3. [Upserting the Parts](#3.-Upserting-the-Parts)" - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", "execution_count": 13, - "metadata": {}, "outputs": [ { "name": "stdout", @@ -77,7 +100,10 @@ " \"LUSID API Version :\",\n", " api_factory.build(lu.api.ApplicationMetadataApi).get_lusid_versions().build_version,\n", ")\n" - ] + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", diff --git a/examples/use-cases/instruments/FX Option Vanilla.ipynb b/examples/use-cases/instruments/FX Option Vanilla.ipynb index 86807694..ab951abc 100644 --- a/examples/use-cases/instruments/FX Option Vanilla.ipynb +++ b/examples/use-cases/instruments/FX Option Vanilla.ipynb @@ -1,5 +1,27 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from lusidtools.jupyter_tools import toggle_code\n", + "\n", + "\"\"\"Vanilla FX Options in LUSID\n", + "\n", + "Modelling and valuing Vanilla FX Options.\n", + "\n", + "Attributes\n", + "----------\n", + "FX Option\n", + "\"\"\"\n", + "\n", + "toggle_code(\"Toggle Docstring\")" + ], + "metadata": { + "collapsed": false + } + }, { "cell_type": "markdown", "metadata": {}, @@ -21,11 +43,7 @@ { "cell_type": "code", "execution_count": 37, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "data": { @@ -97,11 +115,7 @@ { "cell_type": "code", "execution_count": 38, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Set required APIs\n", @@ -117,11 +131,7 @@ { "cell_type": "code", "execution_count": 39, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Define scopes\n", @@ -185,11 +195,7 @@ { "cell_type": "code", "execution_count": 41, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "portfolio_code = \"fxOption\"\n", @@ -224,11 +230,7 @@ { "cell_type": "code", "execution_count": 42, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Define function that creates an FX option\n", @@ -381,11 +383,7 @@ { "cell_type": "code", "execution_count": 45, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -491,11 +489,7 @@ }, { "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, + "metadata": {}, "source": [ "## 4.1 FX Spot Rates\n", "\n", @@ -505,11 +499,7 @@ { "cell_type": "code", "execution_count": 47, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "data": { @@ -597,11 +587,7 @@ { "cell_type": "code", "execution_count": 48, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -643,11 +629,7 @@ }, { "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, + "metadata": {}, "source": [ "## 4.2 EUR & USD Discount curves\n", "\n", @@ -657,11 +639,7 @@ { "cell_type": "code", "execution_count": 49, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "data": { @@ -947,11 +925,7 @@ { "cell_type": "code", "execution_count": 51, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -989,11 +963,7 @@ }, { "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, + "metadata": {}, "source": [ "We can also use the _ComplexMarketDataApi_ to retrieve the data as it's been stored in LUSID. See below for the returned object, and a plot showing both OIS discount curves." ] @@ -1001,11 +971,7 @@ { "cell_type": "code", "execution_count": 52, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "data": { diff --git a/examples/use-cases/instruments/Forward Rate Agreement.ipynb b/examples/use-cases/instruments/Forward Rate Agreement.ipynb index 158c54da..084a2565 100644 --- a/examples/use-cases/instruments/Forward Rate Agreement.ipynb +++ b/examples/use-cases/instruments/Forward Rate Agreement.ipynb @@ -1,5 +1,32 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from lusidtools.jupyter_tools import toggle_code\n", + "\n", + "\"\"\"Modelling Forward Rate Agreement in LUSID\n", + "\n", + "Shows how you can model, load, and value FRAs in LUSID\n", + "\n", + "Attributes\n", + "----------\n", + "Instruments\n", + "Forward Rate Agreement\n", + "Complex Market Data\n", + "Discounting Valuation Model\n", + "Cashflows\n", + "A2B\n", + "\"\"\"\n", + "\n", + "toggle_code(\"Toggle Docstring\")" + ], + "metadata": { + "collapsed": false + } + }, { "cell_type": "markdown", "metadata": {}, @@ -23,11 +50,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "data": { @@ -102,11 +125,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Set required APIs\n", @@ -122,11 +141,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Define scopes\n", @@ -147,11 +162,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -193,11 +204,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Define function that creates a FRA\n", @@ -310,11 +317,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -363,11 +366,7 @@ }, { "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, + "metadata": {}, "source": [ "## 4.1 EUR Discount curves\n", "\n", @@ -377,11 +376,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "data": { @@ -592,11 +587,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -647,11 +638,7 @@ }, { "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, + "metadata": {}, "source": [ "We can also use the _ComplexMarketDataApi_ to retrieve the data as it's been stored in LUSID. See below for the returned object, and a plot showing both the OIS and LIBOR curves." ] @@ -659,11 +646,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [ { "data": { diff --git a/examples/use-cases/valuation/Fx Forward Upsert & Valuation.ipynb b/examples/use-cases/valuation/Fx Forward Upsert & Valuation.ipynb index 471fb748..04c8e6c2 100644 --- a/examples/use-cases/valuation/Fx Forward Upsert & Valuation.ipynb +++ b/examples/use-cases/valuation/Fx Forward Upsert & Valuation.ipynb @@ -1,5 +1,27 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from lusidtools.jupyter_tools import toggle_code\n", + "\n", + "\"\"\"FX Forward in LUSID\n", + "\n", + "Modelling, upserting and valuing FX Forward in LUSID\n", + "\n", + "Attributes\n", + "----------\n", + "FX Forward\n", + "\"\"\"\n", + "\n", + "toggle_code(\"Toggle Docstring\")" + ], + "metadata": { + "collapsed": false + } + }, { "cell_type": "markdown", "id": "6fbaf4cf", diff --git a/examples/use-cases/valuation/Inline Valuations with Inferred FX Rates.ipynb b/examples/use-cases/valuation/Inline Valuations with Inferred FX Rates.ipynb index 5daa57ed..d569b506 100644 --- a/examples/use-cases/valuation/Inline Valuations with Inferred FX Rates.ipynb +++ b/examples/use-cases/valuation/Inline Valuations with Inferred FX Rates.ipynb @@ -1,12 +1,29 @@ { "cells": [ { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from lusidtools.jupyter_tools import toggle_code\n", + "\n", + "\"\"\"Valuing inline portfolio w/ inferred fx rates\n", + "\n", + "Attributes\n", + "----------\n", + "inline portfolio\n", + "inferred fx rates\n", + "\"\"\"\n", + "\n", + "toggle_code(\"Toggle Docstring\")" + ], "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, + "collapsed": false + } + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ "# Valuation using Inferred FX Rates (for an inline portfolio)\n", "\n", diff --git a/examples/use-cases/valuation/Valuations with Inferred FX Rates.ipynb b/examples/use-cases/valuation/Valuations with Inferred FX Rates.ipynb index d2be95d1..1264ab80 100644 --- a/examples/use-cases/valuation/Valuations with Inferred FX Rates.ipynb +++ b/examples/use-cases/valuation/Valuations with Inferred FX Rates.ipynb @@ -1,12 +1,30 @@ { "cells": [ { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from lusidtools.jupyter_tools import toggle_code\n", + "\n", + "\"\"\"Inferred FX Rates in LUSID\n", + "\n", + "Valuing Portfolio in LUSID using inferred FX rates\n", + "\n", + "Attributes\n", + "----------\n", + "inferred fx rates\n", + "\"\"\"\n", + "\n", + "toggle_code(\"Toggle Docstring\")" + ], "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, + "collapsed": false + } + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ "# Valuation with Inferred FX Rates\n", "\n",