{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "BK-O7y-k-lC0" }, "source": [ "# **Jupyter Widgets**\n", "\n", "## This is what I learned from SciPy 2022 Conference held in Austin during July. I met Itay Dafna from Bloomberg who showed how to intergrate Jupyter Widgets in presenting market data.\n", "\n", "### A Python widget is an object that represents a control on the front end, like a slider. A single control can be displayed multiple times - they all represent the same python object." ] }, { "cell_type": "code", "source": [ "!pip install ipywidgets" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uXKUYP98-oYN", "outputId": "1c2a67a0-f178-4839-c771-a6a0d8074b4f" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", "Requirement already satisfied: ipywidgets in /usr/local/lib/python3.7/dist-packages (7.7.1)\n", "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets) (3.6.1)\n", "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets) (1.1.1)\n", "Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets) (5.5.0)\n", "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.7/dist-packages (from ipywidgets) (5.1.1)\n", "Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.7/dist-packages (from ipywidgets) (4.10.1)\n", "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets) (0.2.0)\n", "Requirement already satisfied: tornado>=4.0 in /usr/local/lib/python3.7/dist-packages (from ipykernel>=4.5.1->ipywidgets) (5.1.1)\n", "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.7/dist-packages (from ipykernel>=4.5.1->ipywidgets) (5.3.5)\n", "Requirement already satisfied: prompt-toolkit<2.0.0,>=1.0.4 in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets) (1.0.18)\n", "Requirement already satisfied: pygments in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets) (2.6.1)\n", "Requirement already satisfied: pickleshare in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)\n", "Requirement already satisfied: pexpect in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)\n", "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets) (57.4.0)\n", "Requirement already satisfied: decorator in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets) (4.4.2)\n", "Requirement already satisfied: simplegeneric>0.8 in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets) (0.8.1)\n", "Requirement already satisfied: wcwidth in /usr/local/lib/python3.7/dist-packages (from prompt-toolkit<2.0.0,>=1.0.4->ipython>=4.0.0->ipywidgets) (0.2.5)\n", "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.7/dist-packages (from prompt-toolkit<2.0.0,>=1.0.4->ipython>=4.0.0->ipywidgets) (1.15.0)\n", "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.7/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets) (5.3.1)\n", "Requirement already satisfied: jinja2 in /usr/local/lib/python3.7/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.11.3)\n", "Requirement already satisfied: jupyter-core>=4.4.0 in /usr/local/lib/python3.7/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.11.1)\n", "Requirement already satisfied: terminado>=0.8.1 in /usr/local/lib/python3.7/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.13.3)\n", "Requirement already satisfied: Send2Trash in /usr/local/lib/python3.7/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.8.0)\n", "Requirement already satisfied: nbformat in /usr/local/lib/python3.7/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.4.0)\n", "Requirement already satisfied: nbconvert in /usr/local/lib/python3.7/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.6.1)\n", "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", "Requirement already satisfied: pyzmq>=13 in /usr/local/lib/python3.7/dist-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets) (23.2.0)\n", "Requirement already satisfied: ptyprocess in /usr/local/lib/python3.7/dist-packages (from terminado>=0.8.1->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.0)\n", "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.0.1)\n", "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.7/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.4)\n", "Requirement already satisfied: defusedxml in /usr/local/lib/python3.7/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.7.1)\n", "Requirement already satisfied: testpath in /usr/local/lib/python3.7/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.6.0)\n", "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.7/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (1.5.0)\n", "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.7/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.8.4)\n", "Requirement already satisfied: bleach in /usr/local/lib/python3.7/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.0.1)\n", "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.7/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.3.3)\n", "Requirement already satisfied: fastjsonschema in /usr/local/lib/python3.7/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (2.16.1)\n", "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.7/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.18.1)\n", "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.12.0)\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (4.1.1)\n", "Requirement already satisfied: importlib-resources>=1.4.0 in /usr/local/lib/python3.7/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (5.9.0)\n", "Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.7/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (22.1.0)\n", "Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.7/dist-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (3.8.1)\n", "Requirement already satisfied: webencodings in /usr/local/lib/python3.7/dist-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets) (0.5.1)\n" ] } ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ePP_gI0a-lC6" }, "outputs": [], "source": [ "import ipywidgets as widgets" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 49, "referenced_widgets": [ "d4ac185b1c0c48bbb8818f15de94dbbb", "59435ea7b6664dbe9dff7fb71eb0e88c", "09a3f3920b304077a48b258ec732e958" ] }, "id": "tBl1Nze7-lC7", "outputId": "a87b3bf6-52ca-49e6-e8da-ba420022beab" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "FloatSlider(value=8.0, description='Input:', max=10.0, min=5.0)" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "d4ac185b1c0c48bbb8818f15de94dbbb" } }, "metadata": {} } ], "source": [ "slider = widgets.FloatSlider(\n", " value=8.0,\n", " min=5.0,\n", " max=10.0,\n", " step=0.1,\n", " description='Input:',\n", ")\n", "\n", "slider" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "0FowCaEm-lC-" }, "outputs": [], "source": [ "import ipywidgets as ipw" ] }, { "cell_type": "code", "source": [ "def f(x):\n", " print(x * x)" ], "metadata": { "id": "UqXLBiAu_M6A" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 67, "referenced_widgets": [ "8df35378a8184679859c34a17344787a", "49677f28b8e54d20a4b12b4afd383440", "c501fd9d596b4c3d8de3782a54b5bce8", "0864fd7625e542c5aeab6c93c0d36c6b", "91eb40cb7a8d4ff2a566605c160637f7", "61e20787b8e74c23a0c7eaa58df79415", "0e353e924e3845619d8ae14f55c48800" ] }, "id": "slBUihn4-lC_", "outputId": "dec25497-27a4-4fad-8923-c94f694cb718" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "interactive(children=(IntSlider(value=50, description='x'), Output()), _dom_classes=('widget-interact',))" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "8df35378a8184679859c34a17344787a" } }, "metadata": {} } ], "source": [ "widgets.interact(f, x=(0, 100, 1));" ] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "zLXbZhw4pHv7" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "pip install quandl" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "oxTbNBXCpHt8", "outputId": "85c04249-c360-46b5-f0ad-9138530cee62" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", "Requirement already satisfied: quandl in /usr/local/lib/python3.7/dist-packages (3.7.0)\n", "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from quandl) (1.15.0)\n", "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.7/dist-packages (from quandl) (2.8.2)\n", "Requirement already satisfied: more-itertools in /usr/local/lib/python3.7/dist-packages (from quandl) (8.13.0)\n", "Requirement already satisfied: requests>=2.7.0 in /usr/local/lib/python3.7/dist-packages (from quandl) (2.23.0)\n", "Requirement already satisfied: pandas>=0.14 in /usr/local/lib/python3.7/dist-packages (from quandl) (1.3.5)\n", "Requirement already satisfied: numpy>=1.8 in /usr/local/lib/python3.7/dist-packages (from quandl) (1.21.6)\n", "Requirement already satisfied: inflection>=0.3.1 in /usr/local/lib/python3.7/dist-packages (from quandl) (0.5.1)\n", "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.14->quandl) (2022.1)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests>=2.7.0->quandl) (2.10)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests>=2.7.0->quandl) (3.0.4)\n", "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests>=2.7.0->quandl) (1.24.3)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests>=2.7.0->quandl) (2022.6.15)\n" ] } ] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "8c96W00RpHrZ" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "import quandl as ql\n", "%matplotlib inline\n", "\n", "yield_ = ql.get(\"USTREASURY/YIELD\")\n", "yield_" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 455 }, "id": "NQbSklVOhf9x", "outputId": "5861eb49-47c6-423f-9e84-42e6196a2af0" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 1 MO 2 MO 3 MO 6 MO 1 YR 2 YR 3 YR 5 YR 7 YR 10 YR \\\n", "Date \n", "1990-01-02 NaN NaN 7.83 7.89 7.81 7.87 7.90 7.87 7.98 7.94 \n", "1990-01-03 NaN NaN 7.89 7.94 7.85 7.94 7.96 7.92 8.04 7.99 \n", "1990-01-04 NaN NaN 7.84 7.90 7.82 7.92 7.93 7.91 8.02 7.98 \n", "1990-01-05 NaN NaN 7.79 7.85 7.79 7.90 7.94 7.92 8.03 7.99 \n", "1990-01-08 NaN NaN 7.79 7.88 7.81 7.90 7.95 7.92 8.05 8.02 \n", "... ... ... ... ... ... ... ... ... ... ... \n", "2022-01-31 0.03 0.13 0.22 0.49 0.78 1.18 1.39 1.62 1.75 1.79 \n", "2022-02-01 0.04 0.10 0.19 0.48 0.78 1.18 1.39 1.63 1.76 1.81 \n", "2022-02-02 0.04 0.10 0.19 0.45 0.76 1.16 1.38 1.60 1.74 1.78 \n", "2022-02-03 0.03 0.15 0.20 0.48 0.78 1.19 1.42 1.66 1.78 1.82 \n", "2022-02-04 0.05 0.12 0.23 0.56 0.89 1.31 1.55 1.78 1.90 1.93 \n", "\n", " 20 YR 30 YR \n", "Date \n", "1990-01-02 NaN 8.00 \n", "1990-01-03 NaN 8.04 \n", "1990-01-04 NaN 8.04 \n", "1990-01-05 NaN 8.06 \n", "1990-01-08 NaN 8.09 \n", "... ... ... \n", "2022-01-31 2.17 2.11 \n", "2022-02-01 2.19 2.12 \n", "2022-02-02 2.17 2.11 \n", "2022-02-03 2.20 2.14 \n", "2022-02-04 2.29 2.23 \n", "\n", "[8032 rows x 12 columns]" ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
1 MO2 MO3 MO6 MO1 YR2 YR3 YR5 YR7 YR10 YR20 YR30 YR
Date
1990-01-02NaNNaN7.837.897.817.877.907.877.987.94NaN8.00
1990-01-03NaNNaN7.897.947.857.947.967.928.047.99NaN8.04
1990-01-04NaNNaN7.847.907.827.927.937.918.027.98NaN8.04
1990-01-05NaNNaN7.797.857.797.907.947.928.037.99NaN8.06
1990-01-08NaNNaN7.797.887.817.907.957.928.058.02NaN8.09
.......................................
2022-01-310.030.130.220.490.781.181.391.621.751.792.172.11
2022-02-010.040.100.190.480.781.181.391.631.761.812.192.12
2022-02-020.040.100.190.450.761.161.381.601.741.782.172.11
2022-02-030.030.150.200.480.781.191.421.661.781.822.202.14
2022-02-040.050.120.230.560.891.311.551.781.901.932.292.23
\n", "

