{ "cells": [ { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "## Simulation\n", "\n", "Functions\n", "\n", "`np.random.standard_normal`, `np.random.standard_t`, `np.random.RandomState`\n", "\n", "### Exercise 5\n", "\n", "Simulate 100 standard Normal random variables\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.05160045 0.27824242 0.96486008 0.07625414 -1.13418869 0.70657302\n", " -0.5609305 1.28990873 0.48558649 -1.47926435]\n" ] } ], "source": [ "import numpy as np\n", "\n", "x = np.random.standard_normal(100)\n", "print(x[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 6\n", "\n", "Simulate 100 random variables from a $N\\left(.08,.2^{2}\\right)$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.15129345 0.10989907 0.03863464 -0.31902102 0.3035361 -0.11652767\n", " 0.08171427 0.00373945 -0.05791341 0.40373412]\n" ] } ], "source": [ "x = np.random.normal(0.08, 0.20, 100)\n", "print(x[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 7\n", "\n", "Simulate 100 random variables from a Students t with 8 degrees of freedom\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1.03124096 5.56814641 1.62075099 0.03125897 3.01531579 2.04890897\n", " -0.6554083 -1.55937815 -0.92495617 1.27605812]\n" ] } ], "source": [ "x = np.random.standard_t(8, size=100)\n", "print(x[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 8\n", "\n", "Simulate 100 random variables from a Students t with 8 degrees of freedom with a mean of 8% and a volatility of 20%. Note: $V\\left[X\\right]=\\frac{\\nu}{\\nu-2}$ when $X\\sim t_{\\nu}$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.34903401 0.05146791 0.08193907 -0.06471608 0.10811384 -0.05309444\n", " -0.1251592 0.16011857 0.15779499 0.11079463]\n" ] } ], "source": [ "e = np.random.standard_t(8, size=100)\n", "e = e / np.sqrt(8 / (8 - 2))\n", "x = 0.08 + 0.2 * e\n", "print(x[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Exercise 9\n", "\n", "Simulate two identical sets of 100 standard normal random variables by resetting the random number generator." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.]\n" ] } ], "source": [ "# Legacy method for any NumPy\n", "rs = np.random.RandomState(30092019)\n", "# Modern method, NumPy >= 1.17\n", "rs = np.random.default_rng(30092019)\n", "\n", "x1 = rs.standard_normal(100)\n", "\n", "# rs2 = np.random.RandomState(30092019)\n", "rs2 = np.random.default_rng(30092019)\n", "\n", "x2 = rs2.standard_normal(100)\n", "print(x1 - x2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.]\n" ] } ], "source": [ "# When using the legacy RandomState\n", "rs = np.random.RandomState(30092019)\n", "state = rs.get_state()\n", "x1 = rs.standard_normal(100)\n", "rs.set_state(state)\n", "x2 = rs.standard_normal(100)\n", "print(x1 - x2)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "pycharm": { "is_executing": false, "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.]\n" ] } ], "source": [ "# If using the modern way\n", "rs = np.random.default_rng(30092019)\n", "state = rs.bit_generator.state\n", "x1 = rs.standard_normal(100)\n", "rs.bit_generator.state = state\n", "x2 = rs.standard_normal(100)\n", "print(x1 - x2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Exercise 10\n", "\n", "Repeat exercise 7 using only `standard_normal`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "pycharm": { "is_executing": false, "name": "#%%" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.00851377 -0.12160312 0.25513281 0.00612633 -0.01818945 0.12300775\n", " -0.00469669 0.0382072 0.0040533 -0.02505603]\n" ] } ], "source": [ "# Modern way to get a reproducible random generator\n", "rs = np.random.default_rng(30092019)\n", "\n", "df = 8\n", "\n", "num = rs.standard_normal(100)\n", "denom = rs.standard_normal((100, df))\n", "denom = np.sum(denom**2, 1)\n", "denom = denom / df\n", "\n", "e = num / np.sqrt(denom)\n", "\n", "e = e / np.sqrt(df / (df - 2))\n", "x = 0.08 + 0.2 * e\n", "\n", "print(x[:10])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "pycharm": { "is_executing": false, "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Kurtosis: 4.505665233546498\n", "Theoretical Value: 4.5\n" ] } ], "source": [ "from scipy import stats\n", "\n", "reps = 1000000\n", "num = rs.standard_normal(reps)\n", "denom = rs.standard_normal((reps, df))\n", "denom = np.sum(denom**2, 1)\n", "denom = denom / df\n", "\n", "e = num / np.sqrt(denom)\n", "print(f\"Kurtosis: {3 + stats.kurtosis(e)}\")\n", "print(f\"Theoretical Value: {3 + 6 / (df - 4)}\")" ] } ], "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.13.5" }, "pycharm": { "stem_cell": { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [] } } }, "nbformat": 4, "nbformat_minor": 4 }