From 42e7f6e2f5aa875e6ae86c6079a5c5dc741f37d9 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Thu, 10 Dec 2020 22:19:02 -0500 Subject: [PATCH] Release 2.0 --- RateRegression.ipynb | 5427 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5427 insertions(+) create mode 100644 RateRegression.ipynb diff --git a/RateRegression.ipynb b/RateRegression.ipynb new file mode 100644 index 0000000..30246cd --- /dev/null +++ b/RateRegression.ipynb @@ -0,0 +1,5427 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Loading Packages" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import datetime\n", + "import matplotlib.dates as mdates\n", + "import matplotlib.ticker\n", + "\n", + "%matplotlib notebook\n", + "\n", + "#Linear Regression\n", + "from sklearn import linear_model\n", + "\n", + "#used for 3D plot\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "from matplotlib import cm\n", + "\n", + "#igore warning\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Reading data and preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
DateUS0001MUS0002MUS0003MUS0006MUS0012MUSSW2USSW3USSW5USSW7USSW10USSW15USSW30
02014-01-02 00:00:000.16830.212500.242850.34640.58260.49030.87051.77402.45403.06103.56133.8950
12014-01-03 00:00:000.16470.209950.239850.34520.58460.51130.90001.79202.46483.06653.56353.8953
22014-01-06 00:00:000.16250.208250.239350.34450.58540.50000.87601.74682.42033.02603.53153.8738
32014-01-07 00:00:000.16150.208200.242100.34470.58660.49850.87351.73752.40653.00983.51453.8580
42014-01-08 00:00:000.16100.207500.240400.34520.58560.53500.95201.82802.48353.06503.55003.8703
\n", + "
" + ], + "text/plain": [ + " Date US0001M US0002M US0003M US0006M US0012M USSW2 \\\n", + "0 2014-01-02 00:00:00 0.1683 0.21250 0.24285 0.3464 0.5826 0.4903 \n", + "1 2014-01-03 00:00:00 0.1647 0.20995 0.23985 0.3452 0.5846 0.5113 \n", + "2 2014-01-06 00:00:00 0.1625 0.20825 0.23935 0.3445 0.5854 0.5000 \n", + "3 2014-01-07 00:00:00 0.1615 0.20820 0.24210 0.3447 0.5866 0.4985 \n", + "4 2014-01-08 00:00:00 0.1610 0.20750 0.24040 0.3452 0.5856 0.5350 \n", + "\n", + " USSW3 USSW5 USSW7 USSW10 USSW15 USSW30 \n", + "0 0.8705 1.7740 2.4540 3.0610 3.5613 3.8950 \n", + "1 0.9000 1.7920 2.4648 3.0665 3.5635 3.8953 \n", + "2 0.8760 1.7468 2.4203 3.0260 3.5315 3.8738 \n", + "3 0.8735 1.7375 2.4065 3.0098 3.5145 3.8580 \n", + "4 0.9520 1.8280 2.4835 3.0650 3.5500 3.8703 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('swapLiborData.csv')\n", + "\n", + "#convert number to datatime format\n", + "for i in range(df.shape[0]):\n", + " df.loc[i,'Date'] = pd.to_datetime('1899-12-30') + pd.to_timedelta(df.loc[i,'Date'],'D')\n", + " \n", + "df.head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# regress 5-yr against 2-yr" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.8079227] [[-0.2480387]]\n", + "0.04318013965625678\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "len1 = len(df)\n", + "\n", + "t1 = 0\n", + "t2 = int(np.ceil(len1/2))\n", + "\n", + "xX = df.iloc[t1:t2,6:7]\n", + "yY = df.iloc[t1:t2,8:9]\n", + "regr = linear_model.LinearRegression()\n", + "regr.fit(xX, yY)\n", + "B = regr.coef_\n", + "b_0 = regr.intercept_\n", + "rSquared = regr.score(xX, yY)\n", + "\n", + "print(b_0, B)\n", + "print(rSquared)\n", + "\n", + "yHat = b_0 + df.iloc[t1:t2,6:7] @ B.T\n", + "\n", + "#plot data\n", + "plt.figure(figsize=(8,5)) # set the figure size\n", + "\n", + "plt.plot(df.iloc[t1:t2,0], yHat)\n", + "plt.plot(df.iloc[t1:t2,0], df.iloc[t1:t2,8:9])\n", + "\n", + "#adjust display setting\n", + "#plt.figure(figsize=(8,5)) # set the figure size\n", + "plt.autoscale(enable=True, axis='x', tight=True)\n", + "plt.autoscale(enable=True, axis='y', tight=True)\n", + "plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%y'))\n", + "plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=6))\n", + "plt.xticks(rotation='horizontal',horizontalalignment='center')\n", + "\n", + "plt.xlabel('date')\n", + "plt.ylabel('5-yr swap rate')\n", + "plt.title('original vs. constructed')\n", + "plt.legend(labels = ['constructed 5-yr','original 5-yr'], loc='best')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# regress 5-yr against 2-yr" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0.43706762] [[ 0.90311227]]\n", + "0.96822828184\n" + ] + }, + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "len1 = len(df)\n", + "\n", + "t1 = 0\n", + "t2 = len1\n", + "\n", + "xX = df.iloc[t1:t2,6:7]\n", + "yY = df.iloc[t1:t2,8:9]\n", + "regr = linear_model.LinearRegression()\n", + "regr.fit(xX, yY)\n", + "B = regr.coef_\n", + "b_0 = regr.intercept_\n", + "rSquared = regr.score(xX, yY)\n", + "\n", + "print(b_0, B)\n", + "print(rSquared)\n", + "\n", + "yHat = b_0 + df.iloc[t1:t2,6:7] @ B.T\n", + "\n", + "#plot data\n", + "plt.figure(figsize=(8,5)) # set the figure size\n", + "\n", + "plt.plot(df.iloc[t1:t2,0], yHat)\n", + "plt.plot(df.iloc[t1:t2,0], df.iloc[t1:t2,8:9])\n", + "\n", + "#adjust display setting\n", + "plt.autoscale(enable=True, axis='x', tight=True)\n", + "plt.autoscale(enable=True, axis='y', tight=True)\n", + "plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%y'))\n", + "plt.gca().xaxis.set_major_locator(mdates.YearLocator(base=1))\n", + "plt.xticks(rotation='horizontal',horizontalalignment='center')\n", + "\n", + "plt.xlabel('date')\n", + "plt.ylabel('5-yr swap rate')\n", + "plt.title('original vs. constructed')\n", + "plt.legend(labels = ['constructed 5-yr','original 5-yr'], loc='best')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# regress 30-yr against 15-yr" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0.02430841] [[ 1.08162197]]\n", + "0.994786634158\n" + ] + }, + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "len1 = len(df)\n", + "\n", + "t1 = int(np.ceil(len1/2))\n", + "t2 = len1\n", + "\n", + "xX = df.iloc[t1:t2,11:12]\n", + "yY = df.iloc[t1:t2,12:13]\n", + "regr = linear_model.LinearRegression()\n", + "regr.fit(xX, yY)\n", + "B = regr.coef_\n", + "b_0 = regr.intercept_\n", + "rSquared = regr.score(xX, yY)\n", + "\n", + "print(b_0, B)\n", + "print(rSquared)\n", + "\n", + "yHat = b_0 + df.iloc[t1:t2,11:12] @ B.T\n", + "\n", + "#plot data\n", + "plt.figure(figsize=(8,5)) # set the figure size\n", + "\n", + "plt.plot(df.iloc[t1:t2,0], yHat)\n", + "plt.plot(df.iloc[t1:t2,0], df.iloc[t1:t2,12:13])\n", + "\n", + "#adjust display setting\n", + "plt.autoscale(enable=True, axis='x', tight=True)\n", + "plt.autoscale(enable=True, axis='y', tight=True)\n", + "plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%y'))\n", + "plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=6))\n", + "plt.xticks(rotation='horizontal',horizontalalignment='center')\n", + "\n", + "plt.xlabel('date')\n", + "plt.ylabel('30-yr swap rate')\n", + "plt.title('original vs. constructed')\n", + "plt.legend(labels = ['constructed 30-yr','original 30-yr'], loc='best')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# regress 30-yr against 15-yr " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0.1938514] [[ 0.98636103]]\n", + "0.953895616954\n" + ] + }, + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "len1 = len(df)\n", + "\n", + "t1 = 0\n", + "t2 = int(np.ceil(len1/2))\n", + "\n", + "xX = df.iloc[t1:t2,[6,8,10]]\n", + "yY = df.iloc[t1:t2,12:13]\n", + "regr = linear_model.LinearRegression()\n", + "regr.fit(xX, yY)\n", + "B = regr.coef_\n", + "b_0 = regr.intercept_\n", + "rSquared = regr.score(xX, yY)\n", + "\n", + "print(b_0, B)\n", + "print(rSquared)\n", + "\n", + "yHat = b_0 + df.iloc[t1:t2,[6,8,10]] @ B.T\n", + "\n", + "#plot data\n", + "plt.figure(figsize=(8,5)) # set the figure size\n", + "\n", + "plt.plot(df.iloc[t1:t2,0], yHat)\n", + "plt.plot(df.iloc[t1:t2,0], df.iloc[t1:t2,12:13])\n", + "\n", + "#adjust display setting\n", + "plt.autoscale(enable=True, axis='x', tight=True)\n", + "plt.autoscale(enable=True, axis='y', tight=True)\n", + "plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%y'))\n", + "plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=6))\n", + "plt.xticks(rotation='horizontal',horizontalalignment='center')\n", + "\n", + "plt.xlabel('date')\n", + "plt.ylabel('30-yr swap rate')\n", + "plt.title('original vs. constructed')\n", + "plt.legend(labels = ['constructed 30-yr','original 30-yr'], loc='best')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}