8032 rows × 12 columns

\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {}, "execution_count": 11 } ] }, { "cell_type": "code", "source": [ "today = yield_.iloc[-1,:]\n", "month_ago = yield_.iloc[-30,:]\n", "df = pd.concat([today, month_ago], axis=1)\n", "df.columns = ['today', 'month_ago']\n", "\n", "df.plot(style={'today': 'ro-', 'month_ago': 'bx--'}\n", " ,title='Treasury Yield Curve, %');" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 281 }, "id": "BUTmvAIqpHj3", "outputId": "793978cc-fbff-408f-dad3-2cffc8f2e146" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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qVMn2rRpQ82aNcs9PucccN998NxzcMcdlsxLgwg0aWKX887L2b5mTe5yzeTJsGNH7vtm96oppYQevydF77vP6l2Rqla17XupWrVqbNq0CYAOHTowceJEdu7cyZo1a5gxYwbHHnssJ5100u7tK1euJCMjA2B38q5VqxabN2/O1fOlSpUqdO7cmQEDBtCvX7+9js85VwIvvgh33gmXXAJDh5b989WuDaedBjffDOPHF3wStaDeNnshdlvoRcn+Rhs0yN6Q1FRL5iX4pqtZsyYnnHACzZs3p2vXrrRs2ZKjjz4aEWH48OHUrVuX7t27M336dI466ihSU1M5/vjjAahRowZXXXUVzZs3p27durRr1y5PuH2YMmUKp59++l7H55zbS9OmwRVXQFoajB5trerylpqaf1UhNbXUniK0NUXbtm2reRe4+P777/nrX/8aSjxl7eGHH2bDhg3cc889YYeyWyK/387t9u23cMIJ0LAhzJwJNWqEE0fennmQu1dNlETkS1Vtm9+++G2hx5Hu3buzaNEipk+fHnYoziWXFSuga1fYbz94553wkjmUSVUhL0/o5WDKlClhh+Bc8tm0Cc48E37/HWbMKNXSxl7r06dM54nxhO6cSzxZWXDBBVZueestG/STBDyhO+cSS96+5l26hB1RuYnfbovOOZefsuhrHic8oTvnEkd59zWPMZ7QnXOJIRb6mocsbhP68OEQDNLcLSOjeNMylJe80/J+9NFHnHXWWSFG5FyC+fZbG3Z/5JHw2msQMQtqMonbhN6uHfTsmZPUMzLsdp4BmjHB51l3rgzFUl/zkMV0Qu/Ycc9Ldl487jibn75zZ5uPq3Nnu509snbt2j3vG40lS5bQtGlT+vbtyxFHHEGfPn348MMPOeGEEzj88MOZNWsWv/32G+eeey4tW7akffv2zJs3D4DBgwdz+eWX07FjRw499FCeeOIJIPc86zfddBMAmzdvpkePHjRt2pQ+ffpQ2IjdoUOH0q5dO5o3b07//v13H5uZmUnLli13P27z5s0Bm1emX79+tGjRgtatW++eb8a5hBPZ1/ztt2Ojr3mIYjqhF+XAA6FePRt0Va+e3S4NP/74I//6179YsGABCxYs4OWXX2bmzJk8/PDDDBs2jLvvvpvWrVszb948hg0bxqXZ02gCCxYs4L333mPWrFkMGTKErKwsHnjgAQ47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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "nSsFXrdD_GxM" }, "source": [ "# A simple Python zero-coupon bond calculator #\n", "A zero-coupon bond is a bond that does not pay any periodic interest except on maturity, where the principal or face value is repaid. Zero-coupon bonds are also called pure discount bonds.\n", "
\n", "$$price \\ of \\ zero \\ coupon \\ bond = \\frac{Face\\ Value}{(1+YTM)^t} $$\n", "
\n", "\n", "\n", "#####LaTex: https://towardsdatascience.com/write-markdown-latex-in-the-jupyter-notebook-10985edb91fd" ] }, { "cell_type": "markdown", "metadata": { "id": "tQ_mNLTzfQCx" }, "source": [ "A coupon bond is a bond that pays periodic interests plus par value on maturity. A price of a bond is the sum of all present values of coupon and principal. \n", "
\n", "$$price \\ of \\ a \\ coupon \\ bond = \\Sigma \\frac{Coupon}{(1+YTM)^t} + \\frac{Par \\ Value}{(1 + YTM)^t} \n", "$$\n", "

\n", "\n", "##### In order to find YTM, the following code is use scipy optimize.Newton iterative process.\n", "https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html\n" ] }, { "cell_type": "code", "source": [ "def bondprice(ytm, period, par, coupon):\n", " price_bond = par*coupon/2*(1-(1+ytm/2)**(-2*period))/(ytm/2) + par/(1+ytm/2)**(2*period)\n", " print(\"${:.2f}\".format(price_bond))\n" ], "metadata": { "id": "WSoiX0HQAtQs" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "bondprice(0.09, 20, 1000, 0.08)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZXxCVbpfehd6", "outputId": "de7602ad-3dd3-41ad-f5a8-66ca44c837b2" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "$907.99\n" ] } ] }, { "cell_type": "code", "source": [ "def bondprice2(ytm, period, par, coupon):\n", " price_bond = par*coupon/2*(1-(1+ytm/2)**(-2*period))/(ytm/2) + par/(1+ytm/2)**(2*period)\n", " return price_bond" ], "metadata": { "id": "2Af1oeuB235U" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "import pandas as pd\n", "import numpy as np\n", "yield_b = np.linspace(0.03, 0.7, num=69)\n", "#yield_b" ], "metadata": { "id": "9ZJVlMe5qRNv" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "price_b = np.zeros([69,1])\n", "price_b.shape\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "b6B43nN-qREL", "outputId": "a2a54b36-b6c4-4ad0-bfb2-cd694912ecfb" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(69, 1)" ] }, "metadata": {}, "execution_count": 18 } ] }, { "cell_type": "code", "source": [ "for ind in range(3, 72):\n", " price_b[ind-3]=(bondprice2(ind/100, period=2, par=1000, coupon=0.08))\n", "\n", "#print(price_b)\n", "print(yield_b.shape)\n", "print(price_b.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WIKEGnBSAphA", "outputId": "ff3237b9-df5e-41a6-be49-dea57e613623" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(69,)\n", "(69, 1)\n" ] } ] }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.rcParams['figure.figsize'] = [8, 5]\n", "plt.plot(yield_b, price_b)\n", "plt.show()\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 320 }, "id": "6qQZhWEl_pYn", "outputId": "f3bedf1a-35f3-4702-b647-489a1f13b8a7" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "

" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "oqIFsdrD_pV-" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "reQ77cS3_pS5" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "widgets.interact(bondprice, ytm=(0.05, 0.7, 0.01), period=(1,30, 1), par=(100,1000, 100), coupon=(0.05, 0.7, 0.01))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 181, "referenced_widgets": [ "e1431d66953a49f2b19e7e190f21db90", "4dfe9a65494642dfac862b392a1cb807", "46dc07e6c2ab4d3a8559fec00ac1c6a8", "11619a4b8b37413b8a67db2903d51175", "f709e69d71fb443baac004430f873e64", "a84a47fb01dc452ea80c569c0bbc7854", "12ddca1cbd1b4771ab4bdb0536ef3004", "25ace811954b4b47add87fb6c722c822", "57c3f9319ac249cda351b7a3ab0cfbe2", "0eb9238af7d34b8aa694cf6739bb681e", "c9c6be249ab3495db7cb9d45255e1449", "b9078e427df44def987b9c93def14035", "4f45ac000ec44100839cc085a220d6fb", "4f6eacbe6d21425fb06ca11180be5e3d", "a9efa48a50a74c31984c36aa6b4b4408", "16f817f48c24432fa8cc642ec16ae8e8" ] }, "id": "XYvAWURlLWTb", "outputId": "ada2abd0-d984-4265-d6a2-7c9840d7d83c" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "interactive(children=(FloatSlider(value=0.37, description='ytm', max=0.7, min=0.05, step=0.01), IntSlider(valu…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "e1431d66953a49f2b19e7e190f21db90" } }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 22 } ] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "HvsmAi9rxOyD" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "n8h3mA-5xOsI" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "vGR419Wp_Gxj" }, "source": [ "import scipy.optimize as optimize\n", "\n", "def bond_ytm(price, par, T, coup, freq=2, guess=0.05):\n", " freq = float(freq)\n", " periods = T*2\n", " coupon = coup/100.*par\n", " dt = [(i+1)/freq for i in range(int(periods))]\n", " ytm_func = lambda y: \\\n", " sum([coupon/freq/(1+y/freq)**(freq*t) for t in dt]) +\\\n", " par/(1+y/freq)**(freq*T) - price\n", " \n", " return optimize.newton(ytm_func, guess)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "6NJZDLhbxOpU" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "IRAyk0_n_Gxj" }, "source": [ "# a 5.75% bond that will mature in 1.5 years with a par value of $100. The price is $95.0428. and coupons are paid semiannually. YTM=9.3692%\n", "ytm = bond_ytm(price=100, par=100, T=1.5, coup=5.75, freq=2)\n", "print(\"{:.4f}%\".format(ytm*100))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "QSZZcFok-lDA" }, "outputs": [], "source": [ "# %load solutions/intro/intro-example.py" ] }, { "cell_type": "code", "source": [ "!pip install bqplot" ], "metadata": { "id": "GhEx_up6mwgB" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "import numpy as np\n", "import bqplot as bq" ], "metadata": { "id": "X9SsOp-zmwda" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "from google.colab import output\n", "output.enable_custom_widget_manager()" ], "metadata": { "id": "UvhPLbEGmwYt" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "from google.colab import output\n", "output.disable_custom_widget_manager()" ], "metadata": { "id": "nQbIMOwonog4" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "xs = bq.LinearScale()\n", "ys = bq.LinearScale()\n", "x = np.arange(100)\n", "y = np.cumsum(np.random.randn(2, 100), axis=1) #two random walks\n", "\n", "line = bq.Lines(x=x, y=y, scales={'x': xs, 'y': ys}, colors=['red', 'green'])\n", "xax = bq.Axis(scale=xs, label='x', grid_lines='solid')\n", "yax = bq.Axis(scale=ys, orientation='vertical', tick_format='0.2f', label='y', grid_lines='solid')\n", "\n", "fig = bq.Figure(marks=[line], axes=[xax, yax], animation_duration=1000)\n", "display(fig)" ], "metadata": { "id": "297uxwxCmwbH" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# update data of the line mark\n", "line.y = np.cumsum(np.random.randn(2, 100), axis=1)" ], "metadata": { "id": "jcSEtuvtmwWS" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "pip install ipympl" ], "metadata": { "id": "SRbl79YMmwTr" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "%matplotlib ipympl" ], "metadata": { "id": "muoaF4FpmwQ0" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from ipywidgets import VBox, FloatSlider" ], "metadata": { "id": "ejQoTVZomwOs" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "with plt.ioff():\n", " fig, ax = plt.subplots()\n", "\n", "x1 = np.linspace(0, 20, 500)\n", "\n", "slider = FloatSlider(\n", " value=1.0,\n", " min=0.02,\n", " max=2.0\n", ")\n", "\n", "lines = plt.plot(x1, np.sin(slider.value * x1))\n", "\n", "def update_lines(change):\n", " lines[0].set_data(x1, np.sin(change.new * x1))\n", " fig.canvas.draw()\n", "\n", "slider.observe(update_lines, names='value')\n", "\n", "VBox([slider, fig.canvas])" ], "metadata": { "id": "gGauYvBBmwL1" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "vSNLTXlWmwJr" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "with plt.ioff():\n", " fig, ax = plt.subplots()\n", "\n", "#x1 = np.linspace(0, 20, 500)\n", "x1 = np.linspace(0.03, 0.5, num=50)\n", "\n", "slider = FloatSlider(\n", " value=1.0,\n", " min=0.02,\n", " max=2.0\n", ")\n", "\n", "#lines = plt.plot(x1, np.sin(slider.value * x1))\n", "lines = plt.plot(x1, price_b)\n", "\n", "def update_lines(change):\n", " lines[0].set_data(x1, np.sin(change.new * x1))\n", " fig.canvas.draw()\n", "\n", "slider.observe(update_lines, names='value')\n", "\n", "VBox([slider, fig.canvas])" ], "metadata": { "id": "S-MXG0NOFJma" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "jv6vkAammwHE" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "y6F3hSkYmwEX" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "Jwgg_LLfmwBj" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "4lsjCDog-lDA" }, "source": [ "## Additional reading\n", "\n", "### Behind the scenes\n", "\n", "Behind the scenes, even pure Python widgets are composed of two pieces:\n", "\n", "+ Python, which runs in the notebook kernel.\n", "+ JavaScript, which runs in the browser.\n", "\n", "When writing your own widgets, that means making a choice: write only in Python or write in both Python and Javascript.\n", "\n", "Which to choose depends on what you are trying to accomplish. This tutorial will focus on writing your own widgets in pure Python. An example of a pure-Python package that includes some interesting interfaces is [reducer](http://reducer.readthedocs.io), a package for calibrating astronomical data." ] }, { "cell_type": "markdown", "metadata": { "id": "k0GHjdem-lDA" }, "source": [ "### Jupyter widgets as a framework\n", "\n", "Jupyter widgets forms a framework for representing python objects interactively. Some large open-source interactive controls based on Jupyter widgets include:\n", "\n", " - [bqplot](https://github.com/bqplot/bqplot/blob/master/examples/Index.ipynb) - 2d plotting library in which everything displayed is a widget\n", " - [ipympl](https://github.com/matplotlib/ipympl) - widget backend for [matplotlib](https://matplotlib.org/3.2.2/contents.html) graphics\n", " - [pythreejs](https://pythreejs.readthedocs.io/en/stable/index.html) - low-level 3d graphics library\n", " - [ipyvolume](https://ipyvolume.readthedocs.io/en/latest/) - 3d plotting and volume rendering\n", " - [ipyleaflet](https://ipyleaflet.readthedocs.io/en/latest/)_ - interactive maps\n", " - [ipywebrtc](https://github.com/maartenbreddels/ipywebrtc) - video streaming\n", " - [ipysheet](https://ipysheet.readthedocs.io/en/latest/) - interactive spreadsheets\n", " - [ipytree](https://github.com/QuantStack/ipytree) - tree for viewing hierarchical material\n", " - [ipycanvas](https://ipycanvas.readthedocs.io/en/latest/?badge=latest) - interactive drawing in a notebook\n", " - [ipyevents](https://github.com/mwcraig/ipyevents/blob/master/doc/Widget%20DOM%20Events.ipynb) - capture mouse/keyboard events on a widget\n", " - ..." ] } ], "metadata": { "kernelspec": { "display_name": "widgets-tutorial", "language": "python", "name": "widgets-tutorial" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "d4ac185b1c0c48bbb8818f15de94dbbb": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatSliderModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "FloatSliderView", "continuous_update": true, "description": "Input:", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_59435ea7b6664dbe9dff7fb71eb0e88c", "max": 10, "min": 5, "orientation": "horizontal", "readout": true, "readout_format": ".2f", "step": 0.1, "style": "IPY_MODEL_09a3f3920b304077a48b258ec732e958", "value": 8.6 } }, "59435ea7b6664dbe9dff7fb71eb0e88c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "09a3f3920b304077a48b258ec732e958": { "model_module": "@jupyter-widgets/controls", "model_name": "SliderStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "8df35378a8184679859c34a17344787a": { "model_module": "@jupyter-widgets/controls", "model_name": "VBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_49677f28b8e54d20a4b12b4afd383440", "IPY_MODEL_c501fd9d596b4c3d8de3782a54b5bce8" ], "layout": "IPY_MODEL_0864fd7625e542c5aeab6c93c0d36c6b" } }, "49677f28b8e54d20a4b12b4afd383440": { "model_module": "@jupyter-widgets/controls", "model_name": "IntSliderModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "IntSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "IntSliderView", "continuous_update": true, "description": "x", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_91eb40cb7a8d4ff2a566605c160637f7", "max": 100, "min": 0, "orientation": "horizontal", "readout": true, "readout_format": "d", "step": 1, "style": "IPY_MODEL_61e20787b8e74c23a0c7eaa58df79415", "value": 52 } }, "c501fd9d596b4c3d8de3782a54b5bce8": { "model_module": "@jupyter-widgets/output", "model_name": "OutputModel", "model_module_version": "1.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_0e353e924e3845619d8ae14f55c48800", "msg_id": "", "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "2704\n" ] } ] } }, "0864fd7625e542c5aeab6c93c0d36c6b": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "91eb40cb7a8d4ff2a566605c160637f7": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "61e20787b8e74c23a0c7eaa58df79415": { "model_module": "@jupyter-widgets/controls", "model_name": "SliderStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "0e353e924e3845619d8ae14f55c48800": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e1431d66953a49f2b19e7e190f21db90": { "model_module": "@jupyter-widgets/controls", "model_name": "VBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_4dfe9a65494642dfac862b392a1cb807", "IPY_MODEL_46dc07e6c2ab4d3a8559fec00ac1c6a8", "IPY_MODEL_11619a4b8b37413b8a67db2903d51175", "IPY_MODEL_f709e69d71fb443baac004430f873e64", "IPY_MODEL_a84a47fb01dc452ea80c569c0bbc7854" ], "layout": "IPY_MODEL_12ddca1cbd1b4771ab4bdb0536ef3004" } }, "4dfe9a65494642dfac862b392a1cb807": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatSliderModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "FloatSliderView", "continuous_update": true, "description": "ytm", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_25ace811954b4b47add87fb6c722c822", "max": 0.7, "min": 0.05, "orientation": "horizontal", "readout": true, "readout_format": ".2f", "step": 0.01, "style": "IPY_MODEL_57c3f9319ac249cda351b7a3ab0cfbe2", "value": 0.1 } }, "46dc07e6c2ab4d3a8559fec00ac1c6a8": { "model_module": "@jupyter-widgets/controls", "model_name": "IntSliderModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "IntSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "IntSliderView", "continuous_update": true, "description": "period", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_0eb9238af7d34b8aa694cf6739bb681e", "max": 30, "min": 1, "orientation": "horizontal", "readout": true, "readout_format": "d", "step": 1, "style": "IPY_MODEL_c9c6be249ab3495db7cb9d45255e1449", "value": 20 } }, "11619a4b8b37413b8a67db2903d51175": { "model_module": "@jupyter-widgets/controls", "model_name": "IntSliderModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "IntSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "IntSliderView", "continuous_update": true, "description": "par", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_b9078e427df44def987b9c93def14035", "max": 1000, "min": 100, "orientation": "horizontal", "readout": true, "readout_format": "d", "step": 100, "style": "IPY_MODEL_4f45ac000ec44100839cc085a220d6fb", "value": 1000 } }, "f709e69d71fb443baac004430f873e64": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatSliderModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "FloatSliderView", "continuous_update": true, "description": "coupon", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_4f6eacbe6d21425fb06ca11180be5e3d", "max": 0.7, "min": 0.05, "orientation": "horizontal", "readout": true, "readout_format": ".2f", "step": 0.01, "style": "IPY_MODEL_a9efa48a50a74c31984c36aa6b4b4408", "value": 0.1 } }, "a84a47fb01dc452ea80c569c0bbc7854": { "model_module": "@jupyter-widgets/output", "model_name": "OutputModel", "model_module_version": "1.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_16f817f48c24432fa8cc642ec16ae8e8", "msg_id": "", "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "$1000.00\n" ] } ] } }, "12ddca1cbd1b4771ab4bdb0536ef3004": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "25ace811954b4b47add87fb6c722c822": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "57c3f9319ac249cda351b7a3ab0cfbe2": { "model_module": "@jupyter-widgets/controls", "model_name": "SliderStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "0eb9238af7d34b8aa694cf6739bb681e": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c9c6be249ab3495db7cb9d45255e1449": { "model_module": "@jupyter-widgets/controls", "model_name": "SliderStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "b9078e427df44def987b9c93def14035": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4f45ac000ec44100839cc085a220d6fb": { "model_module": "@jupyter-widgets/controls", "model_name": "SliderStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "4f6eacbe6d21425fb06ca11180be5e3d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a9efa48a50a74c31984c36aa6b4b4408": { "model_module": "@jupyter-widgets/controls", "model_name": "SliderStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "16f817f48c24432fa8cc642ec16ae8e8": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } } }, "colab": { "name": "jupyter_widgets1.ipynb", "provenance": [], "collapsed_sections": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 0 }