{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Generating sample bond data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook generates the sample bond data used by the BasicBond model.\n", "Numpy and QuantLib is required to run this notebook.\n", "\n", "**Columns:**\n", "\n", "* `bond_id`: Bond identifier\n", "* `settlement_days`: 0\n", "* `face_value`: Face value. Uniformly distributed from 10,000 to 1,000,000.\n", "* `issue_date`: Issue date. Uniformly distributed between 1 Jan 2017 to 31 Dec 2021.\n", "* `bond_term`: Bond term in years. Evenly distributed among 5, 10, 15, 20, 25, 30 years.\n", "* `maturity_date`: Matuirty date. `issue_date` + `bond_term`.\n", "* `tenor`: \"6M\" or \"1Y\" to indicate length of time between each coupon payment. The samples are evenry distributed.\n", "* `coupon_rate`: Coupon rate. Uniformly distributed between 0 and 8% by 1%\n", "* `z_spread`: Z-spread. Uniformly distributed from 0% to 4%.\n", "\n", "**Number of data:**\n", "\n", "* 1000\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from numpy.random import default_rng # Requires NumPy 1.17 or newer\n", "\n", "rng = default_rng(12345)\n", "\n", "# Number of Data\n", "DataSize = 1000\n", "\n", "# Settlement Days: 0\n", "settlement_days = np.array([0] * DataSize)\n", "\n", "# Face Value (Float): 10000 - 1000000 \n", "\n", "face_value = np.round((1000000 - 10000) * rng.random(size=DataSize) + 10000, -3)\n", "\n", "# Issue Date (datetime64): 1 Jan 2017 to 31 Dec 2021\n", "\n", "import datetime\n", "date_begin = datetime.date(2017,1,1)\n", "date_end = datetime.date(2022,1,1)\n", "\n", "issue_date = (date_end - date_begin) * rng.random(size=DataSize) + date_begin\n", "\n", "# Bond Term: 5,..,40 years\n", "import QuantLib as ql\n", "\n", "terms = [ql.Period(y, ql.Years) for y in [5, 10, 15, 20, 25, 30]]\n", "bond_term = [terms[i] for i in rng.integers(low=0, high=len(terms), size=DataSize)]\n", "\n", "# Maturity Date (datetime64): Issue date + Bond Term\n", "maturity_date = [ql.Date(issue.day, issue.month, issue.year) + term for issue, term in zip(issue_date, bond_term)]\n", "\n", "\n", "# Coupon Tenor: \"6M\" or \"1Y\"\n", "_tenor = [\"6M\", \"1Y\"]\n", "tenor = np.fromiter(map(lambda i: _tenor[i], rng.integers(low=0, high=len(_tenor), size=DataSize)), np.dtype('\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", "
settlement_daysface_valueissue_datebond_termmaturity_datetenorcoupon_ratez_spread
bond_id
10235000.02017-12-12102027-12-121Y0.070.0304
20324000.02021-11-29252046-11-291Y0.080.0304
30799000.02017-02-03102027-02-036M0.030.0155
40679000.02017-11-19102027-11-191Y0.080.0229
50397000.02018-07-0152023-07-016M0.060.0142
...........................
9960560000.02019-02-16102029-02-161Y0.060.0261
9970161000.02020-03-12302050-03-126M0.050.0199
9980375000.02019-05-0552024-05-051Y0.030.0138
9990498000.02019-02-21152034-02-211Y0.030.0230
10000438000.02019-03-14302049-03-141Y0.060.0256
\n", "

1000 rows × 8 columns

\n", "" ], "text/plain": [ " settlement_days face_value issue_date bond_term maturity_date \\\n", "bond_id \n", "1 0 235000.0 2017-12-12 10 2027-12-12 \n", "2 0 324000.0 2021-11-29 25 2046-11-29 \n", "3 0 799000.0 2017-02-03 10 2027-02-03 \n", "4 0 679000.0 2017-11-19 10 2027-11-19 \n", "5 0 397000.0 2018-07-01 5 2023-07-01 \n", "... ... ... ... ... ... \n", "996 0 560000.0 2019-02-16 10 2029-02-16 \n", "997 0 161000.0 2020-03-12 30 2050-03-12 \n", "998 0 375000.0 2019-05-05 5 2024-05-05 \n", "999 0 498000.0 2019-02-21 15 2034-02-21 \n", "1000 0 438000.0 2019-03-14 30 2049-03-14 \n", "\n", " tenor coupon_rate z_spread \n", "bond_id \n", "1 1Y 0.07 0.0304 \n", "2 1Y 0.08 0.0304 \n", "3 6M 0.03 0.0155 \n", "4 1Y 0.08 0.0229 \n", "5 6M 0.06 0.0142 \n", "... ... ... ... \n", "996 1Y 0.06 0.0261 \n", "997 6M 0.05 0.0199 \n", "998 1Y 0.03 0.0138 \n", "999 1Y 0.03 0.0230 \n", "1000 1Y 0.06 0.0256 \n", "\n", "[1000 rows x 8 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "attrs = [\n", " \"settlement_days\",\n", " \"face_value\",\n", " \"issue_date\",\n", " \"bond_term\",\n", " \"maturity_date\",\n", " \"tenor\",\n", " \"coupon_rate\",\n", " \"z_spread\"\n", "]\n", "\n", "data = [\n", " settlement_days,\n", " face_value,\n", " issue_date,\n", " [y.length() for y in bond_term],\n", " [d.to_date() for d in maturity_date],\n", " tenor,\n", " coupon_rate,\n", " z_spread\n", "]\n", "\n", "bond_data = pd.DataFrame(dict(zip(attrs, data)), index=range(1, DataSize+1))\n", "bond_data.index.name = \"bond_id\"\n", "bond_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uncomment the command below to save the data to an Excel file." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# bond_data.to_excel(\"bond_data_sample.xlsx\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.9.7" } }, "nbformat": 4, "nbformat_minor": 2 }