<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>G B</title><link>http://gouthamanbalaraman.com/</link><description></description><lastBuildDate>Mon, 27 Aug 2018 00:00:00 -0700</lastBuildDate><item><title>QuantLib Python CookBook Is Almost Done</title><link>http://gouthamanbalaraman.com/blog/quantlib-python-cookbook-almost-done.html</link><description>&lt;p&gt;More than a year ago, Luigi Ballabio and I made an initial release of the QuantLib Python Cookbook. Now we are mostly
finished with the content of the book. The &lt;a class="reference external" href="https://leanpub.com/quantlibpythoncookbook"&gt;new version of the book&lt;/a&gt; is
out, and those who bought a previous version can now log into LeanPub to download the new version of the book and the
accompanying python code in the form of notebooks.&lt;/p&gt;
&lt;p&gt;This version includes some content update and preliminary support for Python 3. We are working to convert
IPython notebooks into Jupyter notebooks and that will be the next release milestone for the book. You
should expect to hear from us in about a month or so.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Mon, 27 Aug 2018 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2018-08-27:blog/quantlib-python-cookbook-almost-done.html</guid><category>Python</category><category>QuantLib</category><category>Python</category><category>Programming</category></item><item><title>Optimizing Python Code: Numba vs Cython</title><link>http://gouthamanbalaraman.com/blog/optimizing-python-numba-vs-cython.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I came across an old post by jakevdp on &lt;a href="http://jakevdp.github.io/blog/2013/06/15/numba-vs-cython-take-2/"&gt;Numba vs Cython&lt;/a&gt;. I thought I will revisit this topic because both Numba and Cython has matured significantly over this time period. In this post I am going to do two examples:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pairwise distance estimation example that Jake discusses. The intention is to see how the maturity of these projects has contributed to improvements.&lt;/li&gt;
&lt;li&gt;A simple cashflow payment calculation of an amortizing bond or mortgage payments. This a calculation that cannot be vectorized in a numpy sense. So the speedups would have to come from optimizing loops using tools like Numba or Cython.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numba&lt;/span&gt; 
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cython&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;load_ext&lt;/span&gt; &lt;span class="n"&gt;cython&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__version__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cython&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__version__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__version__&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[1]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;(&amp;apos;0.31.0&amp;apos;, &amp;apos;0.24.1&amp;apos;, &amp;apos;1.11.3&amp;apos;)&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Pairwise-Distance-Estimation"&gt;Pairwise Distance Estimation&lt;a class="anchor-link" href="#Pairwise-Distance-Estimation"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pairwise_python&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;
            &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;

&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n10&lt;/span&gt; &lt;span class="n"&gt;pairwise_python&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;10 loops, best of 3: 2.47 s per loop
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pairwise_numpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n10&lt;/span&gt; &lt;span class="n"&gt;pairwise_numpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;10 loops, best of 3: 38.3 ms per loop
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pairwise_numba&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pairwise_python&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n10&lt;/span&gt; &lt;span class="n"&gt;pairwise_numba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;The slowest run took 13.98 times longer than the fastest. This could mean that an intermediate result is being cached.
10 loops, best of 3: 4.04 ms per loop
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;cython&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="n"&gt;cimport&lt;/span&gt; &lt;span class="n"&gt;cython&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;libc.math&lt;/span&gt; &lt;span class="nn"&gt;cimport&lt;/span&gt; &lt;span class="nn"&gt;sqrt&lt;/span&gt;

&lt;span class="nd"&gt;@cython.boundscheck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@cython.wraparound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pairwise_cython&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;
            &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n10&lt;/span&gt; &lt;span class="n"&gt;pairwise_cython&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;10 loops, best of 3: 6.6 ms per loop
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The timiing for the results in Jake&amp;#39;s post (2013) and the results from this post (2017) are summarized below. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Time (ms)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;13400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;9.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;9.87&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Speedup&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1469&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1357&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt; 
             &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Numpy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Numba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cython&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;df2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Time (ms)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2470&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;38.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4.04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Speedup&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;611&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;374&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt; 
             &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Numpy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Numba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cython&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;df1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;df2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2013&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2017&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[8]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_pyout"&gt;
&lt;div&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th colspan="2" halign="left"&gt;2013&lt;/th&gt;
      &lt;th colspan="2" halign="left"&gt;2017&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;Speedup&lt;/th&gt;
      &lt;th&gt;Time (ms)&lt;/th&gt;
      &lt;th&gt;Speedup&lt;/th&gt;
      &lt;th&gt;Time (ms)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;Python&lt;/th&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;13400.00&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;2470.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Numpy&lt;/th&gt;
      &lt;td&gt;121&lt;/td&gt;
      &lt;td&gt;111.00&lt;/td&gt;
      &lt;td&gt;65&lt;/td&gt;
      &lt;td&gt;38.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Numba&lt;/th&gt;
      &lt;td&gt;1469&lt;/td&gt;
      &lt;td&gt;9.12&lt;/td&gt;
      &lt;td&gt;611&lt;/td&gt;
      &lt;td&gt;4.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Cython&lt;/th&gt;
      &lt;td&gt;1357&lt;/td&gt;
      &lt;td&gt;9.87&lt;/td&gt;
      &lt;td&gt;374&lt;/td&gt;
      &lt;td&gt;6.60&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The timings are speedup number for the 2013 and 2017 runs are very different due to differences in versions and perhaps even the python version. This post is using Py35 running in Windows. The take away here is that the numpy is atleast 2 orders of magnitude faster than python. And the numba and cython snippets are about an order of magnitude faster than numpy in both the benchmarks.&lt;/p&gt;
&lt;p&gt;I will not rush to make any claims on numba vs cython. It is unclear what kinds of optimizations is used in the &lt;code&gt;cython&lt;/code&gt; magic. I would expect the &lt;code&gt;cython&lt;/code&gt; code to be as fast as C and perhaps some tweaking will help us get there. It is really interesting how easy it is to get performance boost from &lt;code&gt;numba&lt;/code&gt;. From an ease of use point of view, &lt;code&gt;numba&lt;/code&gt; is hands down winner in this simple example.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="amortizing-payments"&gt;Amortizing Payments&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here lets look at one more example. This is an amortizing payment calculation, such as in mortgage payments.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;amortize_payments_py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;smm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cpr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;12.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1200.&lt;/span&gt;
    &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Pr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;B0&lt;/span&gt;
    &lt;span class="n"&gt;pow_term&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pow_term&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pow_term&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;
        
        &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
        &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;smm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Bt&lt;/span&gt;
        &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;1e-2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;
        &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here is the equivalent Cython function.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;cython&lt;/span&gt;
&lt;span class="n"&gt;cimport&lt;/span&gt; &lt;span class="n"&gt;cython&lt;/span&gt; 
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;libc.math&lt;/span&gt; &lt;span class="nn"&gt;cimport&lt;/span&gt; &lt;span class="nn"&gt;pow&lt;/span&gt;

&lt;span class="nd"&gt;@cython.boundscheck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@cython.wraparound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;amortize_payments_cy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;B0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;cpr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;smm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cpr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;12.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1200.&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="n"&gt;Pr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;B0&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;pow_term&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pow_term&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pow_term&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;
    &lt;span class="n"&gt;cdef&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;       
        &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
        &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;smm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Bt&lt;/span&gt;
        &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;1e-2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;
        &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bt&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here is the Numba version&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;amortize_payments_nb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;njit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;amortize_payments_py&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let&amp;#39;s compare the performance of the three function types.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;B0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;500000.&lt;/span&gt;
&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;
&lt;span class="n"&gt;term&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;strong&gt; Python&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[17]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n1000&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amortize_payments_py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;1000 loops, best of 3: 369 µs per loop
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;strong&gt; Numba &lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[18]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n1000&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amortize_payments_nb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;1000 loops, best of 3: 8.64 µs per loop
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;strong&gt; Cython &lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[19]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n1000&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amortize_payments_cy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;1000 loops, best of 3: 28.7 µs per loop
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Once again we see that &lt;code&gt;cython&lt;/code&gt; and &lt;code&gt;numba&lt;/code&gt; methods are orders of magnitude (roughly 15X) faster than python version. The &lt;code&gt;numba&lt;/code&gt; version is almost 3X faster than Cython. There are probably some performance cython tweaks that I am missing perhaps. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post, I have redone Jake&amp;#39;s pairwise distance example to see how the same code performs 3 years forward. I also discuss a common finance example of amortizing cashflow generation. The &lt;code&gt;numba&lt;/code&gt; and &lt;code&gt;cython&lt;/code&gt; snippets are orders of magnitude faster than a pure python version. Surprisingly, &lt;code&gt;numba&lt;/code&gt; is 20% to 300% faster than &lt;code&gt;cython&lt;/code&gt; on these examples. There may very well be some &lt;code&gt;cython&lt;/code&gt; tweaks I might be missing. But nevertheless these examples show how one can easily get performance boost using &lt;code&gt;numba&lt;/code&gt; module. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 03 Aug 2017 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2017-08-03:blog/optimizing-python-numba-vs-cython.html</guid><category>python</category><category>programming</category><category>development</category><category>pandas</category><category>numpy</category><category>numba</category></item><item><title>American Option Pricing with QuantLib and Python</title><link>http://gouthamanbalaraman.com/blog/american-option-pricing-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I wrote about pricing &lt;a href="http://gouthamanbalaraman.com/blog/european-option-binomial-tree-quantlib-python.html"&gt;European options using QuantLib&lt;/a&gt; in an earlier post. Since then, I have received many questions from readers on how to extend this to price American options. So here is a modified example on pricing American options using QuantLib. The idea is very similar to European Option construction. Lets take a look at the details below. In this post, I will price both an European option and an American option side by side.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt; 
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__version__&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[1]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;apos;1.9.2&amp;apos;&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let us consider a European and an American call option for AAPL with a strike price of \$130 maturing on 15th Jan, 2016. Let the spot price be \$127.62. The volatility of the underlying stock is known to be 20%, and has a dividend yield of 1.63%. Lets value these options as of 8th May, 2015.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# option data&lt;/span&gt;
&lt;span class="n"&gt;maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;127.62&lt;/span&gt;
&lt;span class="n"&gt;strike_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;130&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt; &lt;span class="c1"&gt;# the historical vols or implied vols&lt;/span&gt;
&lt;span class="n"&gt;dividend_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mf"&gt;0.0163&lt;/span&gt;
&lt;span class="n"&gt;option_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;

&lt;span class="n"&gt;risk_free_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We construct the European and American options here. The main difference here is in the Exercise type. One has to use &lt;code&gt;AmericanExercise&lt;/code&gt; instead of &lt;code&gt;EuropeanExercise&lt;/code&gt; to pass into the &lt;code&gt;VanillaOption&lt;/code&gt; to construct an American option.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;payoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainVanillaPayoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;settlement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;

&lt;span class="n"&gt;am_exercise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AmericanExercise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settlement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;american_option&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VanillaOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;am_exercise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;eu_exercise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EuropeanExercise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;european_option&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VanillaOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eu_exercise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The Black-Scholes-Merton process is constructed here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spot_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;flat_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_free_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dividend_yield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;flat_vol_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackVolTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackConstantVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bsm_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackScholesMertonProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;dividend_yield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;flat_vol_ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The value of the American option can be computed using a Binomial Engine using the CRR approach.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="n"&gt;binomial_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BinomialVanillaEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;crr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;american_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binomial_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;american_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;6.84210328728556
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;For illustration purpose, lets compare the European and American option prices using the binomial tree approach. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;binomial_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;binomial_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BinomialVanillaEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;crr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binomial_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eu_prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;binomial_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;am_prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;binomial_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;american_option&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# theoretican European option price&lt;/span&gt;
&lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticEuropeanEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;bs_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In the plot below, the binomial-tree approach is used to value American option for different number of steps. You can see the prices converging with increase in number of steps. The European option price is plotted along with BSM theoretical price for comparison purposes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eu_prices&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;European Option&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;am_prices&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;American Option&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="n"&gt;bs_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bs_price&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;r--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BSM Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Steps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Binomial Tree Price For Varying Steps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[7]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.legend.Legend at 0x85b24e0&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
Zcv44Q9/CGihc7n11lu5/vrruf7663nggQe47bbbeOqppwDYvn07S5cuZc2aNcybN48rr7yy3XvW
Haxg4GcPKGthWCwHne64pObNm0dpaSmg4wa33norAJMmTWLs2LGeYJxzzjkMHarHEl9++eUsXbqU
ZDLJ8uXLmTVLT7ne3NzMiBEjAPjVr37F/fffTyaTYfv27axevdoTjMsvvxyAGTNm8OSTT3brWj/6
0Y+SSCQ47rjjmDBhQqSlYvLyyy9757r22mv54he/6G37yEc+QiKRYPLkyezcGVW678CxgtEZrIVh
OUxpzxLobZLJJDkn3T08nqC8vLxTxwinlooISimuv/56vvOd7wS2bdiwge9973u8/vrrDB48mPnz
5wfOW1xcDOggfSaTaXOuyZMns3z5ci691J/KZ/ny5Zx44onttqe7uO0Bf4hAT2NjGAYq7oW1MCyW
g864ceNYvnw5AL/+9a9j9zv99NNZtGgRAO+99x6bN29m4sSJAPzlL3+hpqaG5uZmnnrqKU499VTm
zp3L4sWL2bVrFwA1NTVs2rSJuro6ysvLGThwIDt37uRPf/pTl9p7880389BDD3nW0t69e/nSl74U
sAqeeOIJcrkc69atY/369UycOJHKykrq6+sjjzlnzhx++ctfArBo0SJOP/30LrXpQLEWBpCQcIFz
65KyWA4W4RjG+eefz913382dd97JJz/5Sb7yla94Ae8obrrpJj772c8yZcoUkskkDz30kPf0PXv2
bK644gqqq6u55pprmDlzJgB33XUX5557LrlcjsLCQu677z4+8IEPcPLJJzNp0iTGjBnDqaee2qXr
GDVqFI8++iif/vSnqa+vRynFv/zLv3DJJZd4+xx99NHMnj2buro6Fi5cSElJCWeddRZ33303VVVV
3HFHcBqhe++9lwULFvDd736X4cOH8+CDD3apTQdKr8zp3Vt0dwKlZ557jsGrHmREZTG76lsBmH70
YAoLHPNwzClQ9fGebKrFcsjyzjvvcMIJJxzsZvQ4Dz30UCCYfLCZP38+F198cV6C03FEfbYislwp
NbMz77cuKfDHYQSC3uYLa2FYLBaLdUlhzofho2wMw2LpV8yfP5/58+cf7GZ4mOmyfQVrYYBf3zyO
sNsuk4L6Hflrj8VisRyCWMEArwSIihuIEbYwVi2GJd+B/XmbZtxisVgOOaxgGKiY5TaC0Vwb/Gux
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
dYahAAAAAElFTkSuQmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Sun, 23 Jul 2017 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2017-07-23:blog/american-option-pricing-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Variance Reduction in Hull-White Monte Carlo Simulation Using Moment Matching</title><link>http://gouthamanbalaraman.com/blog/variance-reduction-hull-white-quantlib.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In an &lt;a href="http://gouthamanbalaraman.com/blog/hull-white-simulation-monte-carlo-convergence.html"&gt;earlier blog post&lt;/a&gt; on how the Hull-White Monte Carlo simulations are notorious for not coverging with some of the expected moments. In this post, I would like to touch upon a variance reduction technique called &lt;em&gt;moment matching&lt;/em&gt; that can be employed to fix this issue of convergence. &lt;/p&gt;
&lt;p&gt;The idea behind moment matching is rather simple. Lets consider the specific example of short rate model. For the short rate model, it is known that the average of stochastic discount factors generated from each path has to agree with the model (or the give yield curve) discount factors. The idea of moment matching is to correct the short rates generated by the term structure model such that the average of stochastic discount factors from the simulation matches the model discount factors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scipy.integrate&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cumtrapz&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__version__&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[1]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;apos;1.11&amp;apos;&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;For simplicity, we use a constant forward rate as the given interest rate term structure. The method discussed here would work with any market yield curve as well.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;
&lt;span class="n"&gt;timestep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;
&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="c1"&gt;# in years&lt;/span&gt;
&lt;span class="n"&gt;forward_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;todays_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;todays_date&lt;/span&gt;

&lt;span class="n"&gt;yield_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;todays_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward_rate&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; 
    &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here, I setup the Monte Carlo simulation of the Hull-White process. The result of the &lt;code&gt;generate_paths&lt;/code&gt; function below is the time grid and a matrix of short rates generated by the model. This is discussed in detaio in the &lt;a href="http://gouthamanbalaraman.com/blog/hull-white-simulation-quantlib-python.html"&gt;Hull-White simulation post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;hw_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhiteProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianRandomSequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniformRandomSequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniformRandomGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;125&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianPathGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hw_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;sample_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sample_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
        &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here is a plot of the generated short rates.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hull-White Short Rate Simulation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
AglAyPsAAAAASUVORK5CYII=
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The model zero coupon bond price $B(0, T)$ is given as:
$$B(0, T) = E\left[\exp\left(-\int_0^T r(t)dt \right) \right]$$
where $r(t)$ is the short rate generated by the model. The expectation of the stochastic discount factor at time $T$ is the price of the zero coupon bond at that time. In a simulation the paths are generated in a time grid and the discretization introduces some error. The empirical estimation of the zero coupon bond price from a Monte Carlo simulation $\hat{B}(0, t_m)$ maturing at time $t_m$ is  given as:&lt;/p&gt;
&lt;p&gt;$$\hat{B}(0, t_m) = \frac{1}{N}\sum_{i=1}^{N} \exp\left(-\sum_{j=0}^{m-1} \hat{r}_i(t_j)[t_{j+1}-t_j] \right)$$&lt;/p&gt;
&lt;p&gt;where $\hat{r}_i(t_j)$ is the short rate for the path $i$ at time $t_j$ on the time grid. The expression for the moment matched short rates is given as [1]:&lt;/p&gt;
&lt;p&gt;$$ r^c_i(t_j) = \hat{r}_i(t_j) + \frac{\log \hat{B}(0, t_{j+1}) - \log \hat{B}(0, t_{j})}{t_{j+1} - t_j} 
- \frac{\log B(0, t_{j+1}) - \log B(0, t_{j})}{t_{j+1} - t_j}$$&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stoch_df&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cumtrapz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;B_emp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stoch_df&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logB_emp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_emp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;B_yc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;logB_yc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_yc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;deltaT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;deltaB_emp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logB_emp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;logB_emp&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;deltaB_yc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logB_yc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;logB_yc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;new_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;new_paths&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deltaB_emp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;deltaT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;deltaB_yc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;deltaT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The plots below show the zero coupon bond price and mean of short rates with and without the moment matching.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;stoch_df&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;r-.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
         &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Original&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;stoch_df&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;g:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Corrected&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;B_yc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;k--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Market&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Zero Coupon Bond Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[10]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.legend.Legend at 0x7f78aa2f1990&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXcAAAEKCAYAAADpfBXhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
AAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4FFX3wPHvCQmdhNBbCKAURUGKCIIYRAUUBSy0H8UX
FSyAvDZEQYOKvvrasPsqIFaUohQpghhUumKhhxqqQIAAgRSSnN8fs8SUTYNNdpOcz/Psw87MnTtn
2OTszZ2Ze0VVMcYYU7T4eTsAY4wxnmfJ3RhjiiBL7sYYUwRZcjfGmCLIkrsxxhRBltyNMaYIsuRu
jI8SkWtFZK8H69sgIh09VZ/xbZbciwkR6S8ip0TkZJrXKRFJEZGxBRRDBRF5Q0SiXMffJiKviUil
gji+J4jIFBFJcMV/QkTW5nPCzPJBFNdnd+4z3Ssir4qIZFmR6mWq+lP+hGl8jSX3YkJVv1DVCqoa
eO4FjAL+Bj7Ma30iUiKP5QOApcAlwI2u47cDjgJt8np8L3vJ9X8YBLwPzMouqeYjBZq5/i87A/2B
ezMWyutnZYoGS+7FlIi0AN4A+qjqIde6QBH5SEQOuFqCz51LWiIyWER+cbW0o4FnxDFWRHaLyN8i
8rGIVMjikIOBOkBPVd0KoKrRqjpBVRe6jtFERH4UkeMisl5EbkkT748iMiTN8mAR+TnNcoqIjBCR
HSJyWEReTrPNXZyBrm2hrn0Huf6iOCwiT+bhv/ILoBJQ/UKPJSKlXeWPicgG4Mocji2uF6oaCfwM
XOaqa5eIPC4ifwKxIlLCte4613Y/EXlSRLan+QukdprP4XsROSoim0Xkzjz8fxgfYcm9GBKRIGA6
MF5Vf06zaSqQCDQAWgA3APek2X4VsB2oBkwA/gUMAq517VMBeCeLw3YGFqpqXBYx+QNzgYVAVWAk
8LmINMzmVDJ2WfQEWrpePdJ8GbiL8+0M+7YHGgLXA0+LSONsjnsu5hI4X1o7gUMeOFY4UN/16uKq
O1dE5FLgGmBdmtV9gW5ARVVNzrDLI0AfoKvrL5AhwBkRKQt8D3wGVHHV8Y6INMltLMZHqKq9itkL
mAPMyrCuGhAPlEqzri+w1PV+MLA7wz5LgPvSLDfC+XLwc3PM74EXsompA3Agw7ovgKdd738EhqTZ
Nhj4Kc1yCnBDmuX7gcU5xQmEAslAzTTbVwO9s4hzChAHHAPOuF79cvN/ktOxgB0ZzuFeYE82/2cp
QAxO19Y2nC/rc9t2AYMzlN8FXOd6vwXo7qbO3sCyDOveB8Z5++fWXnl7+Web+U2RIyJP4PR7t8qw
KRQIAA6e64lxvfakKZPxzo1aQFSa5SjAH6eL4mCGskeBmtmEVstN/VFA7Wz2yWhfhn1r5SLOcw6l
eX8GKJ/Ncf6rqk9Daot5sYgcU9VFF3isWm7OISctVHVXFtv2ZbEeIATnL46MQoG2InLMtSxACeDT
XMRifIh1yxQjIhIGjAFuV9WTGTbvxWm5V1bVSqoarKoVVbVZmjIZu0EO4CSDc0KBs6RPXucsAbqI
SJkswjuAk3DSqgvsd70/DZRNs62GmzrS7h/qqjOvceaJqm4ClgM3e+BYB8l8DjnJ7kJudkO+7gUu
ymJ9hOtn4NzPQaCqPpiLWIwPseReTIhITeBLYJSq/pVxu6r+jdN18ro4tyyKiDTI4Ta/L4F/i0g9
ESmP0w8/TVVT3JT9FCdxzBSRxq76K4vIGBHpitM9ccZ1EdDf9UXU3XUMgD+A20SkjIhcDNzt5hiP
iUhFEQnB6bOflss4z/tOF1dfdAdggweO9TUwxnUOdYDh5xtXLnwEPOf6v0RELheRYGAe0EhEBrg+
hwARaW197oWPJffi4x6cfvWJkv4+95Mi8q6rzGCgJLAJp095Ou5byOdMxknaP+H0F5/BSaqZqGoi
zgXELcBi4ASwCqgMrFbVs8AtwE1ANM5FyIGqus1Vxes4LeC/cfq9P3NzmNnAbzgXFee64stNnBlb
uDlNcvD4uf8/nAvAk1T1fx441nicbrBdrno/ySGO7OJ0ty3tutdwvky+F5ETOMm+jKrGAjfiXG85
4Hr9B+fnwhQiopr9z7GITMJpQR3K8Cd62jJv4lyVPw3cpap/eDpQY7IjIinAxarqrh/ZmGInNy33
KTi3ZbklIt2Ai1S1ITAM58q6McYYL8oxuavqL8DxbIr0wPXno6quBoJEpHo25Y3JDzZfpDFpeOJW
yNqkv4Vtv2vdBd+JYExuqao9Ym9MGnZB1RhjiiBPtNz3k/7e3Dr8c29yOiJifzobY8x5UNU83bKb
25Z76gBFbszBGUsDEWkLxKhrICp3agILHnzQ64/m5sfrmWee8XoMdn52bnZ+Re91PnJM7iLyBbAC
58GGPSLyLxEZJiJDAVR1PrBLRLYDHwAPZFff16+8Qr9pn3P7u7efd9DGGGOyl2O3jKr2z0WZXD9J
12rkA5RZ9yprXl3DqQGnCAwMzO2uxhhjcqnABw4rE1CGPZ/uYe7suZQtWzbnHQqRsLAwb4eQr4ry
+RXlcwM7v+IoxydUPXowEU17vJTkJJ5//kZu7jCEVp0HFFgcxhhTmIgImk8XVPPFB28M5Pvjv1K7
QXNvhmFMsVKvXj1ExF4++KpXr57HPmevttwTTp9E/PwoWSa7obONMZ7kagV6OwzjRlafTaFruZcq
F5ia2NfvXM/YOWPth84YYzzAqy33c5JSkqh9e21KbS9F5I/rKF2lSoHFZExxYy1331VkWu7n+Pv5
8+uUX2lT5SKGhoSgs2d7OyRjjCnUfCK5A4RUDOGTsDA2xcdz19Db+T1iWs47GWMM8OKLLzJ06FCP
l82Jn58fO3f65hQCPtEtk0qVLwdcw4C5yxn/4L2MffF/WZc1xpyXwtAt8/HHH/Paa6+xY8cOgoKC
6NmzJy+++CJBQUHeDi2dEiVKsG3bNho0aOCR+opct0wqEW7733zmTZmCf5Bn/rOMMYXLq6++ypgx
Y3j11Vc5efIkq1atIioqihtuuIGkpKRM5ZOTk70QpcOnvyQLePAbzYuzyWd18rrJmpySnKf9jDFZ
y+vvYUE6efKkli9fXmfMmJFufWxsrFarVk2nTJmi4eHhescdd+iAAQM0KChIJ02apOHh4TpgwIDU
8lOnTtXQ0FCtUqWKPvfcc1qvXj394YcfVFXTld29e7eKiE6dOlXr1q2rVatW1QkTJqTWs2bNGm3X
rp1WrFhRa9WqpcOHD9ezZ8+mbhcR3bFjh8fOP6vPxrU+T/nWt1ruGQz8ZiBfbPiCuPhYb4diTPEi
8s8rq+3ns18OVqxYQUJCAr169Uq3vly5cnTr1o3FixcDMGfOHHr37k1MTAz9+/d3Hdo55qZNm3jw
wQf58ssvOXjwICdOnODAgQMZwkwf3/Lly9m2bRtLlizh2WefZevWrYDT7fLGG29w7NgxVq5cydKl
S3n33XcpDHw6uT/Z4UnmX/8x5W64CSIivB2OMSafRUdHU6VKFfz8MqemmjVrEh0dDUC7du245ZZb
AChdunS6cjNnzuTWW2+lXbt2+Pv78+yzz2Z7TBEhPDyckiVL0qxZM5o3b86ff/4JQMuWLWnTpg0i
Qt26dRk6dCjLli3zxKnmO59O7pdXv5yABYsgLIz19SqxZv8ab4dkTPGg+s8rq+3ns18OqlSpQnR0
NCkpKZm2HTx4kCquZ2BCQkIybT/nwIED6baXKVOGypUrZ3vc6tX/mfa5bNmyxMY6vQXbtm3jlltu
oWbNmlSsWJGnnnoq9QvG1/l0cgdgyBB2PPwvWl9/JRPfnujtaIwx+ahdu3aUKlWKWbNmpVsfGxvL
ggUL6Ny5M5C5WyWtmjVrsm/fvtTluLg4jh49el7x3H///VxyySXs2LGDmJgYJkyY4NsXUdPw/eQO
hFYMZcqkKfww5QcWLVrk7XCMMfkkMDCQp59+mhEjRrBo0SKSkpLYvXs3ffr0oW7dugwcODDHOu64
4w7mzp3LqlWrOHv2LOHh4dmWzy5ZnzrlzDlRtmxZtmzZwnvvvZfXU/KaQpHc/f386X9tf2bMmMHA
gQN59+XhxMXGeDssY0w+eOyxx3jhhRd49NFHCQoKol27doSGhrJkyRICAgJy3P/SSy/lrbfeok+f
PtSqVYvAwECqVatGqVKl3JbP+FdA2uVXXnmFzz//nMDAQIYNG0bfvn2z3deX+NZDTLkwbPA1TJr1
C0tvvI6O0xeDmwsvxpisFYaHmDzp9OnTVKxYke3btxMaGurtcLJVdB9iyoVR9z7MU1KSnbOWwmuv
eTscY4wPmjdvHnFxcZw+fZpHHnmEZs2a+Xxi97RcJXcR6SoiW0QkUkRGu9leV0SWiMifIrJURGp5
PlTHJR16MX7Wd9zVuTMJgwewcPvC/DqUMaaQmj17NrVq1aJOnTrs2LGDadOK31hVOXbLiIgfEAl0
Bg4Aa4G+qrolTZmvgTmq+pmIhAFDVHWQm7ouuFvmnKTks9z4WRcqlanE9Dun+3TflzG+pLh1yxQm
nuyWyU1ybws8o6rdXMtP4DwK+1KaMhuALqq637V8QlUzjfDjyeQOsHjHYq6rfx0l/Ep4rE5jijpL
7r6roPvcawN70yzvc61L6w/gNlcQtwHlRSQ4L4GcjxsuuiE1sa9bNovtv36f34c0xphCwd9D9TwG
vC0idwE/AfsBt0O1pb3nNCwsjLCwsAs++G8/TuOq3v14pO+tvNT6xguuzxhjvCkiIoKICxxyJbfd
MuGq2tW1nKlbJkP5csBmVa3rZptHu2XOiT1+iM8+eplxL3/C/PnzufLKKz1+DGOKCuuW8V0F3S2z
FrhYREJFpCTQF5iT4cCV5Z8rmmOAyXkJ4kKVD67OfY+9ykcffUSPHj14b+F7JCYnFmQIxhjjU3JM
7qqaDAwHvgc2AtNUdbOIjBeR7q5iYcBWEdkCVAMm5FO82erRowcdBnVg5ICR/LXtT3AzsL8xxnhL
QU7Ll6v73FV1oao2VtWGqvof17pnVHWe6/1MVW2kqk1Udaiqns3PoLMz7t/jGD38MXY/MBqGDAE3
o8sZY3zbF198wZVXXkmFChWoXbs2N998M8uXL/dqTFOnTuWaa665oDoK8pbtQveEak4ur345z/cZ
yB1r1nB62qd8NeaW8x5+1BhT8F577TUefvhhxo4dy+HDh9mzZw8PPPAAc+bMyXnnNNxNv3chU/Kp
6gUn5wK91pHXqZsu5EUBTu+VtGiBtr9b9K5HLtaUNNNiGVPcFeTvYV6dOHFCy5cvrzNnznS7PSEh
QR966CGtVauW1q5dW0eNGqWJiYmqqhoREaF16tTRl156SWvUqKGDBg1yu05Vde7cuXrFFVdoxYoV
tX379vrXX3+lHmPv3r162223adWqVbVKlSo6YsQI3bx5s5YuXVr9/f21fPnyGhwcnBrPI488onXr
1tUaNWro/fffr/Hx8al1vfzyy1qzZk2tXbu2Tp48Wf38/LKdli+rz4bzmGavyCZ3VdUVP3ysKck2
/6oxaeXm95BwPLqcWwsXLtSAgABNzuL3dty4cdquXTuNjo7W6Ohovfrqq/Xpp59WVSe5+/v765gx
YzQxMVHj4+Pdrlu3bp1Wq1ZN165dqykpKfrJJ59ovXr1NDExUZOTk7V58+b6yCOPaFxcnCYkJOjy
5ctVVfXjjz/Wa665Jl08o0aN0h49emhMTIzGxsbqrbfeqk8++aSqqi5YsEBr1KihmzZt0jNnzmj/
/v0tueeHhesW6s9RP3vt+Mb4Cl9O7p9//rnWrFkzy+0XXXSRLly4MHV50aJFWr9+fVV1knupUqVS
W/JZrbv//vtTvxDOady4sf7000+6cuVKrVatmtsvF3fJvVy5crpz587U5RUrVqTGM2TIEB0zZkzq
tsjIyAJN7p56iMmnbTy8ke49ujOo/yA6PNIYqlb1dkjG+DR9Rj26nFuVK1dOnWbP3TyqBw4coG7d
fx6hCQ0NTTf5ddWqVTON+Z5xXVRUFJ988glvvfWWE6sqZ8+e5cCBA/j5+REaGur22BkdOXKEM2fO
0KpVq9R1KSkp5xqyHDhwgNatW6eL9dy2glDkLqi606RKE+Z9M4/FH83ms0sugbg4b4dkjHHj3DR7
3377rdvttWvXJioqKnU5KiqKWrX+GYTW3QXPjOtCQkJ46qmnOHbsGMeOHeP48ePExsbSp08fQkJC
2LNnj9s5XDPWU6VKFcqWLcvGjRtT64qJieHEiROAM93f3r3/jNwSFRVld8t4Wgm/EnRp1YWFvXvz
iCpD33mIPSf2eDssY0wGgYGBjB8/ngcffJDZs2cTFxdHUlISCxcuZPTo0fTr14/nn3+e6OhooqOj
ee6553I19V5a9957L++//z5r1qwBnMk85s+fz+nTp2nTpg01a9bkiSee4MyZMyQkJLBixQrAmUR7
3759nD3r3OktItx7772MGjWKI0eOALB//36+/94Z46p37958/PHHbN68mTNnzvDss8966r8pd/La
j3MhL3zgKv3oj0drifIl9Ks5X3k7FGO8whd+D3PyxRdfaOvWrbV8+fJas2ZN7d69u65cuVITEhJ0
5MiRWrNmTa1Vq5aOGjVKExISVNXpXw8JCUlXj7t1qk5f/ZVXXqnBwcFaq1Yt7d27t8bGxqqqc7dM
z549tXLlylq1alV96KGHVFU1MTFRu3fvrpUqVdKqVauqqmp8fLw++eST2qBBAw0KCtJLL71U33rr
rdTjnLtLp3bt2jplypQC7XMvdNPsXaiY+Bh+WvYT8Sfi6d27t1djMcYbbGwZ31Wg47l7ki8k97Ri
DkXx1PhrefnuaZRr1dbb4RhTICy5+65iPYeqJw1550b8d0VRptstsGmTt8MxxhiPKdbJ/cOHf+QN
uuB3JBpWrvR2OMYY4zHFulsGcG6LXLKEdxP3svbMWqYMnOLtiIzJV9Yt47usz93D4s7GEXJnCOU3
lefXFb9SpUoVb4dkTL6x5O67rM/dw8oElGHv9L30v6M/Xbp0Ieb4cfTgQW+HZYwx582Su0uZgDJM
mDCBdu3a0bRZXV56pKO3QzLGmPNmyT0NEWHo6H+RVDWZ76Iq25+uxphCy/rc3UhKTuLPP/6kVatW
xJ2No0xAGW+HZIzHFMc+96ioKOrXr09SUlKuBgXzFutzz2f+Jfxp1aoV0WeiuXry1Szesdim6zOm
gNSrV4/SpUtz7NixdOtbtGiBn58fe/ac37hQ5ztoV6dOnZg8efJ57etNuUruItJVRLaISKSIjHaz
PURElorIOhH5Q0S6eT7Ugrdq3ypuuvgmrk+qC1dcAX/84e2QjCnyRIT69evz5Zdfpq7bsGEDcXFx
55WgL2RqvcIsx+QuIn7A20AXoCnQT0SaZCg2FvhKVVsC/YB3PR2oN3Rv1J0JnScg//0vrF/P3luu
hVWrvB2WMUXewIEDmTp1aury1KlTGTx4cOry/PnzadmyJUFBQYSGhjJ+/PjUbVFRUfj5+TF58mRC
Q0Pp3LlzpvpnzpxJgwYN2OR6Mn3VqlW0b9+e4OBgWrRowbJlywAYO3YsP//8M8OHDycwMJCRI0fm
1yl7Xk4jiwFtgQVplp8ARmco8x7wmOt9O+CXLOrKcjQ0nxYfr+/c3FxLNUZ3zrfRJE3h5uu/h/Xq
1dMffvhBmzRpolu2bNHk5GQNCQnRPXv2qIhoVFSULlu2TDds2KCqquvXr9caNWro7NmzVVV19+7d
KiI6ePBgPXPmjMbHx+vu3bvVz89Pk5OTdfLkydqwYcPUGZT279+vlStXTp3hacmSJVq5cmWNjo5W
VdWwsDCdNGlSgZx7Vp8N5zEqZG66ZWoDe9Ms73OtS2s8MFBE9gLzgBHn9U3jq0qVotS4B2hTtSUP
/+/L1PGcjSmqwsPDEZFMr/Dw8FyXz6psbp1rvS9evJhLLrkk3aQcHTt2pGnTpgBcdtll9O3bN7W1
DU7Xzvjx4ylTpgylSpUCnIbs66+/zquvvsqyZcuoX78+AJ999hk333wzXbp0AaBz5860bt2a+fPn
X1D83uapafb6AVNU9XURaQt8htOFk0naDzwsLIywsDAPhZC/7r5qKAN/uIs77riDvn37ct+L93FD
oxu8HZYx+SI8PDxPyTmv5XNjwIABdOzYkV27djFo0KB021avXs2YMWPYsGEDiYmJJCYmcuedd6Yr
U6dOnUx1vvLKKzz99NPUrFkzdV1UVBRff/01c+fOBZwvgaSkJLfdOQUlIiKCiIiIC6skp6Y9TrfM
wjTL7rplNgC10yzvAKq4qcuDf8B4R3x8vDa4qoEGXxGssceiVRcs8HZIxuSJr/8enuuWUXW6RIKC
gvTMmTOalJSkfn5+GhUVpRdddJFOnDgxdeLrUaNG6cCBA1VV03XBnHNu3V9//aU1a9bUmTNnpm57
8cUXdejQoVnG06lTpyLbLbMWuFhEQkWkJNAXmJOhTBRwPYCIXAKUUtXoC/nS8VWlSpXi+fefp9PF
ndhwa0+YOhWK2T3DxhSUyZMns3TpUsqUcZ41UdfvWmxsLMHBwQQEBLBmzRq++OKLdPupm99JVaVp
06YsXLiQ4cOHp7bUBwwYwNy5c/n+++9JSUkhPj6eZcuWpU68Xb16dXbu3Jmfp5k/cvMNAHQFtgLb
gCdc68YD3V3vLwF+Af4A1gGds6jHs19z3jZjhv59bK++vfptb0diTK75+u9h/fr1U1vuaaVtuc+c
OVNDQ0M1MDBQb7nlFh0xYkSuWu7n1v36669ao0aN1Iuoa9as0WuvvVYrVaqk1apV0+7du+vevXtV
VXXlypXaqFEjrVSpUuqUe/klq88Gm2avYCWlJNH6f63p2aQn4WHh3g7HmFwpjk+oFhY25K8P+evQ
X1xe7fJ/Hq5YvhxatwbXFXpjfI0ld99lyd1HvfzsUI4v/YgX/a+Db76BChW8HZIxmVhy912W3H3Q
sbhjhF5fh3q/J/JLXDJB/fpBhos8xvgCS+6+ywYO80GVylRi/w9/E3ZHf64vX54jjz1KckrxHNPC
GON9ltw9KLB0IG9OnUrHoUNp3Ot6xs0Z5+2QjDHFlHXL5INtR7fRbVg3ym4ry+/rfqdEiRLORNxl
bFx4433WLeO7PNkt46nhB0waDSs3ZNv0bezZs4cSJUqwf8fvBN50GxXmLITGjb0dninmQkNDz3ts
c5O/QkNDPVaXtdzz2aHYQ1wzsTnPJHfg/56e4e1wjDGFkN0t44N2Hd/F3Mi5jLyqEI0DbYzxKZbc
C4HPV31OhyYdCA2qCydPQlCQt0Myxvg4uxXSx837ax6Dugxi9tzZ8Nxz0LIlREZ6OyxjTBFkLfcC
FBMfw3cR3/HIXY/watmy/N+uXVCpEvzyC1xyibfDM8b4KOuWKSQ2btxI1y5dqF3/NO9VbkSL6b9A
QIC3wzLG+CjrlikkmjZtyqj//Zu/tifwbdPrLLEbYzzOWu5ekqIp7D24l4N7DtK2bVtOxJ8gqLTr
4qoq2H3IxhgXa7kXIn7iR2itUNq2bcu+k/to/n5z/vz7T1iyBPr29XZ4xphCzp5Q9QEr965keJvh
NK92OTzeGl5/3dshGWMKOeuW8TWJiczdtogbGt9Aaf/S3o7GGOMDrFumCHjnhw/pdW0vlq9b/s/K
hATvBWSMKZRyldxFpKuIbBGRSBEZ7Wb7ayLyu4isE5GtInLM86EWD9e0vIaxT43l/279P1asWAGJ
idClC4waBck2PrwxJndy7JYRET8gEugMHADWAn1VdUsW5YcDV6jqPW62WbdMLi1YsIDBgwdz2W11
mDxzPfWik6B7d5g9G/zsDy5jipP86pZpA2xT1ShVPQtMA3pkU74f8GVegjCZdevWjf4v9WfF15tY
MHgkVK4M7dtbYjfG5EpuWu63A11UdahreQDQRlUzDXMoInWBlUAdd010a7nnTUJSAjt27SDuZByt
atfmaAV/Kper4u2wjDEFzBcm6+gLzMgug4eHh6e+DwsLIywszMMhFB2l/EtxacNLAdh5fCcd3u9A
xF0RNKrcyCmQnOy05O2BJ2OKlIiICCIiIi6ojty03NsC4ara1bX8BKCq+pKbsuuAB1R1VRZ1Wcv9
PH25/kuOxx/ngSsf+Gfl6NHOwGOjM13jNsYUIfkycJiIlAC24lxQPQisAfqp6uYM5ZoA81W1QTZ1
WXL3kEkLX+OOJycR9P0yqGJdNcYUZflyQVVVk4HhwPfARmCaqm4WkfEi0j1N0T44F1tNPpu4YCLD
+jzOshcnWGI3xrhlT6gWQrtjdrNo4SLGjRzH66+/Tv/+/f+Z8Hj7dmjQwO6qMaYIsfHci5kNGzbQ
/ZbuSHNhxjszaJVYCVq3hg4dYOpUqFjR2yEaYzzAhh8oZi677DIem/wYJzef5JOXP4E9eyAlBebM
gR7ZPYpgjCnqrOVeBMSeieXQwUNcdNFFrFszmyajnqfsKxPh6qu9HZoxxgOsW6aY23xkM9d+fC1z
+87hqpC23g7HGOMh1i1TzCnK2ze97T6x79kDv/9e8EEZY7zCknsRcmnVS+ndtHfq8sBXBxKxK8IZ
WbJPH2eWJ2NMsWAzMRVRCzYtYPob00n4NYGr3m1OmQED4P77vR2WMaaAWMu9iOp6SVcif48kwC+A
a264gbWd2nDybKy3wzLGFBBL7kWUiFC3Sl0+++wzet3Ri6uvvpoJn01IX+jxx+HZZ20SEGOKILtb
phjYd3Ifj7/3OHvm7mHZsmWUKFECtm2DJk2c++KvuQbmzoWgIG+Haoxxw26FNNlSVUSEWZtnceT0
EYbFXASDBkGrVs6DTzZ0sDE+yZK7yVH0mWiavtuU+f3n06pWK4iOdjbYAGTG+CxL7iZXDp46SM0K
NQFntqfDpw8TEhSSvtD+/VC7theiM8ZkZA8xmVw5l9gBrupzFf837v/SF5gzB66/3i60GlOIWXIv
xhKTE7mk8yUcXHiQYcOGER8f72xYuxY++ABKlPBugMaY82bdMoaTJ08yZMgQtu7YSuP7GzP93un/
jA9vjPE665Yx5yUwMJDp06cT1ziOxWMWs27dusyFdu6EO++EgwcLPkBjTJ5ZcjeA0zJYOWkl383+
jkaNGgFGmFCJAAAcu0lEQVSwZv+afwr8+98wYwZcdhnMn++lKI0xuWXJ3aSqWq4qHTp0oEKFCnyx
/gv6z+xP3Nk4Z+N770GXLnDiBFSt6t1AjTE5ylVyF5GuIrJFRCJFZHQWZXqLyEYRWS8in3k2TFPQ
ziafZWbvmZQJKAOA1qwJCxbAqlVw5ZVejs4Yk5McL6iKiB8QCXQGDgBrgb6quiVNmYuBr4BOqnpS
RKqoarSbuuyCaiF07OQxOozuwLwJ82hQqUHmAvv2QXAwlCtX8MEZUwzk1wXVNsA2VY1S1bPANCDj
BJ33Au+o6kkAd4ndFF7v//Q+B747wLgR4zh16lT6jWfPQq9eTn+8McZn5Ca51wb2plne51qXViOg
sYj8IiIrRKSLpwI03jfm5jHs3LCTsmXL0rp1a96d+y67ju9yNh465MzVOmiQd4M0xqTjqck6/IGL
gY5AXeAnEbnsXEs+rfDw8NT3YWFhhIWFeSgEk19EhEqBlfjwww959YNXGd5vOGPGjeH5x59H6tSB
iRMz76RqA5EZc54iIiKIiIi4oDpy0+feFghX1a6u5ScAVdWX0pR5D1ilqlNdy0uA0ar6W4a6rM+9
kDsWd4xZv8xiz897GD9+PAnJCfiJHyVLlExf8L77wN8fXnwRKlTwTrDGFBH5MnCYiJQAtuJcUD0I
rAH6qermNGW6uNbdJSJVgN+AK1T1eIa6LLkXMffNu4+qZavy3HXP/bMyKgoaNnT64+vWdYYzqFbN
e0EaU8jlywVVVU0GhgPfAxuBaaq6WUTGi0h3V5lFwFER2Qj8ADyaMbGboud43HF2HN/BY+0fS78h
NNRJ6C1bOmPF233xxhQ4G1vGeMySX5fw1fav+LDvh86KpCSIjYWKFb0bmDGFnI0tY7xGVRn2xjBm
PjSTH374wVnp7+8+sb/9NsTEFGyAxhQz1nI3HrPnxB62rN7CkCFD6N+/P+0GtePWS2+lhF+aoYNn
z4bHHoM//4QyZbwXrDGFiM3EZHzCkSNH6Na7Gxu2b2DF/BW0vLzlPxt37oTjx52+eGNMrlhyNz5j
0fZFREyPoGH1hgwZMoTTiacpVzKb4QnWroUWLZyuHGNMOpbcjU+KT4qnzYdt+KD7B7QLaZe5wPbt
cPnl0LQpfPQRXHFFwQdpjA+zC6rGJ63cu5LLq19O2zpt3Rc4fNi5XfK332DoUOfpVmPMBbGWuykQ
qpo6dd/Tnz5N5XqVeeiah/4pcOoUjB0Lgwc798cbY1JZt4zxeScTTlKjYw1qHK/B1198TevWrXPe
6exZCAjI/+CM8VHWLWN8XmCpQHb+sJMXnn2Bm266iSfHPcn7q98nyy/9P/90JgdJSSnYQI0p5Kzl
brxm//79tLu1HadPnGbFdyto3Lhx5kLDh0Pz5nDvvQUfoDE+wrplTKEzb+s8ti/eznUdr6NZs2Zs
PLyRS6temto/n9pi98vwR6YNKWyKEUvuplDbdnQb7Sa14/dhvxMSFJJ1wePHncm6n3wSevSwJG+K
POtzN4Xarphd/Of6/6Qm9vikePd98e+95zz01KsXDBtWwFEaUzhYcjc+48aLbuSelvekLre/uz3P
zn42c8HRo53Bx4KCoGvXAozQmMLDumWMTzp46iBt/tWGMxFnCH8mnAcffBC/jP3ux45BcLB1y5gi
z/rcTZGiqkRGRjJkyBDikuMIGRjC7AdnZ7/T/v3wwAPwzTeZL8IaU0hZn7spUkSExo0b89NPP3H6
4tMsHbuUpUuXZr/ThAnOGDWW2E0xZy13UyhEn4km5kAMNWrUoFy5coz7cRwPXvkgNSvUTF/wxAln
ZMly2YxAaUwhYy13U2RVKVuFiy++mPLlyzNz80y+3fItlctWzlwwKChzYj97Frp3dyYKscaFKSZy
ldxFpKuIbBGRSBEZ7Wb7YBE5LCLrXK8hng/VGEfn+p2Z0XsGJUuUBOCn7T+xet/qrHf45BP47jvo
2RN69y6gKI3xrhxnRhARP+BtoDNwAFgrIrNVdUuGotNUdWQ+xGhMOsFlggkuEww498J3u7kbHVp0
4Kv3v6KiuzlbBw2CM2fg6afhqqsKOFpjvCM3Lfc2wDZVjVLVs8A0oIebcnY/mvGKVz96lfoV69O0
aVO+nv41y3YvS18gIABGjHAmBRkxInMF1lVjiqDczGlWG9ibZnkfTsLP6DYRuQaIBB5W1X0eiM+Y
bJX2L81919wH18CAAQPoPag38RXi+X3O74SGhqYvXNlNH31sLHTqBIsXg7tWvzGFlKcmrJwDfKGq
Z0VkKDAVpxsnk/Dw8NT3YWFhhIWFeSgEU9x16NCBJz97ks3fbua3334jNDSUyKOR1K9Yn4ASWYwH
/+mn0LChJXbjUyIiIoiIiLigOnK8FVJE2gLhqtrVtfwEoKr6Uhbl/YBjqprpt8VuhTQFKTYxlkvf
uZRpd0zj6pCr3RdKSYHTp6FChfTrk5Jssm7jM/LrVsi1wMUiEioiJYG+OC31tAeukWaxB7ApL0EY
kx+iYqIY0GxAamJPTE4k+kx0+kJ+fpkTuyp06+YMSnboUAFFa4xn5eohJhHpCkzE+TKYpKr/EZHx
wFpVnSciLwC3AmeBY8D9qhrpph5ruRuv6flwTw7EH2DV26syj1OT1oYNcMUVkJzsdNdERUFgYMEF
akwGNraMMVlQVbq80oUjXx2hTMkyvPPOOzRs2pDyJcu732HrVnj8cQgJcUagNMaLLLkbk4OUlBSm
TJnCmDFjONPoDL9/9TsNazfMegd3fe+nTmXuyjEmH9nwA8bkwM/Pj7vvvpsJsyZQP7A+4Y+HA87D
UCnqZhLujIk9ORk6doSffsr/YI25ANZyN8WWqpKcnIy/vz+PL36csgFlCQ8Lz36n9evhscdgwQIb
R94UGOuWMeY8JCQl0HZSWxb83wJqlHdu/IpPiqe0f2n3O7ibnPv4cShTBkpnsY8xF8C6ZYw5D6X8
S7Fu6LrUxL5i/Qpq3VGLmNMx7ndw12J/5BFo3BimTHH66Y3xMkvuxuC0jM6Zt3Uelf+uzFUtr2L+
/PkkJidmv3N8PPzxB+zZA0OGwOpsRqg0poBYt4wxbqRoCgsXLOThhx/mdLnTDHtyGGNvH5v1DsnJ
8OWX8PPP8MEHBReoKRasz90YD/v7xN80+1czAlYHsGHDBoKDgzmdeJpyJfMw01NkJMTEQBt34+0Z
kzPrczfGw2oE1eDAjAPs2LGD4OBgNh7eSLP3m5GUkod+9ccfh19+yb8gjXHDkrsxOfD386e06y6Y
b7Z8w4g2I/D3c+5/PxF/wv398eekpDgt9gceKIhQjUll3TLG5JGqpl6AbdyrMbf3vJ0XBr+Qt0pO
nYJRo5y7bC69NB+iNEWJdcsYUwDOJfbo09GkBKcw9amp3HnnnWzfvp2Dpw7mrpK334bJk+Gyy5xu
G2M8zJK7MeepSrkqbJu8jW2R27jiiitodWUrLul+CYePHM555//7P7j/fmd4gyZN8j9YU+xYt4wx
HhL+XTg/f/Iz119xPWPGjGHHsR1ULluZiqWzmeVp716oUcOZ5zWtY8egUqX8DdgUGnYrpDE+QlW5
9uNrGdJiCHddcVfedo6OdvrhIyNt+j8DWJ+7MT7jZMJJGlVuxMBmAwFnqOFZm2aRnJKc886//AJ9
+lhiNxfEWu7GFIAXpr7Ac+OeY/p707n5ppvTDXfglrvByZYsgbg4uPlmZ3pAU2xYt4wxPmrhtoWs
XLySr9/6mqpVq9L3ob40v7I57eu2z10FqtCiBfz5p3OHzaefOlMBmmLBkrsxPi4pKYlPPv2E+x69
j+aXN2futLnUqFEj5x3PnnVun3z1VWd44agoqFIl/wM2PiHf+txFpKuIbBGRSBEZnU2520UkRURa
5iUIY4oLf39/BgwawJvfvck9/e4hODiY5JRk7p59NzHxWQwxDM7dNP/+N+zYAT/8kDmxJybCiRP5
G7wpVHJsuYuIHxAJdAYOAGuBvqq6JUO58sB3QAAwXFXXuanLWu7GZDBtwzTeXP0my4csP9dCy7lP
PqNJk2DePPjmm/wJ0nhVfrXc2wDbVDVKVc8C04Aebso9B/wHSMhLAMYUd90u7sbUnlNTE/pTk59i
6JSheatk5Up46KF8iM4UVrlJ7rWBvWmW97nWpRKRFkAdVV3gwdiMKRaCSgfRsHJDwLk//tMfP+Xr
R79m4MCBREZGZt9dc85HH0FYWOb1EybA8uXOBVlTrPjnXCR74jQ3XgMGp12dVfnw8PDU92FhYYS5
+4E0ppgSEdZ/tB5JEN58803at29PXL04Zrw9g65Xdc1bZRs3wljXBCNXXw0//gglS3o+aONxERER
REREXFAduelzbwuEq2pX1/ITgKrqS67lQGA7EIuT1GsAR4FbM/a7W5+7MXmzdPNShj8znJpHa7Jk
yRLik+JZvX81YfXCct75yBF4801491249lqYNSvf4zX5I19uhRSREsBWnAuqB4E1QD9V3ZxF+R+B
h1X1dzfbLLkbk0fnfmdEhDdXv8mPu3/kmz55uHB6+rQzE1Tt2unXb9kCwcFQvboHozX5IV8uqKpq
MjAc+B7YCExT1c0iMl5EurvbhWy6ZYwxeSMiqRdb/f38GddxXOq2d5a+w9r9a7OvoFy5zIkd4MEH
4fvvPRmq8SH2EJMxhVRsQizBDYNpEdKCF8a/QOfOnXN/C2VCgjPk8PvvWz98IWBPqBpTjMQnxbNw
60JO/naSF198kXLlyxF7VSx/vP4HpQNKn1+lhw7B7bfD8OFwxx3OePPG62xUSGOKkdL+penZtCeD
Bg1iw4YNNLutGYfnH2bkgyMBiImPyd1tlGn973/OrZP9+kHv3vkQtSko1nI3pohISkniRPwJ/BL8
CA4O5qkfniI2MZaJ3SbmvpK4OPjkE2cMmwkT4M478y9gk2vWcjemGPP386dy2coEBwcDsP34dkZe
NTJ1+5Q1U9h3cl/2lZQpA8OGOXfS3HZb5u3vvgv793sybJNPrOVuTDGw79g+6tavS79e/Rj3xDia
nM+8rfv3w+WXw86dNpFIAbOWuzHGrYCSAbw7510a1W/Etddey4033cjVz1xNSkpKHioJgMmTMyf2
M2fg6FHPBmwumCV3Y4qB6uWrc9+19/HMM8+wa9cupKGw6cNNPPvsswAcPHWQ43HHs6+kWjXo2TPz
+qlToU4dGDoUNrt9ttF4gd3nZEwxU7ZsWWb9dxZnJpwhICkAgLFLx9IguAFPdXwq7xVu3Ajx8fDh
h84sUZdc4uGIzfmwlrsxxVC5kuWoWr4qFStWRFU5kXCCYa2HpW5/8tsn2XtibzY1pPH2206LfeRI
uOuuzNuTkjwTtMkTu6BqjEnnrz1/ccVlV3DD1Tfw8L8f5sYbb+RsyllKljiPJ1lPnYJmzeCvv6BC
Bc8HW0zYE6rGmAt2LO4Yq3at4u9VfzNx4kROnjlJSpsUNv1vE+XKlctbZV9/DdOnOy9z3iy5G2M8
SlUZ+NpAfp/9O7069uL555/n1wO/kpSSRNs6bXNXSUIClCqVft38+bB2Ldxzj/tBzUw6ltyNMR6n
qiSlJOHv54+I0P2L7vRq0ou7W96duj3Pc75ed50zeUiJEvDpp85wByZLdp+7McbjRISAEgGpk3d3
DO1Iv8v/ScZN72lKxMaIvFU6dqwztEFAAHTs6NmADWAtd2PMBfhr31+0v709/pH+3Hzzzdx3/30c
Dj5Mr0t65a41f+IEBAWlX3f2LIwaBW+84SR/Yy13Y0zBalanGfuW7WPHjh20atWKPgP6MKDLAKa7
LqDm2JjLmNgBZs+G9estsV8ga7kbYzxm3tZ5rP1lLS2rtKRHjx5M/WMqW49u5YXOL+S+kj17nOEM
WrRIv379emeogzZtIK99/IWcXVA1xviUzp90ZmSbkfRo0gOAxdsX06hKI0Irhua9sj59nFsrmzaF
d95xJv0uJvKtW0ZEuorIFhGJFJHRbrYPE5G/ROR3EflJRM5jyDljTFHzTZ9vuLnRzQAkpyTTvVN3
Hhz2IMuXL0dVSdE8DFzWsCFUreoMd1C5cj5FXHTk2HIXET8gEugMHADWAn1VdUuaMuVVNdb1/hbg
AVXt5qYua7kbU0ydSjjFs/OfpfqO6nz00UcgcLTJUda8tYb6dernrpLERPjpJ7j++vTrVeG112DE
iCI5J2x+tdzbANtUNUpVzwLTgB5pC5xL7C7lgTx8HRtjioMKpSrw317/5dFHH2Xz5s38a9y/CIgO
YNgQZ0ybw6cP897a97KvpGTJzIkd4OefneGI7SJsqtwk99pA2hGE9rnWpSMiD4jIduA/wMiM240x
5hwRYXT/0UT+EMmiRYsA+Oyvz1i9f3VqmRPxJ0hMTsxdhZUqwSuvZL7Qunmzc/dNYi7rKUI8diuk
qr6rqhcDo4FxnqrXGFN0lS9ZPvV++BY1WvDvtv9O3Xbbo7dx22O3cfx4DuPMgzPUcLdMPcHOiJU9
e0KtWvD5554Ku1DIzXju+4G6aZbruNZl5Svg/aw2hoeHp74PCwsjLCwsFyEYY4q6TvU7pVuOKR9D
yS0lqV+/Pl26dKHEFSV4dNCjtKzdMveVXn65k/g3bChUY9hEREQQERFxQXXk5oJqCWArzgXVg8Aa
oJ+qbk5T5mJV3e56fwswTlXbuKnLLqgaY/Lk2LFjTPlsCqNfGU215Gpsi9xGuXLlWLBtAZ0bdM55
KGJVZ8jhyy8HvwydFYMHw4svOi17H5Zv97mLSFdgIk43ziRV/Y+IjAfWquo8EXkDuB5IBI4Dw9Mm
/zT1WHI3xuRZYnIivx74lRBCCAkJYefxnbT9qC37H95PQIkAUjSFFE3B3y8Pk8tt2eIMYLZ3rzOA
mQ+zh5iMMcXCrwd+5Zc9vzCq7SgAJn03if9+819Wv7qaIHdDGrgTFweRkdC8efr1W7fC8OHQty/0
6uVcrPWy80nuNoeqMabQaV2rNa1rtU5dXr5nOf7b/Klbty7XX389TTo1oeFVDbnryruyrqRMmcyJ
HWDaNFiyxHnNnw8zZ3r+BAqAtdyNMYXeuTHnT586zaxZs3j8tceJ2xPH3G/nct1117F632rqVaxH
9fLVc67s2DGYNQu++gqGDYM77ki/ffduqFYNypbNl3Nxx7pljDEGWLprKSESQvVK1QkMDKT5+815
q9tbdAx1xo4/nXiaciXzOGXgOTfeCHff7Yx1U0BsyF9jjAGuq38dDes1JDAwkPikeK6sdSUd6nYA
IC4hjmpdqzHvh3k5D0mcUVISJCdD9+6Zt82bB9HRHojeM6zlbowpVpZvX07/R/pTNrIsp0+fpnvP
7qyvup5lTy3DL+Otkrl15AjUqOG879QJFizw6FAI1nI3xpgctL+4Pbu+3cWmTZuYP38+++L38ecH
fzJo0CAAth3dxpfrv8xbpUePwg03OPfRJyRkTuxJSZBSsENuWcvdGFOsxcTHEBMfQxX/KpQvX57x
EeM5kXCC17q8BsD2Y9sJ8AvI3Rj0MTHw99/QJMOo59984wx/MGPGecVot0IaY0weVSxdkYqlK6Yu
t67VOl0i73V3LwIlkKeHPU2nTp2I13gqlKzgfo7YihWdV0a//OJ+IvAtW5wHqBo29MSppGMtd2OM
ycaAjwZQ90BdIhZGsHnzZko1KcWQfkN4eujTlC5dOneVqDpdMxm7a/r1c+6rv+gieO89p2vHDetz
N8YYD/vsns944ekXWLFiBev+Wkdy3WR+W/Ab8fHxqCodp3Tk4KmD2Vci4v4Ca8WKEBwMO3Y4985n
dAF331jL3Rhj8kBVU7tkNh3ZxE2f38Suh3YhIhw/dZxBnw5i9v2z8ZNctp2TkuDXX+Gqq9KPR5+S
4oxkuWIF0qCBPcRkjDEFRVU5GHuQWhWcUSXfmvMWjwx8hIZ1GtK9e3fadGrD/sD9jLz6POYv2rMH
7rwTVq+2J1SNMcabDp8+zP4T+zm77yzz5s1jytdTOLz/MK+88AojRoxg29FtHIs7xlV1rspTvZbc
jTHGhyzfs5zjh47TKKgRjRo14vHFj1PavzTPdnoWgMijkQSWCqRG+RrZ1mO3QhpjjA9pX7d9unns
QgJDCKsXlrrcfVB3QoNCefxfj9OxY0cOxR+iZvmaBJS48KdbreVujDFecuvEW2l6rCnLFi9j48aN
SD3hrtvvYsIjEyhXrhynEk5RoVQFa7kbY0xhMuehOc6b8XDg8AGuHXctJ3afwM/PjxRNoeFbDfl1
6K/nVbcld2OM8QG1qtVi2wfbUpd3HNtBSFAIdQLrnFd91i1jjDE+6tw99fn2hKqIdBWRLSISKSKj
3Wz/t4hsFJE/RGSxiITkJQhjjDGZuR2/JpdyTO4i4ge8DXQBmgL9RCTDkGesA1qp6hXATOC/5x1R
IRYREeHtEPJVUT6/onxuYOdXHOWm5d4G2KaqUap6FpgG9EhbQFWXqWq8a3EVUNuzYRYORf0HrCif
X1E+N7DzK45yk9xrA3vTLO8j++R9N7DgQoIyxhhzYTx6t4yIDABaAdd6sl5jjDF5k+PdMiLSFghX
1a6u5ScAVdWXMpS7HpgIdFTVo1nUZbfKGGPMefD42DIiUgLYCnQGDgJrgH6qujlNmRbAdKCLqu7I
a9DGGGM8K8c+d1VNBoYD3wMbgWmqullExotId1exl4FywHQR+V1Evs23iI0xxuSoQB9iMsYYUzAK
bJq9nB6EKuxEZLeI/On6y2WNt+O5ECIySUQOichfadYFi8j3IrJVRBaJSJA3Y7wQWZzfMyKyT0TW
uV5dvRnjhRCROiKy1PVg4XoRGelaX+g/QzfnNsK1vkh8fiJSSkRWu/LIehF5xrW+noiscuXPL0Uk
x5thCqTl7noQKhKn3/4AsBboq6pb8v3gBUREduI8yHXc27FcKBHpAMQCn6hqM9e6l4Cjqvqy68s5
WFWf8Gac5yuL83sGOKWqr3k1OA8QkRpADVX9Q0TKA7/hPJvyLwr5Z5jNufWh6Hx+ZVX1jOt653Lg
IeBhYIaqTheR94A/VPWD7OopqJZ7jg9CFQFCEZlwXFV/ATJ+SfUAprreTwV6FmhQHpTF+YHzGRZ6
qvq3qv7heh8LbAbqUAQ+wyzO7dxzN0Xl8zvjelsK53Z1BTrhPP0PzmfXK6d6CioZ5fVBqMJIgUUi
slZE7vV2MPmgmqoeAucXDHAzVXuh96BrfKSPCmOXhTsiUg+4AufJ8epF6TNMc26rXauKxOcnIn4i
8jvwN7AY2AHEqGqKq8g+oFZO9RSJlqaPaK+qrYGbcH7IOng7oHxW1K7Evwtc5Bof6W+gKPx5Xx6Y
ATzkauVm/MwK7Wfo5tyKzOenqimq2gLnr602QMaxvHKloJL7ftJNNkUd17oiQ1UPuv49AnyD86EU
JYdEpDqk9nse9nI8HqWqR9KMR/0hcKU347lQrgtuM4BPVXW2a3WR+AzdnVtR+/wAVPUkEAG0Ayq6
rl1CLvNnQSX3tcDFIhIqIiWBvsCcAjp2vhORsq6WBCJSDrgR2ODdqC6YkL4Pcw5wl+v9YGB2xh0K
mXTn50p259xG4f/8JgObVHVimnVF5TPMdG5F5fMTkSrnupREpAxwA7AJ+BG401UsV59dgd3n7ro1
aSLOF8okVf1PgRy4AIhIfZzWuuJcAPm8MJ+fiHwBhAGVgUPAM8C3OE8hhwBRQG9VjfFWjBcii/Pr
hNN/mwLsBoad658ubESkPfATsB7nZ1KBJ3GeLv+aQvwZZnNu/SkCn5+IXI5zwdTP9fpKVSe4csw0
IBj4HRjgujkl67rsISZjjCl67IKqMcYUQZbcjTGmCLLkbowxRZAld2OMKYIsuRtjTBFkyd0YY4og
S+7GGFMEWXI3xpgi6P8BZFGGRC3IUJYAAAAASUVORK5CYII=
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;forward&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;new_avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_paths&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;r-.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Original&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;g:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Corrected&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;k--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mean of Short Rates&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[11]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.legend.Legend at 0x7f78a8a3d2d0&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
DVNQBwn6Z6FDhw64u7uXzVlfqk+fPjg5OZGQkHDGeZ5JZ49MiiZE09qyZQuvv/46e/fuZfXq1QB4
uHgwtd9ULo26lEJbYc0nb9xYPkpHKYiJgZtuqteROtWRoH8WlFJERUWVzUsPsHv3bgoLCyUgC9GK
aa35/vvv+eijj7DZbMTExDB8+HDyio0grpTi4siL6RvS13iytqqdO2HOHHj7baj4y37AAOjVq0HL
LkH/LE2aNIm5c+eWvZ87dy633npr2fucnBxuueUWgoODiYqK4vnnny87ZrfbefDBB2nTpg2dO3dm
+fLllfLOycnhtttuo3379oSHh/Pkk09K56kQTcxutzNv3jy+++47lFKMuW4MEyZMAAW7j+9mXfw6
bHZb+Ql//AGzZsGmTcbDVoWFRsAH4wth375GLX+Lfzhr6tSp1e5///33a52+prS1MXjwYObPn8++
ffvo0qULX3zxBevXr+eJJ54A4J577iE3N5cjR46QlpbG8OHDad++PZMnT+aDDz7g+++/Z8eOHZjN
5pPm5b/11lsJCQnh0KFD5OXlMWrUKCIiIpgyZUqdyyuEODtKKex2Oy4uLoyaMIrF2Ysp+KuA66Kv
w83kxpztcyiwFjCy80jjhD59jPH2a9ZAVhaMGAF/+xssXw4mk9Ge34hafNBvDkpr+5dccgndu3cv
WyzFZrPxxRdfsHPnTsxmM5GRkTzwwAPMnz+fyZMn8+WXXzJt2rSy9I8++ihr164FIDU1lRUrVpCd
nY2bmxvu7u5MmzaNDz74QIK+EE2odOnS4cOHExoaSuauTCJ8jXWmOvp3ZEq/KUazTiknJyPw9+lT
3tTz979DQoIxxcKxYxDVsOviVtTig/6Z1tLPplZfk5tvvpmLL76Yw4cPc8st5Q9gpKenY7PZTlo2
MSnJWHgsOTmZ8PDwSsdKJSQkYLVay1a6Kp0Lu2JeQojGtyt1F56unnQM7QjA0PCh+Lj5AODr7kv/
kH6weTN07nzyfDmlfX3OznDPPY1Z7DItPug3BxEREURFRbFixQpmz55dtr90zdv4+PiypdDi4+MJ
DTXWla9umcJS4eHhuLu7k5GRIZ3CQjQhm82GyWQiITuBSL9IwnzCeHn9y8R0iGF4p+FltXzAmCjt
/fchMRGCguDBB8Hfv+kKXw3pyK0ns2fPZvXq1Xh4eABGzdxkMjFu3Dgef/xx8vLyiI+P5/XXX2fS
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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="reference"&gt;Reference&lt;/h3&gt;
&lt;p&gt;[1] Paul Glasserman, &lt;em&gt;Monte Carlo Methods in Financial Engineering&lt;/em&gt;, Chapter 4&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Mon, 26 Jun 2017 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2017-06-26:blog/variance-reduction-hull-white-quantlib.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Multi-Processing with Pandas and Dask</title><link>http://gouthamanbalaraman.com/blog/distributed-processing-pandas-dask.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I wrote a post on &lt;a href="http://gouthamanbalaraman.com/blog/distributed-processing-pandas.html"&gt;multiprocessing with pandas&lt;/a&gt; a little over 2 years back. A lot has changed, and I have started to use &lt;a href="https://github.com/dask/dask"&gt;&lt;code&gt;dask&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/dask/distributed"&gt;&lt;code&gt;distributed&lt;/code&gt;&lt;/a&gt; for distributed computation using &lt;code&gt;pandas&lt;/code&gt;. Here I will show how to implement the &lt;a href="http://gouthamanbalaraman.com/blog/distributed-processing-pandas.html"&gt;multiprocessing with pandas&lt;/a&gt; blog using &lt;code&gt;dask&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For this example, I will download and use the &lt;a href="http://www.nyc.gov/html/tlc/html/about/trip_record_data.shtml"&gt;NYC Taxi &amp;amp; Limousine&lt;/a&gt; data. In this example I will use the January 2009 Yellow tripdata file (2GB in size), and run on my laptop. Extending to multiple data files and much larger sizes is possible too.&lt;/p&gt;
&lt;p&gt;We start by importing &lt;code&gt;dask.dataframe&lt;/code&gt; below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;dask.dataframe&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;dd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Any large CSV (and other format) file can be read using a &lt;code&gt;pandas&lt;/code&gt; like &lt;code&gt;read_csv&lt;/code&gt; command. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;C:\temp\yellow_tripdata_2009-01.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;It is important to understand that unlike the &lt;code&gt;pandas&lt;/code&gt; &lt;code&gt;read_csv&lt;/code&gt;, the above command does not actually load the data. It does some data inference, and leaves the other aspects for later.&lt;/p&gt;
&lt;p&gt;Using the &lt;code&gt;npartitions&lt;/code&gt; attribute, we can see how many partitions the data will be broken in for loading. Viewing the raw &lt;code&gt;df&lt;/code&gt; object would give you a shell of the dataframe with column and datatypes inferred. The actual data is not loaded yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;npartitions&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[3]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;40&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;You can infer the columns and datatypes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[4]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;Index([&amp;apos;vendor_name&amp;apos;, &amp;apos;Trip_Pickup_DateTime&amp;apos;, &amp;apos;Trip_Dropoff_DateTime&amp;apos;,
       &amp;apos;Passenger_Count&amp;apos;, &amp;apos;Trip_Distance&amp;apos;, &amp;apos;Start_Lon&amp;apos;, &amp;apos;Start_Lat&amp;apos;,
       &amp;apos;Rate_Code&amp;apos;, &amp;apos;store_and_forward&amp;apos;, &amp;apos;End_Lon&amp;apos;, &amp;apos;End_Lat&amp;apos;, &amp;apos;Payment_Type&amp;apos;,
       &amp;apos;Fare_Amt&amp;apos;, &amp;apos;surcharge&amp;apos;, &amp;apos;mta_tax&amp;apos;, &amp;apos;Tip_Amt&amp;apos;, &amp;apos;Tolls_Amt&amp;apos;,
       &amp;apos;Total_Amt&amp;apos;],
      dtype=&amp;apos;object&amp;apos;)&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dtypes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[5]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;vendor_name               object
Trip_Pickup_DateTime      object
Trip_Dropoff_DateTime     object
Passenger_Count            int64
Trip_Distance            float64
Start_Lon                float64
Start_Lat                float64
Rate_Code                float64
store_and_forward        float64
End_Lon                  float64
End_Lat                  float64
Payment_Type              object
Fare_Amt                 float64
surcharge                float64
mta_tax                  float64
Tip_Amt                  float64
Tolls_Amt                float64
Total_Amt                float64
dtype: object&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Computing the length of the dataset can be done by using the &lt;code&gt;size&lt;/code&gt; attribute.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;(dd.Scalar&amp;lt;size-ag..., dtype=int32&amp;gt;, dask.dataframe.core.Scalar)&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;As you can see above, the &lt;code&gt;size&lt;/code&gt; does not return a value yet. The computation is actually defferred until we &lt;code&gt;compute&lt;/code&gt; it. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Wall time: 48 s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[7]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;253663434&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;This computation comes back with 25MM rows. This computation actually took a while. This is because when we &lt;code&gt;compute&lt;/code&gt; size, we are not only calculating the size of the data, but we are also actually loading the dataset. Now you think that is not very efficient. There are a couple of approaches you can take:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you have access to a (cluster of )computers with large enough RAM, then you can load and persist the data in memory. The subsequent computations will compute in memory and will be a lot faster. This also allows you to do many computations much like using &lt;code&gt;pandas&lt;/code&gt; but in a distributed paradigb. &lt;/li&gt;
&lt;li&gt;Another approach is to setup a whole bunch of deferred computations, and to compute out of core. Then &lt;code&gt;dask&lt;/code&gt; will intelligently load data and process all the computations once by figuring out the various dependencies. This is a great approach if you don&amp;#39;t have a lot of RAM available.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now the way to load data in memory is by using the &lt;code&gt;persist&lt;/code&gt; method on the &lt;code&gt;df&lt;/code&gt; object.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;persist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The above &lt;code&gt;persist&lt;/code&gt; call is non-blocking and you need to wait a bit for the data to load. Once it is loaded, you can compute the size as above.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Wall time: 35 ms
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[9]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;253663434&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;That computed instantly. Now you can scale to much larger data sizes and compute in parallel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 04 May 2017 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2017-05-04:blog/distributed-processing-pandas-dask.html</guid><category>python</category><category>programming</category><category>development</category><category>pandas</category><category>dask</category></item><item><title>Numpy Vs Pandas Performance Comparison</title><link>http://gouthamanbalaraman.com/blog/numpy-vs-pandas-comparison.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Pandas and Numpy are two packages that are core to a lot of data analysis. In this post I will compare the performance of numpy and pandas. &lt;/p&gt;
&lt;p&gt;tl;dr:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;numpy&lt;/code&gt; consumes less memory compared to &lt;code&gt;pandas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;numpy&lt;/code&gt; generally performs better than &lt;code&gt;pandas&lt;/code&gt; for 50K rows or less&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pandas&lt;/code&gt; generally performs better than &lt;code&gt;numpy&lt;/code&gt; for 500K rows or more&lt;/li&gt;
&lt;li&gt;for 50K to 500K rows, it is a toss up between &lt;code&gt;pandas&lt;/code&gt; and &lt;code&gt;numpy&lt;/code&gt; depending on the kind of operation&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;seaborn-pastel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;seaborn.apionly&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;sns&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;timeit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;timeit&lt;/span&gt; 
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;iris&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;iris&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;iris&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data_rec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_records&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;15000000 15000000
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here I have loaded the &lt;code&gt;iris&lt;/code&gt; dataset and replicated it so as to have 15MM rows of data. The space requirement for 15MM rows of data in a &lt;code&gt;pandas dataframe&lt;/code&gt; is more than twice that of a &lt;code&gt;numpy recarray&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;MB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pandas &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; MB &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getsizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;MB&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Numpy &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; MB &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getsizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;MB&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Pandas 1506 MB 
Numpy 686 MB 
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;A snippet of the data shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_pyout"&gt;
&lt;div&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;sepal_length&lt;/th&gt;
      &lt;th&gt;sepal_width&lt;/th&gt;
      &lt;th&gt;petal_length&lt;/th&gt;
      &lt;th&gt;petal_width&lt;/th&gt;
      &lt;th&gt;species&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;td&gt;5.1&lt;/td&gt;
      &lt;td&gt;3.5&lt;/td&gt;
      &lt;td&gt;1.4&lt;/td&gt;
      &lt;td&gt;0.2&lt;/td&gt;
      &lt;td&gt;setosa&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;td&gt;4.9&lt;/td&gt;
      &lt;td&gt;3.0&lt;/td&gt;
      &lt;td&gt;1.4&lt;/td&gt;
      &lt;td&gt;0.2&lt;/td&gt;
      &lt;td&gt;setosa&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;td&gt;4.7&lt;/td&gt;
      &lt;td&gt;3.2&lt;/td&gt;
      &lt;td&gt;1.3&lt;/td&gt;
      &lt;td&gt;0.2&lt;/td&gt;
      &lt;td&gt;setosa&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;3&lt;/th&gt;
      &lt;td&gt;4.6&lt;/td&gt;
      &lt;td&gt;3.1&lt;/td&gt;
      &lt;td&gt;1.5&lt;/td&gt;
      &lt;td&gt;0.2&lt;/td&gt;
      &lt;td&gt;setosa&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;4&lt;/th&gt;
      &lt;td&gt;5.0&lt;/td&gt;
      &lt;td&gt;3.6&lt;/td&gt;
      &lt;td&gt;1.4&lt;/td&gt;
      &lt;td&gt;0.2&lt;/td&gt;
      &lt;td&gt;setosa&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;perf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#grid = np.array([int(x) for x in np.logspace(np.log10(gap), np.log10(length+1) , 5)])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pd&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;np&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;sel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inp&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data_rec&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd_inp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pd_stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np_inp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np_stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;perf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd_inp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pd_stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;perf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np_inp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np_stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loglog&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pandas&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;o&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;numpy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;v&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Number of Records&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Time (s)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In this post, performance metrics for a few different categories are compared between &lt;code&gt;numpy&lt;/code&gt; and &lt;code&gt;pandas&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;operations on a column of data, such as mean or applying a vectorised function&lt;/li&gt;
&lt;li&gt;operations on a filtered column of data&lt;/li&gt;
&lt;li&gt;vector operations on a column or filtered column&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Operations-on-a-Column"&gt;Operations on a Column&lt;a class="anchor-link" href="#Operations-on-a-Column"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here some performance metrics with operations on one column of data. The operations involved in here include fetching a view, and a reduction operation such as &lt;code&gt;mean&lt;/code&gt;, vectorised &lt;code&gt;log&lt;/code&gt; or a string based &lt;code&gt;unique&lt;/code&gt; operation. All these are &lt;code&gt;O(n)&lt;/code&gt; calculations. The mean calculation is orders of magnitude faster in &lt;code&gt;numpy&lt;/code&gt; compared to &lt;code&gt;pandas&lt;/code&gt; for array sizes of 100K or less. For sizes larger than 100K &lt;code&gt;pandas&lt;/code&gt; maintains a lead over &lt;code&gt;numpy&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data.loc[:, &amp;#39;sepal_length&amp;#39;].mean()&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.mean(data_rec.sepal_length)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mean on Unfiltered Column&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
o0cPduzY4W1btGgRw4YNK3fvr2XLlkyYMKFSfL7Hzs7O5vDhwyQnJ5Obm0tGRgYASUlJACxevJi8
vLw6nwMnu+uuu+wOQdlM+0BoOPk8Ozk2f+gVDh/1HaVijCEyJqHaQk4RITImnuyCuhd7GmOIiq15
3xHR8QEpJK14ZaFr1664XC527doFwKpVq5g2bRqrV68mNze3XAzHjh0jMTHR21ZVJt68eXOOHDni
/X337t0MGzas0nY9evSo1LZ582YefvhhvvjiC44fP17p2GDVjtx7773Mnj2befPmMWrUKFJSUrj+
+utp2rSpn2dBKaWUP3SUygmo7ygVEaG4IKfaD31jDEX5OTSJqU9CIBTl17zv4oKcoIxa8d3njh07
OP/88+nVqxdz5syhY8eOREdH8+GHH/J///d/lYo3IyIiqtynMabOcRw7dozRo0fTrFkzHn/8cU49
9VRiY2NZv349f/zjH8sd+69//Ss33ngjCxYsYMmSJdx9993MmDGD1atX0759+zofWymlVNXqOkpF
E44AOfeskfyw5mN6+tRZlMpYs5jLL0xmSu1/jyr9MKbmfZ93dnL9dlzBtm3b6Ny5s/f37du343a7
6dKlC++//z6FhYW8//77dOjQwbvNZ599Vu/jde7cmW3btlVqL71FUmrp0qUcOXKEBQsWMHLkSG/7
jz/+WOV++/TpQ58+fXjooYdYvXo1I0aM4Pnnn+exxx6rd6x2y8jIoGfPnnaHoWykfSA0nHyenRyb
P7SGI0Ae+eN9bFwwmy2rF3m/xRtj2LJ6EZsWzOHhB+915L5LGWP4+9//Xq7t6aefRkS46KKLvFcs
fK8mHDt2jFdffbXex7z44otZvXo169at87b98ssvvPHGG+W2i4iIwBhT7tiFhYU899xz5bbLysqi
pKSkXFufPn1wuVzlhveGowceeMDuEJTNtA+EhpPPs5Nj84de4QiQxMREFr8/nydmPsm8B2cTER1P
SWEu5541ksXvzy9X3+CkffvauXMnl112GWPHjuXLL7/k9ddf5/rrr+eMM84gJiaGqKgoLr30Um67
7TaysrL45z//SZs2bThw4EC9jvfAAw/w2muvceGFF/L73/+e+Ph4XnrpJbp06cI333zj3W7EiBE0
b96cSZMmcffddwMwb968SreRPv/8c+68806uvvpqunfvTnFxMXPnziUyMpIrr7yy/ifGAZ599lm7
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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Below, the vectorized &lt;code&gt;log&lt;/code&gt; operation is faster in &lt;code&gt;numpy&lt;/code&gt; for sizes less than 100K but pandas costs about the same for sizes larger than 100K.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.log(data.loc[:, &amp;#39;sepal_length&amp;#39;])&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.log(data_rec.sepal_length)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vectorised log on Unfiltered Column&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhwAAAGNCAYAAABaLKgHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
AAAPYQAAD2EBqD+naQAAIABJREFUeJzsnXeYVEX2v9/TPRmGIcOAZESQnHNSBHTd0V0ERTEAuiqG
dYy76ipff7orusKuOaxhFRwTrllBRaICwoCoBJEskhEYmNjT9fvj9vT05J6he+7t4bzPMw903bp1
P7f69O3TVadOiTEGRVEURVGUcOKyW4CiKIqiKDUfdTgURVEURQk76nAoiqIoihJ21OFQFEVRFCXs
qMOhKIqiKErYUYdDURRFUZSwow6HoiiKoihhRx0ORVEURVHCjjociqIoiqKEHXU4FCVIRKSdiHhF
5NJqvu5sEdkcRL2lIjK/OjTVRETkKhHZKCK5IrLfV1akT+2ygZPBTrsQkbN9/TXIjusrzkIdDiWk
iMj7InJCRGqVU2eOiOSISL0wXP8yEbkp1O0GYMdeACbI69bofQpE5EHfl1edMo5vrOoXq4h0Bv4D
bASuBq71Haqw70XkdyLyt6pct5oI2i5ExCUiU0VkoYgc9n1Ot4nIiyLSM9zXV2o2UXYLUGocc4Dz
gT8As4sfFJF4IAX4xBjzWxiuPwloBzwR6oaNMVtEJN4YkxvqtpWgqOjL/2S+2EYAAtxkjNkVUD4y
iHbPB6YC/+8krm87vs/m+8DZwELgQeAw0AaYAFwpIs2MMfttE6lENOpwKKHmA+A4cCmlOBzAhUAC
lmMSEYhIFIAxxqPORo2lie/fY4GFxhhPEOdK6OWAiMQZY7LD0XYZzMJyNm4yxjxdTMt04HbCdK/K
qYFOqSghxfeAfBc4W0QallLlUiAD+LCgQCxuFZEfRSRbRPaIyNOlDZ37hq8XicgxETkqIstFZLzv
2BJgDNDeN/TuFZGfAs5tLCIvicg+EckSkTUiMqlY+wVz9H/2adoCZAEdSpu/F5FkEfmviPzi0/6r
iPxPRE4rRfcSETnu0/2BiHQs5f7GicgPPn3fiUhKUB1fBsHcs69eA99U11HfUPqLItIz2HgFX9+8
4zv3hIh8LSJjitUpmM//g4j8zddnmSLyuYi0OZn7LENTUNcTkV3Avb6Xv/nOudt3rNz4BxF5DfgT
4A6wudyA40HZtk/buyIyVkRWiUg2MCXg+JW+8kwROeR7r5qVoud6Edniq/eNBBk7ISItsEZpPinu
bAAYi0eNMfsCzuktIvN8n8UMX7/2DeJav4jI86WUF4+XKXj//igiD4jIbt+13hSR2iISKyKP+2z7
mIi8IL4fB77zC96Tmb42fvC9B9+LyKhg+kUJLTrCoYSDOcCVWMOw/oeXWDEbo4E5xpicgPovARN9
//4LaAvcBHQXkaHGGK/v/KuB54HvgL8DR4CewFjgbeD/gH8CjYHbsH6NZfjOTQAWA62wplt2+PS9
KiKJxphnit3DNUA08CyQ67tWfCn3+h7QHngc2In1S3k0cBrwi+/aVwEvAh8DdwK1gGnAEhHpaYwp
qHcu8CbwPfAXoCHwakE7lSXYexYRF/Ap0AN4CtiMNRL1EkFMU4hIU+BrrP56HKuvrgI+FpELjTEf
FTvlXiAPmAHUx+qTV4GhVbnPIKjoejf69KZgve9ZwFrfsYru/ykgGRgOXIFlc96A40HZtu86nbFG
BZ8FngM2AIjI/cB9wOvAC1j2/Wegn89+jvvqXevTsxiYiTW1+CHW+7Glgvv4HdYP0NJGJUsgIt2A
RVhTLn/33fN1wCIRGWKMSS/n9LL6tKzye7FGTf8OdABuAHKAGKzR0vuBQVgO2hbg4WLnjwDGYz2L
jgO3AHNFpKUx5mg5OpVQY4zRP/0L6R/Wg2s3sLRY+bVAPnB2QNkIrIfVuGJ1z/WVX+R7XRfLeVgM
RJdz7U+Bn0opv8137YsCytzACuA3IN5X1s533UNA3WJtFBy71Pe6ge/1zeXoScR64D9RrLyJr/zJ
gLJ1WE5BQkDZGN81StxTKddaAsyvwj1P8F3jumLtfeU7/9IKrvuEr17fYve9PVA31nC9F8thdAeU
p/rO71DBdf6fr16dMo5vKHb/QV+vrLZL6dMiNuArewbILUVPULbtK9vlu/6IYnXbAh7gtmLlXbGc
qNt9r6OBA773NvBer/Vda35xfcXa+7fv+mcG+Rn/EDgBtAgoa4b1Gf282HuQDwwqdq/PB2G/Be9f
OuAKKH/T1+Z7xc5fUcze3L7zM4GWAeU9feV/CuZe9S90fzqlooQcY/1qewMYKCItAw5dCuwDFgSU
XYT15b7QN6zfQEQaAKuwfmmO9NUbi/Vr5h/GmLwqyDoX2G2MeSdAZz7WL/I6lPx1/ZYx5kgFbZ7A
euiPFJGkMuqMxfryfaPY/eUD3+K7P7GmYLoALxtjMgM0zgN+KtlsUAR7z2OBbKxf4YE8TXBz9ucC
Xxtjvg24TgbWr/F2ItKhWP0XfToKWOK7TtsgrlUVqvt6BQRr2wVsNsYsLFY2DuuX/9xibewBtga0
MQDLAX6m2L2+hG+UrwIKpngqrOubthgFzDUBAbbGmF+xPvfDxQpADRWvmMKRILAcCyhpryuwRvOK
85kxZmeAzjVYn91wv/9KMdThUMLFHKyH+qUAItIcGAKkGd/PDB+nYz0oDxT72wfEYQ0fQ+HD4ccq
6mlF6V/cG3w6iz+otlfUoLHiVe7GWqWwX6ylhLeLSOOAau197S+h6P3tB84CGgXoA/i5lEttqkhL
GQR7zy2xHJPiAbGlaSmNlpSucUOAjkB2FXtdsFopFMukSxuWD+f1yiNY2y5gWylttMf6pb6VkvbT
PqCNllj3XuQ98znn24PQWhAsmxhE3SZALGXblhtrSjFUFH//jpZTHiUixe+heD2wRhfD/f4rxdAY
DiUsGGPSRWQj1vz1w/gcD6x56EBcwK/A5ZT+a9quJXhZwVQyxjwmIv/DinkYg7WU8K8iMtwY8wPW
/RmsfjhYShNVGa2JdPLLKK9oNKVgxUY8xVaT+EgIqBOK650slbXt0mzOhTWlMraMawQzehEMG33/
dgXWh6jNsigrVsNdRnlZ71+w76td779SDHU4lHAyB3hARLpifeFuNsasLlZnC9bQ/tIKpkq2YD0g
umAFZ5ZFWQ+zHVi/OIvTyXfOjnLaLBdjzFasIL2ZInI6VszArRQGsQHsL2W4vLg+ytB4RhWlVXTP
2wPqDRKRmGKjHKWdWxo7y9DYKaD9UFDQzhlYowR+xEo01wwrj0R1U5bNBWvb5bEF3wiHMWZ7OfV2
YH0+TgeWFhSKSDTQmmL9VQqfYN3HJKwYifLYhxW0WdZ7nk/5gc6/YcVkFacVVR/BVCIAnVJRwknB
tMoDWCsgSouAfwsr2vze4gdEJCpg+eA8rHnXu0UkppxrnqD0h9knwGkiMi6wfawVA8ewpjwqhYjE
i0hsseKtWJHwBeWf+l7fIyIlfsGJb+mwsVaq/ABcJQFZWn0rV4rHQARLRfdc8MU0D2uIf2pAPcFa
SRNMMq1PsByWPgHn18Za8fGzMSZw6P1kknN9gfVrf5pPXyDXYz3PPilWXh1ZLk9gLYtNKFYerG2X
x1yse7i/tIMiUt/33xVYK0auK2ZnVxPENIkxZgdWTMR5InJdKddxicgdItLEWLlJPgf+KAHLv0Uk
GbgYWGiMKW+EcAtWfJdfp4hciLXap4S0irQrkYOOcChhwxizXUS+Bi7AenAUn07BGLNARF4E7hWR
XhR+qXTACrq7HvjAGHNERG7DWhGwUkTewJqH7Y61auVqX5OrsR6Ej/r+f8wY8wnWUsNrgNdEpD/W
L8KLgb7AjRU8IMviTOAzEXkLaxg636e5AZDmu7+jInIj1sM83af7INavud9hrQS51dfeX7ASpy0T
kVew4jumYf3qK+7YBEOw9/wOVl/9W0TOwJqbv5DCL6qKHvr/wFrpMl9ECpbFTgaa+9oJpMrD2MaY
vSLyENaXb7KIfIg1DTHUd/2PjDGfhep6laBg1O5JEfkCyDPGvB2sbZfXsDFms29Z7AMi0o7CxHpt
sbL5PgE8bozJEyu9+pPAVyLyJlaMxxVYTnAw3IKVVfQpEbkIaxn3ESxbHe/T/V9f3XuwAla/FpGn
sWzkWqzRmLuKtVv8PfgPll18JiJzfTovLUNnWe+fTodEInYvkwnXH1byqcNYqw1s13Oq/mE9VPOx
VjGUV+8arFUbx7GGXNcADwGNi9X7PdYv84J6XxOw7BCojTWycsh33cBlco2w8mHsw/qiWkOxJZ9Y
yx7zsbItFtdYcKxgWWxDrAf+eqwRg8PAMuDCUs4dAXzm03wcK8jyP0CPYvXGYTkYWVhTM78HXgM2
BdHXS4B5xcoqvOeAe5mDFXh3yKdtKNbywT8Ece22WLlQDmP94l8GjC5Wp2CJZEp5/RrEtSb53vdj
WEsef8AK3o2q6vUof1nsvArOdfnsYB+WQ5FbrI0KbRtrWmpuOff8R6wl4cd8fz/iy+tRyudti69f
vgYG+s6bV1bbxc53YY10FeTYyMYKZn0R6Fqsbk+fTRdomg/0KeM9GFSs/DasYM4TWGnUuxfXWc77
N9VX3q1YeZH3EMv5yQceK+U+dwLPBdMn+he6P/F1fo1DRIZh/UK70hgzwW49ihJp+H7lvgkMMAFL
XhVFUapCjY3hMMYsxvpFoShKBYhIXLHXLqwMnEcozLqpKIpSZTSGQ1EUgKd9AaUrsAJILwL6AXeY
qq+wUBRF8eOIEQ4RGSrWZla7fZvtlNiwSkRuEJFtYm1AtVyC2CRIUZSg+RIrCPZB318tYJoxZqat
qhRFqTE4wuHAeritpYxleCJyMfAYVnR6T6xgunkSsBupiEwTayfM9FKWKiqKUg7GmDnGmD7GmHrG
mHhjTDdjzHN261IUpebguKBREfFiRfl/EFC2HFhhjPmz77VgRTg/box5pJy2RgA3GGPGh1e1oiiK
oijl4fgYDl+mvN5YWxMDYIwxvvXuA8s573OgG1BLRHYC440xK8qo2wArLfV2Sk+NrCiKoihK6cRh
ZbSdZ4w5VFYlxzscWPkB3JRMzbuPclI+G2POqcQ1xmDlIFAURVEUpWpcRikJHguIBIejOtgOMHv2
bDp16lRuxdTUVGbNmlXlOlU5Fsw17SJc2kLRbmXbCLa+2kBRwqntZNt2qg2Ud1xtILRtV/b8c845
h88//zwk7Z4qNrBhwwYmTZoEFexMHAkOx0GsbHFNipU3AfaG6BrZAJ06daJXr17lVkxKSjqpOlU5
Fsw17SJc2kLRbmXbCLa+2kBRwqntZNt2qg2Ud1xtILRtV/b86OhotYGqU25IguMdDmPtEbAaK83t
B+APGj0beDyU10pNTSUpKYmJEycyceLEUuuUVR5snaoc27s3VH5V6AmmP+xqt7JtBFtfbaAo4bKB
ULTtVBso77jaQGjbruz5tWrVqrhSkO3WdBtIS0sjLS2No0ePBlXfEatUfLtjtsfakCcdazOrr4DD
xphdIjIBeAW4DlgJpGIlJupojDkQguv3AlavXr3akd5j8+bN2b17t90yFBtRG1DUBqoHJ/XzlGlX
s2nrT7ijrI11V3zxNf1HDQIg35PPGW078NLT/7FTIgDp6en07t0boLcxJr2sek4Z4eiD5WAY399j
vvL/AlOMMW/5cm48gDWVshYYEwpnIxLwvZHKKYzagKI2UD04qZ/79uyD6RRH/yuGA3DkkgwunTMN
gOWvLqRvXFc75VUaRyT+MsYsMsa4jDHuYn9TAuo8bYxp7UtKNNAYs8pOzdVJOIcrlchAbUBRG6ge
nNTPU6+cwvdzvyU/zwNA34sGA+DJ9fDD3FVMvXJKeac7DkdMqdhNwZTKsGHDyozh2LlzJwcPHrRH
oFItNGzYkJYtW9otQ1EUxc/jzz/JqpwfGXTFWf6y5a8upH9cV66/5joblRWN4Vi8eDFUMKWiDgcV
x3Ds3LmTTp06kZmZWf3ilGojISGBDRs2qNOhKIrteI2XH3O38PWxNcwc9wA3v3sP7ugoPLkeZo2a
zsoFX9OgQQO7ZQKRF8PhaA4ePEhmZmZQeTqUyKRgHfnBgwcd6XBMnjyZl19+2W4Zio2oDVQPTujn
vZ6DLMlawyHvEYgR+o4fwjdpi9m6fCNt+51Jqy5jSRk3kc8+nEtiYqKtWiuDOhyVIJg8HYoSDkaP
Hm23BMVm1AaqBzv7Ocubw/LsdWzK216kvN+YK3jqylsYcHlflr+2iutmLGHz6i95aMZjPPzgdDuk
VglHBI0qilI+TgpkU+xBbaB6sKOfvcbwY84W0jI+LeJsHNpykLytI5FDg+g1cgrL05bSa+RkoqJj
6Nh/LAsWLat2rSeDOhwBpKamkpKSQlpamt1SFEVRlFOA/Z7D/O/ElyzJTieXPABiiKYrPXjn1nmQ
3RCAfmOn0LhJP/qNtVamiAjumATsjMNMS0sjJSWF1NTUoOrrlEoAs2bN0ikTRVEUJexke3NYkfMD
G3K3Filv626FZ2830g/EkXniOMYYRISo6Bgm3PaCv54xBk/OCazE2/ZQsKIzIGi0XHSEQ1EigKVL
l9otQbEZtYHqIdz9bIxhQ+5W3jj+WRFno56rDp2yRrB1fT+2HIgDoG23wWxYMc9fZ8t3hdo2rviM
s0cMCavWUKMOh+I4XnnlFVwuFzt37rRbimN45JFH7Jag2IzaQPUQzn4+kP8b/zuxgEVZq8k2uQBE
E0Un053cLeewblsj8vKturFuuO+vt7Pu/ZlsWP4pxhi+nPOI5bAs/5Tv3p/FPXfdFjat4UAdDsVx
iIitw4RO5I033rBbgmIzagPVQzj6OcfksiQrnbnHv2B//mF/eStXCxrtH8u6DR04klX4ddy5MVze
Ewa2T+SzD+dS59AKZt81mnh3PrPvGk2dQysibkksaAxHEYLZLVZR7CAhIcFuCYrNqA1UD6HsZ2MM
m/J2sDx7Hdkmx19eVxJpdLwXm3Y2Jj8g5rNpbRjeBhrXLixLTEz0L30tiOdwCpXdLVYdjgBCGTQa
TsNwmtEpiqIoRTmUf4QlWenszT/kL4vCTRvvmeza1oH1OYUjGgnRMKgldGwE5T3anfbc16BRG8nI
yOCue+6n75BRDBp1IX2HjOKue+4nIyPD0W1Pnz4dl8vFpk2bmDBhAklJSTRs2JBbbrmFnJxCr/zl
l1/m7LPPpkmTJsTFxdG5c2eeffbZEu21bt2alJQUli1bRv/+/YmPj6ddu3a89tprJequX7+es846
i4SEBFq0aMFDDz2E1+stUe+DDz7g/PPPp3nz5sTFxdG+fXsefPDBEnV//vlnxo0bR3JyMvHx8bRo
0YKJEyeGpJ8URVEqIsfksSxrLe8c/6KIs9HCdRr1945l/caOZPicDQF6JMOkHtCpcfnORk1ARzhC
REZGBmN/P47uF9zK5Y9MR0Ss4bQV8xj7+3EnNd8Wzrah0GueMGECbdq04eGHH2b58uU8/vjjHDly
hFdeeQWAZ599li5dunDBBRcQFRXFhx9+yLRp0zDGcP311xdpb/PmzYwfP56pU6dy1VVX8dJLLzF5
8mT69OnjTw+/b98+RowYgdfr5e677yYhIYHnn3+euLi4EhpfeeUVEhMTue2226hduzYLFizgvvvu
IyMjgxkzZgCQl5fH6NGjycvL4+abb6Zp06bs3r2bjz76iCNHjkTcfGcgd9xxB48++qjdMhQbURuo
Hqraz8YYNuftZHn2OjJNtr+8jtSmfkZPtuxqijdg+uS0JBjeGupXYgYn0m1AHY4Q8eDD/6T7BbfS
acBYf5mI0HHAWAzmpFLQhrPtQNq1a8e7774LwPXXX09iYiLPPPMMt99+O126dGHx4sXExsb660+b
No1zzz2XmTNnFnE4AH766SeWLFnCoEGDABg/fjwtWrTg5Zdf9keBP/zwwxw6dIiVK1f6h+OuvPJK
2rdvX0JbWlpakWv/6U9/ol69ejz99NM8+OCDREdHs379erZv387cuXP5wx/+4K977733nnTf2I0T
93dRqhe1geqhKv18OP8oS7LWsCf/gL8sCjctPJ34ZXsHNue6/eW1Y2Boa2hXv/IjGpFuA+pwhIgF
i5Zx+SPTSz3Wsf9YnrllJh3+UOrhCnl//jKm/bvstmffNbNqDQcgItxwww1Fym666SaefvppPvnk
E7p06VLkC//YsWPk5eUxbNgw5s+fT0ZGRpERhDPPPNPvbIC19fsZZ5zB1q2F684//fRTBgwYUGTu
r0GDBlx22WU888wzRbQEXvv48ePk5OQwZMgQnn/+eTZu3EjXrl1JSkoC4LPPPmPs2LHEx8efZK84
h5tuusluCYrNqA1UD5Xp51yTx+rs9XyfuxkvhcMXzaQZ2bt78NORWv4yt0CvZtC7OUS7S2sttNqc
iDocAVR1lYoxhqjYWmUG9IgIUbEJHM+pfLCnMYbouPLbLkhve7IBRcVHFtq1a4fL5WL79u0ALFu2
jPvvv5/ly5eTmZlZRMPRo0eLOByleeL16tXjt99+87/esWMHAwYMKFHvjDPOKFG2fv167rnnHr76
6iuOHTtW4tpgxY7cdtttzJw5k9mzZzN06FBSUlKYNGkSderUCbIXFEVRyscYw5a8X/g6e22R6ZNE
qUXdYz3ZtiuZwITjbepZoxpJJWeLIxpdpXISVHWViojgyTlR5pe+MYa87BPUjq2KQyDkZZffdrjS
2wa2uXXrVkaNGkWnTp2YNWsWLVq0ICYmho8//ph//etfJYI33e7SXfiq5P0/evQow4YNo27dujz4
4IO0bduWuLg4Vq9ezV/+8pci13700Ue56qqreP/995k/fz4333yzPyalWbNmlb62oihKIL/lH2Np
9hp2e/b7y9y4aJ7XkV+2d+RwXuGzr26c5Wi0rmeD0GqgsqtU1OEIEWcNH8ymFfPoGBBnUcDGFZ9x
4ZghTKn4/SiVTaPLbztU6W03b95Mq1at/K9//vlnvF4vrVu35sMPPyQ3N5cPP/yQ5s2b++t8+eWX
Vb5eq1at2Lx5c4nyjRs3Fnm9cOFCfvvtN95//30GDx7sL9+yZUup7Xbu3JnOnTtz9913s3z5cgYN
GsSzzz7LAw88UGWtdrNx40Y6duxotwzFRtQGqoey+jnPeEjP2cB3OZuKTJ80IZms3T3YcrQweUa0
C/qcBj2TwR3CtaCRbgO6LDZE3PuX21kbkIIWCFkK2nC2XYAxhqeeeqpI2eOPP46IcO655/pHLAJH
E44ePepfwVIVzjvvPJYvX86qVav8ZQcOHOD1118vUs/tdmOMKXLt3Nxcnn766SL1MjIyyM/PL1LW
uXNnXC5XkeW9kcidd95ptwTFZtQGqofi/WyMYWveL7yZ8Rlrcjb6nY1akkDy0cH8sn4IhwKcjdMb
WMtc+zQPrbNRmrZIQ0c4QkRiopWC9qEZjzH7rpm4YxLIz83krOGDT3rZajjbDmTbtm1ccMEFjB07
lq+//po5c+YwadIkunbtSmxsLNHR0Zx//vlce+21ZGRk8J///IcmTZqwd+/eKl3vzjvv5LXXXmPM
mDH8+c9/JiEhgRdeeIHWrVuzbt06f71BgwZRr149rrjiCm6++WYAZs+eXWIaacGCBdx4442MHz+e
Dh064PF4ePXVV4mKimLcuHFV7xgH8OSTT9otQbEZtYHwMGXa1Wza+hPuKOtHVXZWNsPOHwlAbl4e
9Vo14IJHJ/nru3CRnHcGu7d15Iin8Cu0QbyVJbR5Uvi0RroNqMMRQsKZgjbc6W1FhDfffJO//e1v
/PWvfyUqKoqbb77Zv4S1Q4cOzJ07l3vvvZc77riDpk2bMm3aNBo0aMDUqVNLtFVekGsBTZs2ZeHC
hdx0003MmDGDBg0acP3119O0aVOuvvpqf7369evz8ccfc9ttt/G3v/2NevXqcfnll3PWWWcxZswY
f73u3bszduxYPvroI3bv3k1CQgLdu3fns88+o1+/fqHsrmon0pfDKSeP2kB46NuzD6ZTHP2vGF7i
2NJXi04ZN6IJmbt6sj2j8EdejBsGtICuTcEV5sRdkW4D6nCEiXCmoA1X240aNeKtt94q8/jvfvc7
fve735Uov+qqq4q8Dlz6GshXX31Voqxz584sWLCgRPnkyZOLvB4wYADLli0rUS9wCqV169a88MIL
pV5bURSlNKZeOYUXRw+lz8TBuKMLvxI9uR6+fXspN829hwTiSTjSg19/bY6VH9TizMYwsKWVmlyp
GI3hUBRFUU5ZYmJimHrZZL5NW1qkfPkbi+g7fgjNTWdObBrLnl9Po8DZaFwLxneBs9ups1EZ1OEI
IDU1lZSUFNLS0uyWoihFKEjfrpy6qA2EB6/x0u0PffnmrUXk53mY96/38OR6WJm2hAG9/sovW7rh
ybdGPuKjLCdjQldoasNOCU6zgbS0NFJSUkhNTQ2qvk6pBBDK3WIVJZQEJlpTTk3UBkLPPs9hFp5Y
yW/RGfSdMITlaYvJzcxl+etLaN5mFE+mXsPUv88lvlYi3ZpC/xYQa+O3ptNsQHeLVSrN/fffT35+
PvXr17dbilIG//d//2e3BMVm1AZCR67JY2nWGv534kt+w9pJuv/Fw1n55nLG3HIB376xmpRrH2Xk
JamsnPsYl3SDYW3sdTYg8m1ARzgURVGUUwJjDNs8u1mataZISnJvdhKypze9hh3lqQmP0mvk9URF
x9BpwFhe+99MGtYqp1ElaHSEQ1EURanxZHhP8FnmMuZnfuN3Nty4+eal1eRvHYXJakC/sVNo3KQf
/cZOAXz7YPn2qlJOHnU4FCUCOHjwoN0SFJtRG6gaXuPlu5xNvJkxjx2ePf7yJE9TPFvGsPz1VRhj
rT6Jio7hvKn/ICo6BgjvXlVVIdJtQB0ORYkApkyZYrcExWbUBirPPs9h5h7/km+y1+HBytkTSxxx
+wZy8KcheHJq0bbbYDasmOc/5/W/F/ZzKPeqCgWRbgMaw6EoEcD06dPtlqDYjNpA8OSYPL7N/oEf
cn8uUl4nsx2HdnYFr5U8Q4A/33I7D9w4DsHQsf9Yzp06HWMMG1d8xnfvz+KzD+facAelE+k2oA6H
okQAulzdjKVcAAAgAElEQVRbURuomLKCQhO8SWTu6s2hEw38ZU1qw8i20KhWIoM/Cv9eVaEg0m1A
HY4AUlNTSUpK8q8tVhRFUSKDDO8JlmatKRKn4cZNzG+dObrndAoiCGLdMKgVdG4MBaEZ4d6rqqaS
lpZGWloaR48eDaq+OhwBaOIvRVGUyMJrvHyfu5lvs3/0x2kA1MpN5siOnmTnFa5pPbOR5WzEl5OO
XJ2N4NHEX4pSA3nxxRftlqDYjNpASayg0C+KBIXGmDhcvw7kyM+DwedsNIiHcZ3h7PblOxvg7H52
srZgUIdDUSKA9PR0uyUoNqM2UEhOQKbQQ97C4fy4jHac2DSWnCPWRmvRLhjcCi7uBs3qBNe2k/vZ
ydqCQadUFCUCeOqpp+yWoNiM2oAVX7HVs5tlxYJC4/KTOLGzDxlZhdsztK8PQ1tD7djKXcPJ/exk
bcGgIxwhYsq0qxk8dhjDzh9Z4m/w2GFMmXa1I9sGa6mVy+Viy5YtXHXVVdSrV4+6desyZcoUsrOt
D/WOHTtwuVy8+uqrJc53uVw88MADJdrbvHkzkyZNom7dujRu3Jj77rsPgF27dnHhhReSlJREcnIy
M2fOLNLeokWLcLlcvPXWW9x9990kJydTu3ZtLrjgAn755Zci14mJieHQoUMlNP3pT3+ifv365Obm
nlTfKIriDDK8J/g0cxmfB2QKdRk37oPdyNg0Cq/P2UiKhZSOcO4ZlXc2lPCiIxwhom/PPphOcfS/
YniJY8tfXUjfuK6ObBsKg6QmTJhA27Ztefjhh0lPT+eFF16gSZMm/OMf/6hSexdffDFnnnkmM2bM
4OOPP+ahhx6ifv36PPfcc5x99tk88sgjzJkzhzvuuIN+/foxZEjRBDsPPfQQLpeLv/zlL+zfv59Z
s2ZxzjnnsHbtWmJjY7n88st54IEHePPNN5k2bZr/vLy8PObOnctFF11ETEzMSfWNoij2UlZQaGx2
Msd39fTHabgFeje3/qL0p7QjUYcjREy9cgovjh5Kn4mDcUcXdqsn18MPc1fx/PxZjmw7kN69e/P8
88/7Xx88eJAXX3yx0g5HAQMGDODpp58G4JprrqF169bcfvvtPPzww9x+++0AXHLJJTRr1oyXXnqp
hMPx22+/sXHjRhISEgDo2bMnEyZM4IUXXuDGG2+kXbt2DBw4kNmzZxdxOD766COOHDnC5ZdfXiXd
iqI4g32eQyzOWl0kTiPaG0fOrz05fqw5VuouaJkEw9tA3XibhCpBoQ5HiIiJiWHqZZNZmbasyEjE
8jcW0W1cP97Mng/Z5TRQAd3G9WN52mIGX3GWv2zVG0uZetnkkPyKFxGuvfbaImVDhw7lvffe4/jx
41Vqb+rUqf7XLpeLPn368P777xdJz5uUlMQZZ5zB1q1bS7Rx5ZVX+p0NgIsuuojk5GQ++eQTbrzx
RgCuuOIKpk2bxrZt22jTpg0Ac+bMoUWLFgwdOrTSup1KSkoKH3zwgd0yFBs5lWwgx+SxMvt7fszd
UlhoIOpYezL3dPFnCq0VA8NaQ7v6hTk1ThYn97OTtQWDDjyFkKlXTuH7ud+Sn+cBrBGIb99eSq9L
BnHCZJ3UX69LBrHy7SVF2v5h7iqmXhm63PotW7Ys8rpevXqANdIQivaSkpKIi4ujfv36JcpLu0b7
9u1LLdu+fbv/9cUXX0xMTAxz5swB4NixY3z88cdMmjSpSpqdSoGDpZy6nAo2YIxhS94vvJnxWRFn
IzovCc+2s8na3RO80QjQIxkm9YD2DULnbICz+9nJ2oJBHY4QUjDKsSJtMWCNbgweP5Kk2ERqSfxJ
/SXFJjJ4/EiW+9pe8cbikI1uFOB2u0stLy/zntfrrVR75V2jKtStW5fzzz/f73C8/fbb5Obmctll
l1WpPacyevRouyUoNlPTbeBYGUGh7O9G5uZRmGzrh0pyIlzSzVqBElP64+SkcHI/O1lbMOiUSojx
x1tcNJiNc9fw9fwlIXMKLr52NINGD6XvRYPZMDedF+f/OyTtBkPBaMeRI0eKlO/YsSNs19y8eXOJ
sp9//pnu3bsXKbviiiu48MILWbVqFa+//jo9e/akU6dOYdOlKEroyPcFha4qFhQalZlsjWj4gkLj
oqycGp0ahXZEQ6k+dIQjxBSMcjx78aMhH4EIZ9sVkZiYSMOGDVm8eHGR8qeeeipsqYBfffXVIvEj
b7/9Nnv27OG8884rUu/cc8+lQYMGzJgxg0WLFmmwqKJECPs8h3j3+BcsD8gU6s6Pw7NrIFnbCzOF
dm5sTZ+c2VidjUhGHY4wMPXKKQzq3C+k8RXV0XZFXH311bz77rtcc801PPfcc1x22WUsXry4ytMh
FVG/fn2GDBnCv//9b/76179y5ZVX0qFDB66+umjekaioKC655BLmzp2Ly+XikksuCYseO3nvvffs
lqDYTE2ygRyTx5KsdP53YkHhChQD8lt7sjePxWRYmUIbJsBFXeCsdhWnJA8VTu5nJ2sLBnU4AkhN
TSUlJYW0tLSTaicmJob/PPNCWEYgwtl2Rdx3331cffXVzJ07l7vuugtjDJ9++ikiEvQoR1n1ipeL
CHfffTfnn38+Dz/8ME888QTnnHMOX3zxBXFxcSXOv+KKKwAYNWoUTZo0qeSdOZ+TtUkl8qkJNlBW
UKg71woKzd1jBYVGu60YjYu7WTEb1YmT+9lp2tLS0khJSSE1NTWo+hKuX6eRhIj0AlavXr261N1i
C3bCK+u4EloWLVrEyJEjeeedd/jjH/8Y1Dnr1q2jR48ezJ49m0svvbTS19T3WFHCyzHf9vE7A7aP
F+PGs68z3sOF28ef3gCGtIbamrMvYgjYLba3MabMDV80aFSpETz//PMkJibyhz/8wW4piqIEUFZQ
qJxIJvfXwqDQunFW8q6Wde1SqoQbdTiUiOajjz7ixx9/5IUXXuDmm28mPl5TDSqKUygtU6grP47c
X3tiMqxMoW6BvqdBr2bg1kn+Go06HIojCTYm5KabbmL//v2cf/75TJ8+PbyiFEUJirIyhZrf2pOz
vzBTaKu61qhGUsmwLKUGov6k4jiGDx9Ofn5+UPEb27Zt48SJE8ydO5datWpVgzp7mDx5st0SFJuJ
BBsoKyhUcqygUM9eKyi0dgyc1wF+39F5zoaT+9nJ2oJBRzgUJQKI9AyDysnjdBsoNSjU68azvwve
w+0BFy6xUpL3PS08WUJDgZP72cnagkEdDkWJACZOnGi3BMVmnGoDZQWFcjzZWubqCwptlggj2kKD
hDIacghO7WdwtrZgUIdDURRFqRKlBYWKJ468PYVBofFRMLg1dGyoWUJPddThUBRFUSpFWUGh+Yfb
4z1QGBTapQkMbGntg6IoGjSqKBHA0qVL7Zag2IwTbMAKCt1VIiiU7Lp4tp2Nd58VFNqoFozvAiPb
Rp6z4YR+LgsnawuGCDMFe9mwYYPdEpQw4fT39pFHHmHIkCF2y1BsxG4bsIJC09np2VtY6HWTHxAU
GuO2RjS6NAFXhE6f2N3P5eFkbcGgDkcQNGzYkISEBCZNmmS3FCWMJCQk0LBhQ7tllMobb7xhtwTF
ZuyygbKCQr0ZyeTvLQwKPaOhtX18rQhPSe7kz5qTtQWDOhxB0LJlSzZs2MDBgwftlqKEkYYNG9Ky
ZUu7ZZRKQoLDQ/uVsGOHDZQWFIonDk9AUGi9eBjRBk5LqnZ5YcHJnzUnawsGdTiCpGXLlo79MlIU
RQklwQSFRrmsfBo9kzUluRIcNdLhEJHTgNeAxkAe8KAx5h17VSmKojgbYwxbPb+wLGstmSa7sDy7
Lvm/9sZk1wegTT0Y1hrqOCxLqOJsaqpf6gH+bIzpDIwB/iUiEbur1x133GG3BMVm1AaUcNvAMe8J
Ps1cyueZywudDa+b/L3d8Ww9G5Ndn8RY+N0ZcH7HmutsOPmz5mRtwVAjRziMMXuBvb7/7xORg0B9
YLetwqqITuUoagNKuGwgmKBQl0DPZtC3OUQ7NCV5qHDyZ83J2oJBjDF2awgrItIbeNkY062cOr2A
1atXr6ZXr17VJ05RFMVGSgsKNXlx5O8tDAo9rY61o2v9yI5XVMJIeno6vXv3BuhtjEkvq54jplRE
ZKiIfCAiu0XEKyIppdS5QUS2iUiWiCwXkb5BtFsf+C9wTTh0K4qiRCI5Jo8lWen878SCQmfDQP6h
9ni2jMVknEZCtDC6PVx4pjobSmhwypRKLWAt8CLwbvGDInIx8BjwJ2AlkArME5EOxpiDvjrTsBwL
Awz0/fs/4O/GmBXVcROKoihOpsyg0Ky65O+xgkIF6NoUBrSAWKd8Qyg1AkeMcBhjPjPG3GeMeR8o
LT9dKvCcMeZVY8xG4DogE5gS0MbTxpiexphexpgcrJGNL40xr1fHPYSTjRs32i1BsRm1AeVkbaDc
oNBtVlBo41owoas1hXKqOhtO/qw5WVswOMLhKA8RiQZ6A18WlBkr8OQLrJGM0s4ZDIwHLhSRNSKS
LiKdq0NvOLjzzjvtlqDYjNqAUlUbyDde1uZs4q2MeUXSknszksnbMgbv4Q7Eul2MaAPju0Lj2qFS
HJk4+bPmZG3B4HiHA2gIuIF9xcr3AU1LO8EYs8wYE+Ub7SgY9fixogudd955pKSkFPkbOHAg7733
XpF68+fPJyWlRJgJN9xwAy+++GKRsvT0dFJSUkpkKb3//vuZMWNGkbKdO3eSkpJSwovt3bt3ieVQ
mZmZpKSklNjMJy0tjcmTJ5fQdvHFF9t+H0888YTeRxXvo/j+CZF6HzXl/bDjPp588slK38c+zyHu
f38GV1x4mX8FismLw7NrIGl/fp1v3n2Djo1gUk9rGmXtGn0/CvrZifdRoM3O9yMtLc3/3di0aVNS
UlJITU0tcU5pOG6Vioh4gQuNMR/4XidjLWcdGBiLISIzgGHGmFJHOSp5TV2loihKjSHH5LIi+wfW
l5MptH48jGgLzevYp1OpGQS7SiUSZukOAvlAk2LlTfDl2lAURVEKto//ha+zyw4KjXJB/5bQXVOS
K9WM4x0OY0yeiKwGzgYKRj3E9/pxO7UpiqI4hWPeEyzJSmdXQJyG8brxBmwf364+DG0NibG2yVRO
YRzh34pILRHpLiI9fEVtfa9b+F7PBK4RkStEpCPwLJAAvBJKHampqaSkpJCWlhbKZk+a4nN1yqmH
2oBSlg3kGy9rcjbyVsa8Is6GNyMZjy8otE6si993hPPOUGejIpz8WXOatoJ4jmBjOJwywtEH+Aor
d4bByrkB1tLWKcaYt0SkIfAA1lTKWmCMMeZAKEXMmjXLkTEcmZmZdktQbEZtQCnNBvZ5DrEoazWH
i2QKjfdlCm2GS4TezaFPc4iq4SnJQ4WTP2tO0zZx4kQmTpwYGMNRLo4LGrUDDRpVFCWSKC0o1Bjw
BgSFtkiy8mnUi9htK5VIoSYFjSqKopxyTJl2NZu2/oQ7cGjCQC55nMjLpH6rRkz859VWcUBQaK1o
GNIOTm8AUloaRUWxCXU4AkhNTSUpKck/TKQoimIXfXv2wXSKo/8Vw0scW/qqlQcxMChUcNEjGfqf
BjH6ZFeqgbS0NNLS0jh69GjFldEpFcD5UyoHDx6kYcOGdstQbERt4NQjNzeXgaMGM+XdW3FHR3H8
0DFqN6iDJ9fDE+Me4oZXnkAO9QdPAk1rWzk1GtWyW3Xk4+TPmlO1RdRusUr5TJkypeJKSo1GbeDU
IycnB4/XxTevLwbg1RueAWB52iLiazckZ2tv4kjgrLZwURd1NkKFkz9rTtYWDOpwRADTp0+3W4Ji
M2oDpxbGGB6f/xJT376Fb99ZQn6eh/P/Mh5Prodv09LpN+JW1r43k0k9oHMTjdUIJU7+rDlZWzDo
lAqFUyrDhg3TGA5FUWwlw3uChZmr2J2/HyiI1xCGXHEWS19ZSP6+rgw8/1pm3zWalUs+t1esckoT
GMOxePFiqGBKRR0OnB/DoShKzccYw6a87SzLWkseHn95zt5WPH3Vjdzw7s089ccnuG7GEqKiY3j9
3gv4+ov3EB3eUGxGl8UqiqJECJnebBZlrWKHZ4+/7Nj+DOIzz8OV2ZReI6fw1IRH6TXyeqKiYzDG
4Mk5oc6GElFoDEcEUHzLYuXUQ22g5rIlbxdvHZ9XxNnwHmnFkn/tYv2CtQD0GzsFb2YS/cZaQYMb
V3zG2SOG2KK3puPkz5qTtQWDOhwRQHp6mSNUyimC2kDNI9ubyxeZy/k8cznZJhcA44nFs3MQ7OlH
6o238t37M9mw/FPcUdE0bd0Vd1Q0G5Z/ynfvz+Keu26z+Q5qJk7+rDlZWzBoDAcaw6EoSvWyM28P
C7NWFdlC3nusOfl7etOydizD20DdeMjIyOChGY+xYNEy3DEJ5Odmctbwwdxz120kJibaeAeKUkiw
MRzqcKCrVBRFqR5yTR7fZK9jQ+5Wf5nJjyZ/T0/is1oyrI3Qvn7py1yNMRqzoTgKXaVSBXSEQ1GU
cPOr5wALMr/luDnhL/Meb4L31750bxRP/xYQozu6KhGIrlJRFEVxAB6Tz4rsH/g+5yfwDVAYrxvv
vu40ymvLyDNFs4QqpwQaNBoBpKSk2C1BsRm1gchkv+cwbx77nO9zC50Nb2ZD3DtGM6JeO8Z3Cd7Z
UBuoHpzcz07WFgw6whEB3HjjjXZLUGxGbSCyyDdeVmZu4Lu8DSDWtLXxuvAe6MIZ7g4M7izER1eu
TbWB6sHJ/exkbcGgMRxoDIeiKKHjkOcon2as5LjriL/MZNWl9uF+jGqRRLIuLlFqGBrDUQVSU1N1
lYqiKFXCawzLj//EuvwfwOUFwBhBDnWiX3wnenZy4dJFJkoNInCVSjDoCAc6wqEoyslxMO84nxz7
lsyog/4yk5NI8vF+jGpen9qxNopTlDAT7AiHBo1GAO+9957dEhSbURtwJl6vYeHhLbxzfL7f2TAG
oo50YEzMOVzYNnTOhtpA9eDkfnaytmBQhyMCSEtLs1uCYjNqA85jT1YW/z2whI3udHDlA2Bya9Eh
cwRXtehO27qhTaqhNlA9OLmfnawtGHRKBZ1SURQleDz5hi8O7GRbzBrEnecvTzjRlnPrdqNRQiWX
nyhKhKNBo4qiKCFm85EcFmauJr/Wbvzxn544ekgf+icnl5qSXFEUC3U4FEVRKuBELszbs5t9tVcj
tXL85Uk5LTm/fk8So2JsVKcokYE6HAHoslhFUQLxGlizN49v89ZA3R3+UQ3Jj6F/dG96ND7NVn2K
YieVXRarQaMBzJo1iw8++MBxzsbkyZPtlqDYjNpA9bM3A+Zs3sfK6HmQtMNfXj8/mUlJY+iRWL3O
htpA9eDkfnaatokTJ/LBBx8wa9asoOrrCEcEMHr0aLslKDajNlB9ZOfB0p0eNrnW4W6yxT+q4fJG
MSCuB13jWtuyTbzaQPXg5H52srZg0FUq6CoVRVGs/BkbD8CSfYfIb7ISiT3uP9aQRoxJ7EuiS7d1
VZTi6CoVRVGUIDmUCQu25rM/fj2uFhv9q01cxs2A+K50jWlvy6iGotQk1OFQFOWUJTcfVu6CtYeP
4G6+EndcYfBbQ6nPqNr9qOvW3dYUJRRo0GgEsHTpUrslKDajNhBajIGfD8HstV6+y9uAu+0XiM/Z
ECP0i+3CHxNHOsrZUBuoHpzcz07WFgzqcEQAjzzyiN0SFJtRGwgdR7Phw43w6fYMspt/hbvxD4hY
sWz1XUmMSxxFr7hOuMRZj0e1gerByf3sZG3BoEGjOD9oNDMzk4SEBLtlKDaiNnDy5Hth9a+w6heD
qfczrsbrEN828gL0iO1In9gzcUto90AJFWoD1YOT+9mp2jRotAbhRANTqhe1gZNj5xFYtA2O5J/A
3fJb3LUO+I8luWpzVnw/mkQ1sFFhxagNVA9O7mcnawsGdTgC0EyjilKzOJ4LS7fD5kMGqbudqCZr
EbfHf7xLTHv6x3UlWvRRqCiVpbKZRnVKBedPqSiKUjm8BtbtheW7IE+ycCevxpW4x3+8tsQzIqEv
p0U1sVGlotQMgp1ScVZUlFIqd9xxh90SFJtRGwievRnw5jpYsh08tXYR1XZ+EWfjjOjWjE8cE3HO
htpA9eDkfnaytmDQccQIoGXLlnZLUGxGbaBisvPg653w437AlYu7eTqupF3+4/ESy/D4PrSObmaf
yJNAbaB6cHI/O1lbMOiUCjqloiiRjDGw4QAs2wHZHpDae3Anr0Kis/112kadxtD4XsS7Ym1Uqig1
E12loihKjefgCVi4DfZkAK483Mnf4aq3zX88hmiGxveifXQLTU2uKDajDoeiKBGHPyX5HjCAJBzA
3WwlEpPpr9MiqinD4/tQ2xVvn1BFUfxo0GgEsHHjRrslKDajNmBRkJJ8zlpYsweM5ONqspaoVgv9
zkYUbobF9+a8hCE1ytlQG6genNzPTtYWDOpwRAB33nmn3RIUm1EbCEhJ/pOVX0PiDhPV9nPcDTZb
qUKBZHdDJiSO5syYtjVuCkVtoHpwcj87WVsw6JRKBPDkk0/aLUGxmVPZBgpTkkO+AfDiarQed8ON
4NsDxY2LfnFd6BrTAVcNczQKOJVtoDpxcj87WVswVNrhEJE2wFCgFZAAHADWAN8YY7LLO1epGpG+
FEo5eU5VG/CnJC94ssQeJab5SkzcEX+dRu56jIzvR313HXtEVhOnqg1UN07uZydrC4agHQ4RuQz4
M9AH2Af8CmQB9YF2QLaIzAFmGGN2hEGroiinCIUpyQtKDK4Gm4hq/CNGrA3XXAi9YjvRM7YTboft
7KooSkmCcjhEZA2QC7wCjDPG7Cp2PBYYCFwCrBKRacaYt0OsVVGUGk6RlOT5vsLo48S3XIkn9hAF
WYPquepwVkI/Grnr2SVVUZRKEuzPgr8YY/obY54u7mwAGGNyjDELjTHXAR2BrSFVeYozY8YMuyUo
NnMq2EBgSnLL2TDENNhCbPv5eGL9Qx10j+nAuNqjTjln41SwASfg5H52srZgCGqEwxgzL9gGjTGH
gEMVVnQgTt0tNjMzs+JKSo2mJttAVh58U5CSvICoTJJaryIzZp9/VCNRanFWQl+SoxrZIdN2arIN
OAkn97PTtIV9t1hfGvA8Y8z3vtcXAJOB9cB0Y0xu5STbj6Y2V5Tqp3hKcl8pdRrtJK/RGjzk+eue
GdOWgXHddRt5RXEg4Uxt/hzwMPC9iLQF3gD+B4zHWrVySxXaVBTlFKJISnIf0TE51G+9msNRu/1l
CRLHiPi+tIxuaoNKRVFCSVUcjg7AWt//xwOLjTGXishgLOdDHQ5FUUqleEryApo1282xuqs5TI6/
7PTolgyJ70msxFS/UEVRQk5V1pJJwHmjgE98/98FNAyFKKUoBw8etFuCYjORbgMFKclnF6Qk95Un
JeTSutNKDtT9mhyfsxEnMZyTMJCzE/qrsxFApNtApODkfnaytmCoisOxCrhXRC4HhgMf+8rbYOXn
UELMlClT7Jag2Ewk28DRbPjAl5L8hC/Cyy1wZut9SJv57JbCtD2to5oxofYY2kWfZpNa5xLJNhBJ
OLmfnawtGKoypXILMAe4EHjIGPOzr/wi4OtQCVMKmT59ut0SFJuJRBvweCF9N6zaXZCS3KJFPQ+J
zdex2bvFP9QRQxSD43vSIbpVjdsDJVREog1EIk7uZydrC4ZKr1IpsyGROCDfGJNXYWWHoatUFCW0
lEhJDtSOga6tD/JTzLcc8x73lzd3N2ZEQl8SXQk2KFUU5WQJ6SoVERFTgWei+6goinI810rc9XNA
Jh6XQLfkfFyNfmR13iaMlZmcKNwMiOtG55h2OqqhKKcAwU6p/CgiDwDvlpdnQ0ROB24FdhhjHg6F
QEVRnE+pKcmB5ETo0eY30r0rOZx3zF/exF2fkfH9qOtOtEGtoih2EGzQ6E3A7cBeEXlTRO4QkctE
ZJyIXC0iM0VkJdZy2WPAM+ESfCry4osv2i1BsRkn28CeEinJIS4Kzm7npU379SzwfMlhr+VsuBD6
x3blglpnqbNRSZxsAzUJJ/ezk7UFQ1AOhzHmS2NMHyAF2A9cBjyJFTw6HTgdeBU4zRhzlzEmuDyn
SlCkp5c5JaacIjjRBrLy4Mst8M4PcDAg43KXJvD7bsfYkLCAb3N+xOuLDG3gSmJc7VH0jOuIS6dQ
Ko0TbaAm4uR+drK2YAhZ0Ggko0GjihI8packh4YJMKKN4UDsZlZkf08+VrCGAD1iO9IntrNuI68o
NZBwpjZXFOUUpdSU5G4Y2AJaNz7Boqxv+TX7gP9Ykqs2Z8X3o0lUAxvUKoriJNThUBSlQnLzYcUu
+K5YSvLTG8CQVoZdsp13jq8lj8Ihjy4x7ekf11U3XFMUBaihDoeIJAFfAG6se3zcGPMfe1UpSuRh
DGw5DIu3F2YJBagbB8PbQIM6WSzKWs1Ozx7/sdqSwMiEvjSPalz9ghVFcSw1dUL1GDDUGNML6A/c
LSL1bNZUZVJSUuyWoNiMHTZwJKv0lOQDWsCl3SE3YRdvHZ9fxNk4I7o14xNHq7MRBvQ5UD04uZ+d
rC0YauQIhy9JWUEisnjfvxEbFn/jjTfaLUGxmeq0AY8XVu+2/gJTkreqa41qxMbksCB7DVvydvmP
xUssw+P70Dq6WbXpPNXQ50D14OR+drK2YKjSKhURaQdMBtoBfzbG7BeRc4GdxpgfQ6yxSvimVRYB
7YE7jDFl5gbRVSqKYrHziBUUerRYSvJhraFtfdjp2cOirFVkBiQWbht9GkPjehHviq1+wYqi2E6w
q1QqPaUiIsOB77GmKv4I1PYd6g78X+WlgogMFZEPRGS3iHhFpMS4kYjcICLbRCRLRJaLSN/y2jTG
HDXG9MDaxfYyEWlUFW2KcipwPMeaOnl/Q6Gz4RLo1Qwu6wEt6uexKGsVn2Yu9TsbsRLN2fH9OSd+
gDobiqJUSFViOB4G7jXGnAMEpjlfAAyooo5aWFlKp1E0CB4AEbkYeAy4H+gJfAfME5GGAXWmicga
EYPkvqwAACAASURBVEkXEf/TzxhzwFd/aBW1KUqNxWtgza8we23R/U+aJcIl3WBwKzhg9vNWxnw2
5m3zH28R1ZQJtcdwekxL3QdFUZSgqIrD0RX4Xynl+4GGpZRXiDHmM2PMfcaY9yk91iIVeM4Y86ox
ZiNwHZAJTAlo42ljTE9foGiSiNQG/9TKMGBTVbQ5gffee89uCYrNhMMG9mTAG+tg6Q7I822oFhcF
o9rBHztDUnw+y7LW8uGJRRw3VirRaKIYFt+b8xKGUMsVX07rSqjR50D14OR+drK2YKiKw3EESC6l
vCew++TklEREooHewJcFZb6g0C+AgWWc1gpYIiJrsOI4/u2U2JKqkJaWZrcExWZCaQOBKckPFUtJ
fnkP6NQY9ucf5p3jn/N97mb/8WR3Q8YnjubMmLY6qmED+hyoHpzcz07WFgxVcTjeAGaISFOs6Q+X
iAwG/om1n0qoaYiVT2NfsfJ9QNPSTjDGfOsb7ehpjOkRbA6O8847j5SUlCJ/AwcOLOFVzp8/v9Tl
STfccEOJzXXS09NJSUnh4MGDRcrvv/9+ZsyYUaRs586dpKSksHHjxiLlQ4YM4Y477ihSlpmZSUpK
CkuXLi1SnpaWxuTJk0tou/jii22/jyeeeELvo4r3MXr06JO+jw0bNrJ+vzV9sn4/LHr7Cd578g4a
1YLxXWBkW8jLPc6w80fyzy+e4ojXSifqxsWR93fx3k2vUsdV66Tuo6a8H3bcx5tvvlkj7iMQJ95H
QT878T4KtNn5fqSlpfm/G5s2bUpKSgqpqaklzimNSq9SEZEY4CngKixHwOP793XgKmNMftlnB9W+
F7jQGPOB73Uy1sjJQGPMioB6M4BhxpiyRjkqc01dpaLUaEpLSR7jtnJqdG1qBYgeyj/KgsyVHPIe
8ddp5K7HWfH9qOeuY4NqRVEigbDtpWKMyQWuEZH/B3TBWqWyxhizufwzq8xBIB9oUqy8CbA3TNdU
lBpBWSnJOzSAIa2hVgx4jWFNzia+zf4Rr2/DNRdCr9gz6RnbUTdcUxQlJFQ58ZcxZiewM4RayrpO
noisBs4GCkY9xPf68VBeKzU1laSkJCZOnMjEiRND2bSiVCvlpSQf0RZaJFmvj+YfZ0HWSvblFy5R
qeeqw1kJ/WjkjtjkvIqiVANpaWmkpaVx9OjRoOpXZUpFgIuAkUBjisWBGGP+WKkGrTZrYSXoEiAd
uBX4CjhsjNklIhOAV7BWp6zEWrVyEdDRt+z1pHD6lMrkyZN5+eWX7Zah2EhlbOBIFizaBjsDngFu
gb6nWXk13C4wxvBj7haWZ6/DQ+EsaPeYM+gb15kocYf6FpSTRJ8D1YOT+9mp2sK5Pf2/gGuxHIJ9
lJI3owr08bVnfH+P+cr/C0wxxrzly7nxANZUylpgTCicjUigeMCgcuoRjA1UlJI8Kc56fdybycKs
VfziKYzDruOqxcj4fiRHVWllu1IN6HOgenByPztZWzBUZYTjMDDJGPNJeCRVP04f4VCUiigzJXkb
aFsPRKxRjZ/ydrAsay255PnrnRnTloFx3XUbeUVRqkQ4RziOAlurKszJaAyHEmkcz4ElO4pmCXUJ
9Ei2plBifDMjWd5sFmWtZrvnV3+9WhLPiPg+tIgudXW5oihKuVRHDMeVwFisqY6sykt0HjrCoUQa
XmOtPFmxqzBLKFgpyUe0hQYJhWXb8nazKGs12SbHX3Z6dEuGxPckVmKqUbWiKDWRsG3eBrwF1AP2
i8j3vr1L/H9V1KuUQ/HkLMqpx5IlS/z/Ly0leXwUjGpvpSQvcDZyTC5fZq5gXubXfmcjTmIYnTCQ
sxP6q7MRYehzoHpwcj87WVswVGVK5b9YqcZnE7qgUaUcHnnkEYYMGWK3DKWaycjI4MGH/8mCRcvY
sukH2nbowhk9B9PjwtuJq5Xor9elCQxsAXHRhefuytvLwqxVnAgYhGwd1Yxh8b1JcMVV520oIUKf
A9WDk/vZydqCoSpTKiewVohEtqsVgNOnVDIzM0lISKi4olJjyMjIYOzvx9H9glvp2H8MeTlZRMfG
s2HFPL5Km8nUv8+lReNERrSBpoW+B3nGwzfZ61ifu8VfFkMUg+N70iG6le6BEsHoc6B6cHI/O1Vb
sFMqVXE4NgITjDHrTk6icyhwOIYNG6ZBo4ojuOue+8loOJBOA8aWOLb+m0/J27WC52dOxxXgP+zx
HOSrrJUc857wlzWPaszI+L7UdjnvIaUoSmQTGDS6ePFiCIPD8TvgJuA6Y8z2kxHrFJw+wqGcWmTl
Qf9ho7j6sc9LHZEwxjD7rtGsXPI5AB6Tz7fZP/Jd7iZ/nSjcDIjrRueYdjqqoShKWAnnstjZ/P/2
7jxKqvLO//j72zvdLLKDC6LsCCgioqImakISTdpMEkfRSQyQySSoM9NJxCTmROd3MnMCMfrL6C+Z
TI7j8puks5xEZPKLW9xxAaFVFmkRAVEUpGVruunqpZ7fH7foruoFqpuqe5/q/rzOqWP3vbdufevh
a9W3n/s8z4VS4G0zq4ekCf2Ac25ID84p0uftPgTrdsHmPQ5XUNZloWBm5BeV4pyjJr6fp+pXsy9+
sHX/yPyhXNJvNifkD+j0+SIiUejJLJV/Br4OLARuJFhmPPkhGdb+1sLSe7TEoXoP/H598KjeA3GM
xoY6knsfl9/TlgPOOVqaD7M2tomHDj3ZWmzkkceckulcWXaJio1eSJ8D4fC5nX2OLR09uVvsA9kI
RLo2ZsyYqEOQDDsUg/W7YeNuONycuq84H+acN5fqVY+1juEYPLItB7ZV/4Xrfvl3rIltbN02NG8Q
l5bOYWj+oFDil/DpcyAcPrezz7GlI60xHGY20Dl38MjPRzv2yHG5RINGJQzOwc6DwWWTrXs7zicf
VgozRsHEYbDoG1/lmZeep9+goRSVlLUe0xI/hBU0M2zsCObf8TUMmFk8hVnFU3UbeREJVVYGjZpZ
CzDaOfehmcXpfO0NA5xzLuduM6lBo5JNjS2wuQbWfQAftVubN89g3JCg0Bg9ILjnCcAvfvUfrGpY
z3lf+XiH86188EkAPvvVz3NJv9mMLBia5XcgItK1TA8avRTYm/j5kuOMTaRP2H84uGzyxodB0ZGs
tDBYsOuMkcFN1tpbdP1C7p13EbPnX0h+Ydv/ps2Nzbzyh5X88n/uY27/mbrhmojkjLQ+rZxzz5rZ
D83sDufcs9kOSlJVV1czefLkqMOQNDgH2/cHl0127O+4f/SAoDdj3BDIP8oVkMLCQr5wzRdZVfkc
F3zlUnZt3smoiSfx8m+fZcF1X+Xjg2Zn702Il/Q5EA6f29nn2NLRnYu+twH9sxWIdG3JkiVRhyDH
0NAEVe/Dg6/Cn6tTi418g6nD4erp8KVpwRiNoxUbu5o/YkXdMwz84ims+sPztDQ186cf/jfNjc1U
/7GKby34x+y/IfGOPgfC4XM7+xxbOrrTH6vVgyJyzz33RB2CdGFPXWLtjBpojqfuG1gM00fClBHQ
r7Dz5yfb23KA1Q0bWm8hX1BUwOyrLmRV5XNc85NFrPntShZdt5CiIt10rS/S50A4fG5nn2NLR9or
jSYGi450zu3Jbkjh0ywV6Y6WeDDLZN0ueL+24/4xg4LLJqcOJmXp8a7Uxut4pWEjm5veSdk+KK8/
Z+VN5MtXXMtXKm/iwfl38+Ljz6vgEBEvZG1p80TBcYBj3B02F1ca1SwVSUddY7BuxobdUNeUuq8w
P7hsMn0UDO6X3vkOx2NUxTaxsfFt4rR1j5RaCeeUnMGkwrHkWx6/+NV/cPf//QU3ffmbfPPvv5HB
dyQicvyytbT5bQRFh0if4BzsOhRMad2yF+Ltyu3B/YLejMnDoSjNCeGNrol1sc28HttME22rfhVR
yMySyUwrGp8y+2TR9QtZW7WWRdcvzMRbEhGJRHcLjt865z7MSiTSpaVLl3LLLbdEHUaf0twCmz8K
LpvsqUvdZ8BpibUzTh7YtnbGsbS4Ft5o3Mra2CYaXKx1ewH5TC+ewFnFkyi2jpdLioqKmDB2vC6l
9HH6HAiHz+3sc2zp6E7B0b3bykrG1NfXRx1Cn3GwoW3tjIZ2S46XFATrZkwfCQOK0z9n3DneanqH
Vxo2csi1/VsaxpSi05hVPJWyvKNfh1EOiHIgHD63s8+xpaO7YzhG9cYeDo3h6Nucg3cPBL0Z2/Z1
3D+iDGaMhglDoaAbE8mdc7zT/AGrGtan3M0VYHzhKZxTfIZusiYiOS/jYzicc7pRg/Qqjc2waU9Q
aOxvSN2XZ0GBMWMUjOpBTfBB8x5ebljP7paPUrafUjCSc0umMzx/8HFELiKSe7QusvQ5e+uDIqN6
DzS1WzujrCi4ZHLGyGD58e6qadnP6ob17GjelbJ9RP4Q5pRM56SCEccRuYhI7lLBkaSiosLLdThq
amoYNmxY1GHktLiDbYm1M97r5H7GJw0MejNOH5Le2hntHYwfYnXDRrY07UjZPjhvAOeWTGdswYlY
uqNLO6EcEOVAOHxuZ99iS16HIx1pj+HozXwfw1FeXs6KFSuiDiMnHW6CjR/C+l1wqDF1X0FeMJ11
xigYWtqz89fHG1gbe4NNjVuJJ42r7m/9OKfkDCYWnkpeBm4brxwQ5UA4fG5nX2PL1jocEoHbb789
6hByzu5DQW/GWzXQ0q6mPqEkWKBrynAo7uH/ATHXxOuxN1kX20wzbbeCLbEiZhZP4YyicRRYmgtz
pEE5IMqBcPjczj7Hlg4VHDnAx14XH7XE4a3E2hm7D3XcP/aEYLbJmEHpr53RXrNrYWPjFqpi1cRc
W5dJAfmcWTyRGcWTKLYeDP44BuWAKAfC4XM7+xxbOlRwSM47FAvWzti4Gw63WzujOB+mjgh6NAaV
9Pw14i7Om03vsKZhI3XucOv2PIypReM4u3gKpXnH8QIiIr2cCg7JSc7BzoNBb8bWvR1XpRtWGozN
mDgsuM9Jz1/Hsa15J6sbNrA/nnqntgmFY5hdcgYD8/r3/AVERPoIra2RA+69996oQ/BGY0tw87TK
1+GhN+DtpGLjyNoZXzwDrpkRTG09nmJjZ/OHPFT3FI/Xv5RSbJxaMJqr+n+Sy0rnhFZsKAdEORAO
n9vZ59jSoYIjB1RVdTnot8/Yfxie3w73rYWnt8JHbVc1KC2Ec0+G68+GT0+EE7txf5PO7GnZx5/r
nuN/6p7lw5a9rdtH5Q/lyrJL+EzZhQzNP6HnL9ADygFRDoTD53b2ObZ0aFos/k+L7aucg+37g8sm
O/Z33D96QHDZZNwQyM9A6by/pZZXYht4u+m9lO1D8gYyp2Q6YwpGH9daGiIivZGmxfaArwt/9TUN
zcHN09bvgoOx1H35BpOGBYNAR2ToakZd/HBiLY1tuKTRIAOslNkl0xhfOIY8FRoiIim08FcPqIfD
D3vqgiLjzRpobrfk+MDiYMnxKSOgX4ZmncZcI6/GqtkQ29JuLY1iZhVPYWrR6eRncC0NEZHeSD0c
khNa4sEsk3W74P3ajvvHDAoum5w6uGdLjnemyTWzoXELrzZU00hT6/ZCCjireBLTiydQlIW1NERE
+jINGs0B5eXlUYeQcXWNsPpdeKAKHn0rtdgozIczR8HfnQVXToXTenh/k/ZaXJw3Ym9TWfsIqxrW
txYbeeQxo2gC1w64nFklU70sNnpjDkj3KAfC4XM7+xxbOtTDkQNuvPHGqEPICOdg1yFY9wFs2Rvc
UC3Z4H5Bb8bk4VCUwSsZzjnebnqPV2IbOBBvW4LUgImFYzmn5AwG5PXwZioh6S05ID2nHAiHz+3s
c2zp0BgONIYj25pbYHNiyfE9dan7jKAHY8YoOPk4p7O255zjvebdrGpYT008dZrL2IITObdkOkPy
B2buBUVE+iCN4ZDIHWwIlhx/48Ng5kmykoJgYa7pI2FAceZfe3fzXlY1rOP9lj0p20fnD+e8kumM
LBia+RcVEZEuqeCQjHIO3j0Q9GZs29dx/4iy4AZqE4YGt4fPtH0tB1ndsIFtzTtTtg/NO4HzSqZz
csFIraUhIhIBDRrNAcuXL486hGNqbIbXP4D/fg0e3pRabOQl1s64ahpcPSO4LXymi41D8XqeqX+F
3x96LKXYGJhXxif6zeFL/T/BKYWjcrbYyIUckOxSDoTD53b2ObZ0qODIAZWVlVGH0KW99fDMVviv
tfDcdtjf0LavrAjOOwUWnA3zJsCoAZl//YZ4jJcOv05l7SNUN21vXbar1Eq4qORsru7/acYXjcnZ
QuMIn3NAwqEcCIfP7exzbOnQoFE0aLS74i7owVj3Abx3sOP+kwYGg0BPz9B01s40uWbWxTbzeuxN
GmkbIFJEYetaGoWmK4YiItmmQaOScYebYOOHsGEX1Dam7ivIC6azzhgFQ7M4w7TFxdnUuJW1sTc4
7NrWPc8nj+lFEzireDIleUXZC0BERHpEBYcc0+5DwSDQt2qgpV2H2KCSoMiYMhyKs5hNzjneatrB
Kw0bqXVtc2sNY3LhWGaVTKW/52tpiIj0ZSo4pFMtcXgrsXbG7kMd9489ISg0xpyQ2bUz2nPOsaN5
F6sb1vNRPPUGQacXnsy5xdM4IT8Lg0NERCSjNGg0SUVFBeXl5d4NzFmwYEFor3UoBi/tgPvWwhNb
UouN4nyYORq+MhM+NyW4v0k2i41dzTWsqHuGR+pXphQbJxWM4AtllzGv9Pw+U2yEmQPiJ+VAOHxu
Z99iq6yspLy8nIqKirSOVw9HkrvuusvLQaPz5s3L6vmdg/cPBr0Zb++F9sOIh5YG9zaZOCy4z0m2
7W05wOqGDWxvfj9l+/D8wcxJrKXR12Q7B8R/yoFw+NzOvsU2f/585s+fnzxo9Kg0S4W+O0ulsQU2
1wSzTT46nLovz2BcYsnx0QOy25NxxMF4HWsaNrK56Z2U7YPy+nNuyXROLzgp56e3ioj0NpqlIl3a
f7htyfHGltR9pYUwbWSw7Hj/kCZ7HI43UBWrZmPj28SJt24vs36cUzKVSYVjyTNd/RMRyWUqOPoI
52D7/uCyyY79HfePHhD0ZowbAvkhfbc3uiZej21mXWwzTUlraRRbITOLpzCtaDwFFsI1HBERyTr9
2ZgDVq5c2ePnNjRD1fvw4Kvw5+rUYiPfYOpwuHo6fGlaMEYjjGKjxbWwLvYWv6n9C2tjb7QWGwXk
M7N4MtcOuJyziiep2EhyPDkgvYNyIBw+t7PPsaVDBUcOWLZsWbefs6cOnno7mG3ywjtwsG2NLAYW
w9wxsGAWXDYeRvTPYLBHEXeONxu3U1n7KC82vEaDC1YPy8OYWjSO+QM+w5yS6RSbFu5qryc5IL2L
ciAcPrezz7GlQ4NG8X/QaH19PaWlx17UqiUOW/cGl03er+24f8yg4LLJqYOzt+R4Z5xzvNP8Aasa
1rMvnroW+vjCU5hdPI1B+SFVPTkq3RyQ3ks5EA6f29nX2DRotBc5VoLVNcLG3bBhN9Q1pe4rzA9W
AZ0+Cob0y2KQXXi/eQ+rGtazu+WjlO2nFIxiTsk0huUPDj+oHOTjh4yESzkQDp/b2efY0qGCIwc4
5zpMB3UOdh0KprRu2RvcUC3Z4H5Bb8bk4VAUwVCImpb9rGpYz7vNu1K2j8wfwrkl0zmpYET4QYmI
SGRUcHiqtraWH/34Dp569gUKistojtVx6cfm8t2bv8MHjQNYtysYp5HMgNMSa2ecPDCctTPaO9By
iFdiG9jS9G7K9sF5Azm3ZBpjC07UWhoiIn2QBo16qLa2lk9/7ovUDjufLy97gtJRE/nysic4OOx8
5n7qi/y/dbUpxUZJAcw6Ca4/G66YBKcMCr/YqI838PzhKn536NGUYqO/9ePj/WZzVf95nFaohbt6
6uabb446BImYciAcPrezz7GlQz0cHvrRj+/gzCu/xZTzPg3A4JFjMDOmnvdpcI6nKn/K5V+7nRFl
MGM0TBga3B4+CjHXxGuxatbH3qKZtlXESqyIs4unMLVonKa3ZsCYMWOiDkEiphwIh8/t7HNs6dAs
FfybpTL7wk/w5WVPdNob4JzjV9+axxNPPMGoCO9b1uxa2NC4hVdj1cQS01shWEvjzOJJnFk8kSIr
jC5AEREJhWap5CjnHAXFZV1eejAz+peVMrK/Ixi1Ea64i/Nm03bWNLxBnWu7AcuRtTRmFU+hX15J
6HGJiIjfenXBYWb9gE3A751zS6KOJx1mRnOsrtOZKRAUJM2xutDHQjjn2Na8k9UNG9gfT13kY2Lh
qZxTcgYD88pCjUlERHJHbx80eivwUtRBdNelH5vLm6sea/199/bq1p+rVz3KZR+/MNR43mvezZ/q
nuTx+pdSio1TC0ZzVf95XFp6roqNLKuurj72QdKrKQfC4XM7+xxbOnptwWFm44FJwCNRx9JdP/ju
d3jt4TvZ9PIjOOd4+OdLcM6x6eVHeP3hu7j1lm+HEseeln38ue45/lz3HHta9rVuH5U/lCvLLuEz
ZRcyNH9QKLH0dUuW5EQHnWSRciAcPrezz7Glo9cOGjWz5cB3gLnAGUe7pOLboFEIpsb+69Kf8tSz
L9AcD2ahXPqxudx6y7cZMCC7o0X3t9SyOraBrU3vpWwfkjeIOSXTGVMwStNbQ7Zjx46cH6Eux0c5
EA6f29nX2HJq0KiZXQTcDMwCRgOfd86taHfMDQQFxCjgdeAm59wrXZyvHHjTObfFzOYSxejK4zRg
wAB+/KPbgc5XGs2GQ/HDrI29QXXjNhxthegAK2V2yTTGF44hT4VGJHz8kJFwKQfC4XM7+xxbOrwo
OIAy4DXgXuBP7Xea2dXAT4GvA6uBCuAxM5vonKtJHLMY+HvAAU8DXzKzq4ABQIGZHXDO/SiMN5Np
2S42GuKNwVoajW/RQrx1ez8rZlbxVKYUnU6+9dqrbyIiEgIvCg7n3KPAowDW+bdrBfBL59yDiWO+
AVwBLASWJc7xc+DnSc/5duLY6wkuqeRksZFNTa6ZDbFgLY1G2u76VkgBZxVPYkbxRArNixQREZEc
5/2frWZWSHCp5ckj21ww8OSvwPlRxRWmpUuXZvR8LS7OxtjbVNY+wqrY+tZiI488ZhRN5NoBlzOr
ZKqKDY9kOgck9ygHwuFzO/scWzq8LziAYUA+sLvd9t0E4zmOyjn3QLprcFx++eWUl5enPM4//3yW
L1+ectzjjz9OeXl5h+ffcMMN3HvvvSnbqqqqKC8vp6amJmX7bbfd1iF5duzYQXl5eYepT88880yH
NfTr6+spLy9n5cqVKdsrKytZsGBBh9iuvvpqHnroIbY0vsvvDj3G8w1VrHlyFT+/ZikGTCocy/wB
n+GCfmfynZu+lZX3cffdd2fkfUT97xHF+3jhhRd6xfvoLf8eUbyP+vr6XvE+kvn4Po60s4/v40hs
Uf57VFZWtn43jho1ivLycioqKjo8pzPezVIxszhJg0bNbDSwEzjfObcq6bilwMXOuePu5fBxlkom
Oed4r3k3qxrWUxPfn7LvtIKTmF0yjSH5AyOKTkREcllOzVI5hhqgBRjZbvtIYFf44eSW3c0fsaph
Pe+37EnZfmL+cOaUTGdkwdCIIhMRkb7E+4LDOddkZmuBy4AjvR6W+P3fo4zNZ/taDrK6YQPbmnem
bB+WdwJzSqZzcsFIraUhIiKh8aLgMLMyYDxt62WcbmZnAnudc+8CdwL3JwqPI9NiS4H7MxlHRUUF
gwYNYv78+cyfPz+Tpz4uNTU1DBs2LK1ja+P1rGnYyOam7SRfLBuY159zi6cxrvBkFRo5qDs5IL2T
ciAcPrezb7FVVlZSWVnJgQMH0jreizEcZvYxgrUz2gfzgHNuYeKYxcASgksprxEs/LUmQ6/v9RiO
8vJyVqxYcdRjDsdjvBqrZmPjlpS1NEqthFnFU5lcdJrW0shh6eSA9G7KgXD43M6+xpZTYzicc89y
jBkznayz0WfcfvvtXe5rcs2si23mtdibNNHcur2IQmYWT2Za8XhNb+0FjpYD0jcoB8Lhczv7HFs6
9E2UAzrrdWlxcTY1bmVt7A0Ou1jr9nzymF40gbOKJ1OSVxRmmJJFPva8SbiUA+HwuZ19ji0dKjiS
+DqGI5lzjreadvBKw0ZqXV3rdsOYXHQas4qn0j+vX4QRiohIX5CTYzii5tsYjoWLv8abWzeTX5Df
ttFBE83UNx3mhFOHMv+Or7XuOr3wZM4tnsYJ+dm9i6yIiEh76Y7h0ChCD82eeQ4Tr5jBtb9ezLW/
Xsypn5rMtb9ZzPW/+Uemf+4cTplxGgAnF4zkC2WXMa/0fBUbvVz7FQil71EOhMPndvY5tnSo4PDQ
ousXsv6Pr9DSFAwC3bFuKwDNjc288oeVfPa6K/ls2cV8tuxiRhQMiTJUCUlVVZd/NEgfoRwIh8/t
7HNs6dAlFdouqVx88cXejOH4xX/+gpdi67jgK5e2blv54JNMLhzLrf9wi9bSEBGRSCWP4Xjuuefg
GJdUVHDg3xgOgMbGRuZ88gK+9sdvk19YQHNjM/df9b958fHnKSrS7BMREfGDxnDkuKKiIr5+3SJW
Vz4PwJrfrmTRdQtUbIiISE5SweGxRV9dxMY/rqWxPsaGP65h0fULow5JRESkR1RweKyoqIhF1y3g
1mmL1bvRx5WXl0cdgkRMORAOn9vZ59jSoYLDc4uuX8jc8+eqd6OPu/HGG6MOQSKmHAiHz+3sc2zp
0KBR/JylIiIi4jPNUukBH2epiIiI5ALNUhERERFvqODIAcuXL486BImYckCUA+HwuZ19ji0dKjhy
QGVlZdQhSMSUA6IcCIfP7exzbOnQGA40hkNERKSn0h3DURBeSP6rqKjQLBUREZE0JM9SSYd6OFAP
h4iISE9ploqIiIh4QwVHDliwYEHUIUjElAOiHAiHz+3sc2zpUMGRA+bNmxd1CBIx5YAoB8Lhczv7
HFs6NIYDjeEQERHpKY3hEBEREW9oWmwSTYsVERFJT3enxaqHI8ldd93FihUrvCs2Vq5cGXUIbYK7
VgAADu5JREFUEjHlgCgHwuFzO/sW2/z581mxYgV33XVXWser4MgBy5YtizoEiZhyQJQD4fC5nX2O
LR0aNIr/g0br6+spLS2NOgyJkHJAlAPh8LmdfY1Ng0Z7ER8TTMKlHBDlQDh8bmefY0uHCg4RERHJ
OhUcIiIiknUqOHLAzTffHHUIEjHlgCgHwuFzO/scWzpUcOSAMWPGRB2CREw5IMqBcPjczj7Hlg7N
UsH/WSoiIiK+SneWilYaTaKVRkVERNLT3ZVG1cOBejhERER6Sutw9CLV1dVRhyARUw6IciAcPrez
z7GlQwVHDliyZEnUIUjElAOiHAiHz+3sc2zpUMGRA+65556oQ5CIKQdEORAOn9vZ59jSoYIjB+T6
VCg5fsoBUQ6Ew+d29jm2dKjgEBERkaxTwSEiIiJZp4IjByxdujTqECRiygFRDoTD53b2ObZ0qODI
AfX19VGHIBFTDohyIBw+t7PPsaVDC3+hhb9ERER6Sgt/iYiIiDdUcIiIiEjWqeDIATU1NVGHIBFT
DohyIBw+t7PPsaVDBUeSiooKysvLqaysjDqUFAsXLow6BImYckCUA+HwuZ19i62yspLy8nIqKirS
Ol6DRvF/0GhVVZWXcUl4lAOiHAiHz+3sa2waNNqL+JhgEi7lgCgHwuFzO/scWzpUcIiIiEjWqeAQ
ERGRrFPBkQPuvffeqEOQiCkHRDkQDp/b2efY0qGCIwdUVXU5Bkf6COWAKAfC4XM7+xxbOjRLBf9n
qYiIiPhKs1RERETEGyo4REREJOtUcIiIiEjWqeDIAeXl5VGHIBFTDohyIBw+t7PPsaVDBUcOuPHG
G6MOQSKmHBDlQDh8bmefY0uHZqmgWSoiIiI9pVkqIiIi4o2CqAPIFjPbDuwHHLDXOXdZtBGJiIj0
Xb25hyMOnO+cm5nrxcby5cujDkEiphwQ5UA4fG5nn2NLR28uOIxe8v6WLl0adQgSMeWAKAfC4XM7
+xxbOnrFF3IXHPCcma0ys2ujDuZ4DB8+POoQJGLKAVEOhMPndvY5tnR4UXCY2UVmtsLMdppZ3Mw6
TDY2sxvMbJuZHTazl81s9jFOO9c5Nwu4Evi+mU3LSvAiIiJyTF4UHEAZ8BqwmKBnIoWZXQ38FLgN
mAm8DjxmZsOSjllsZq+aWZWZFTvnPgBwzu0C/gJkZL5rZWXlcR3T032+ylbMmThvd8+R7vHKgVTZ
jPl4z+1rDhxtv3Igs+fu7vN37tyZsfP2pRxIhxcFh3PuUefcD51zDxOMvWivAvilc+5B51w18A2g
HliYdI6fJwaIng3km1l/gMR/LwU2ZiJWfdmkUsHR/WOUA+Gd29ccONp+5UBmz62Cwx/eT4s1s0Jg
FvBvR7Y555yZ/RU4v4unjQQeMjMH5AP/6Zxbe5SXKQHYtGnTMeM5cOAAVVVdrmtyzGN6sm/16tXH
fM2opNMeUZ23u+dI93jlQKps5UAmzu1rDhxtv3Igs+fu7vP37dunHOimpO/OkqMd591Ko2YWBz7v
nFuR+H00sJNgiuuqpOOWAhc757oqOrrzmtcCvz7e84iIiPRh1znnftPVTu97OELyGHAdsB1oiDYU
ERGRnFICjCX4Lu1SLhQcNUALwWWSZCOBXZl4AefcR0CXVZmIiIgc1YvHOsCLQaNH45xrAtYCrauF
mpklfj/mGxQREZHoedHDYWZlwHjaZqicbmZnEtwD5V3gTuB+M1sLrCaYtVIK3B9BuCIiItJNXgwa
NbOPAU/TcQ2OB5xzCxPHLAaWEFxKeQ24yTm3JtRARUREpEe8KDhERESkd/N+DIccm5n1M7PtZrYs
6lgkfIl/+9cSK+0+GXU8Ej4zG2tmT5nZRjN73cz6RR2ThMfMJiattP2qmdV3douQqHkxhkOO263A
S1EHIZGJE6xTczjqQCQy9wPfd869aGYnALGI45EQOec2E9z248iYyG3AE5EG1Qn1cOQ4MxsPTAIe
iToWiYyh/5f7LDObCjQ6514EcM7td87FIw5LolMOPOnjHyD6kMp9dwDfo/N70Ejf4IDnzGxVYtVc
6VsmAHWJO26vMbPvRR2QROpvgd9FHURnVHBExMwuSnxA7DSzeGfX28zsBjPbZmaHzexlM5vdbn85
8KZzbsuRTWHELpmRiRxImOucmwVcCXzfzKZlPXjJiAzlQAFwIcFNLS8APmlml7U/j/gpg58DmNkA
gnuM/SXbcfeECo7olBFM711Mx+nAmNnVwE+B2wiuzb0OPGZmw5IOOw+4xsy2EvR0fM3MfpDtwCVj
MpEDOOc+SPx3F8EHzdnZDVsyKBM5sBNY45x73znXSJADZ2U7cMmYjHwOJFwJPJ7IA/845/SI+EEw
6K+83baXgZ8l/W7Ae8CSLs5xPbAs6veiR7g5QLAAXv/Ez/2BNcCsqN+PHqHmQD7BasyDCP6IXAFc
HvX70SO8HEjatwK4Iur30dVDPRweMrNCYBbQOsXRBdn0V4LuMunlupEDI4GVZvYqwVL/9zvn1oYZ
q2RHujngnGsBvg88T/CX8mbnnJdd6tI93fkuMLOBwGyOcQO1KGlarJ+GEfzVsrvd9t0EM1I6cM49
kO2gJFRp5YBzbhvqPu+t0v4ccM49hsdfNNJj3cmBg8DokOLqEfVwiIiISNap4PBTDdBC0F2ebCSw
K/xwJALKAVEOSK/KARUcHnLONREMAmud2mZmlvj9xajikvAoB0Q5IL0tBzSGIyKJ5WfH07Z2xulm
diaw1zn3LnAncL+ZrQVWAxUEMxLujyBcyQLlgCgHpC/lgO4WGxEz+xjwNB3nXT/gnFuYOGYxsISg
++w14Cbn3JpQA5WsUQ6IckD6Ug6o4BAREZGs0xgOERERyToVHCIiIpJ1KjhEREQk61RwiIiISNap
4BAREZGsU8EhIiIiWaeCQ0RERLJOBYeIiIhknQoOERERyToVHCIiIpJ1KjhEpEtmdqqZxc1sRtSx
HGFmk8zsJTM7bGZVUceTKWb2tJndGXUcItmigkPEY2Z2f+ILf0m77VeaWTykMHy74dK/AIeACSTd
tjuZmd2XaLcWM2s0s61mttTMikONVERaqeAQ8ZsDDgO3mNmgTvaFwY59SDdPaFZ4HE8fB6x0zr3n
nNt3lOMeAUYBpwH/DPwDcPtxvO5xO873LZLTVHCI+O+vwC7g+10dYGa3mdmr7bb9k5ltS/r9PjN7
yMy+Z2a7zGyfmf3AzPLNbJmZfWRm75rZVzt5iSlm9kLiMsZ6M7u43WtNM7O/mFlt4twPmtnQpP1P
m9ndZnaXme0BHu3ifZiZ/TARR4OZvWpmn0raHwfOBm5L9F788CjtFnPO7XHO7XTOrQCeAD7Z7vVO
NrPfJdriIzNbbmantjtmoZltSMSz08z+PWnfKWb2cOJ9H0ica0TS/tsS72GRmW0lKB4xs9JEG9Um
zvmtTtpisZltTrT5LjP7/VHeq4j3VHCI+K+FoNi4ycxOPMpxnfV4tN92KTAauAioAP4X8GdgL3Au
8B/ALzt5nWXAT4CzgJeA/zGzwQCJnpcngbUExcCngBFA+y/IrwAx4ALgG128h39OxPUtYDrwGLDC
zMYl9o8C3gDuSLyPO7o4TwozmwbMBRqTthUkzn8gse8CoBZ4NLEPM/smcA9Bu5wBXAFsTuwzYAVw
AkF7fgI4Hfhtu5cfD3wB+BuC9iMR90XA54B5wMcJ2u5IbOcAPwN+AEwkaNPn0nmvIt5yzumhhx6e
PoD7gD8lfn4R+FXi5yuBlqTjbgOq2j33n4Ct7c61td0xm4Bnkn7PI/jS/dvE76cCceA7ScfkAzuO
bANuBR5pd96TE88bn/j9aWBNGu/3PeCWdttWAXcn/f4q8MM02q0p8V4OJ2JpAj6fdMx1wBvtnlcE
1AGfSIrnX7p4jU8SFDAnJm2bknitWUn/Lg3AkKRjyhLbvpC0bXDide9M/P43wD6gLOoc1EOPTD3U
wyGSO24BrjezScdxjo3tft8NrD/yi3MuDnxE0EOR7OWkY1qANQRfrgBnApcmLg/UmlktQSHjCMZb
HLH2aIGZ2QDgRILCKtkLSa/VHU8BMwh6bu4H7nPOLU/afyYwoV3cHwHFwDgzG56I56kuzj8ZeNc5
9/6RDc65TcD+dvG+45zbm/T7OKAQWJ30vH3Am0nHPAG8A2xLXHq51sz6pf/WRfxTEHUAIpIe59zz
ZvYY8GOCL9BkcToO7uxsgGJT+9N2sa07f4z0J7i0sKSTGD5I+rmuG+fMhDrn3DYAM1sEvG5mC5xz
9yX29yconK6lY9x7yNyg3G6/b+fcITM7m+BSyzyCmTm3m9k5zrmDGYpLJFTq4RDJLd8juO5/frvt
ewjGNySbmcHXPe/ID2aWD8wiGEsBUEUwvuEd59zWdo/D6b6Ac64WeJ9gPEWyuUmv1SPOOQf8G/Cv
SVNjqwim1u7pJO5a59whYDtdTL0l6MU5xcxOOrLBzKYSjOlo35OU7G2gGZiT9LzBBGM1kmOOO+ee
cs59l6A3ZizBGByRnKSCQySHOOc2AL8G/rHdrmeA4Wa2xMxON7MbgE9n8KVvMLPPJy7n/JzgS/VI
T8H/AYYAvzWzcxKv/ykz+6/EwMru+AnBFOC/NbOJZvZjgi/bn2XgPfyBYADujYnffw3UAA+b2YVm
NtbMPm5mP0saNHs78G0zu8nMxpvZ2WZ2I4Bz7q/ABuDXZjbTzM4FHgCeds6lzBhK5pyrA+4FfmJm
lyQGtN6XiA0AM7si8ZpnmtkY4HqCXpg3Oz2pSA5QwSGSe35I8P9ua5e/c64aWJx4vAacQ/DlfSzp
zGxxwHcTj9cIZnN87si4BOfcBwS9EHkEsz7WAXcC+xI9C129Tmf+PfHcOxLnmZd4rbePEfMxJcae
3APcbGb9Er0vFxMMgP0jQS/KrwjGcBxMPOdBgpkz3yQoLlYQzDo5opxgcOezwOPAFuCaNMK5GXg+
cb7HEz8nj3HZTzCz5clEXF8HrkmMERHJSdb2eSAiIiKSHerhEBERkaxTwSEiIiJZp4JDREREsk4F
h4iIiGSdCg4RERHJOhUcIiIiknUqOERERCTrVHCIiIhI1qngEBERkaxTwSEiIiJZp4JDREREsk4F
h4iIiGTd/wfgmZ6IypLZjQAAAABJRU5ErkJggg==
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The one differentiating aspect about the test below is that the column &lt;code&gt;species&lt;/code&gt; is of string type. The operation demonstrated is a &lt;code&gt;unique&lt;/code&gt; calculation. We observe that the &lt;code&gt;unique&lt;/code&gt; calculation is roughly an order of magnitude faster in pandas for sizes larger than 1K rows. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data.loc[:,&amp;#39;species&amp;#39;].unique()&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.unique(data_rec.species)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unique on Unfiltered String Column&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
3brxzDPPVKqvXbt2ZGRksHz5cgYMGEBSUhIdOnTg1VdfrXTs5s2bGTVqFMnJybRu3ZpHH30Ut9td
6bj58+dz6aWX0qpVKxITE+nYsSOPPPJIpWO/++47rrrqKlq2bElSUhKtW7dm/PjxYXmelFLKafr1
6kunS3rwq9enVfo565Jz6Nerb8TOXdNJo9rD4WP27Nm13vQpJyeHMb+8ip6X/YHrZz2EiGCMYduq
Txjzy6v4+P15pKamOq5uwNtbMm7cOM4880xmzJjBypUrefLJJzl69Cgvv/wyAM888wzdu3fnsssu
IzY2lvfff59p06ZhjOHmm2/2q+/bb79l7NixTJ06lRtuuIEXX3yRyZMn07dvX+/28Pv372fEiBG4
3W7uvfdekpOTee6550hMTKzUxpdffpnU1FTuuOMOUlJSWLhwIQ888AA5OTnMnDkTgJKSEkaPHk1J
SQm33347LVq0YN++fXzwwQccPXo05Oforrvu4rHHHqv186nCT2PiTBoX+02dNIU5o4fSd/xgYuJi
mffnV7nq/11PaXEpm+at5blPQ5vQWRvlu3L7bPxVLU04wuSRGX+l52V/oOt5Y7xlIkKX88ZgMDw6
83FmPPKQ4+r21aFDB9555x0Abr75ZlJTU/nXv/7FnXfeSffu3Vm6dCkJCQne46dNm8ZFF13EE088
4ZdwAGzfvp0vvviCQYMGATB27Fhat27NSy+95J1FPWPGDA4dOsTq1au9L9ZJkybRsWPHSm3LzMz0
O/dvfvMbmjRpwtNPP80jjzxCXFwcmzdvZteuXcybN48rrrjCe+z9999fo+dBL97mPBoTZ9K42C8+
Pp7Lrr2ClZlLGTxxFE3PSAdg7RvLmDphMvHx8Ta3sIIOqYTJwiXL6TLgwqC3dRkwhvc+Xc6L66jV
z3ufVl/3wiXLT7r9IsItt9ziV3bbbbdhjOHDDz8E8PuDf/z4cQ4dOsSwYcPYuXNnpSGLs88+25ts
gHXp986dO7Nz505v2UcffcR5553nlxk3a9aMCRMmVGqf77lzc3M5dOgQQ4YMIT8/n61btwKQlpYG
wMcff0xBQUGNnwPfx62cRWPiTBoXexW4i/g0/0uaXNWW1W99QVlJKSNvusjbuzF10hS7m+hHE44w
MMYQm9CoyomcIkJsQjK5RYa8Ymr0k1tkiEusvu6Y+GTCcU2cwJ6FDh064HK52LVrFwDLly/nggsu
ICUlhcaNG3Pqqady3333AVS6eE+wbz5NmjThyJEj3t93797NWWedVem4zp07VyrbvHkzV1xxBY0b
N+aUU07h1FNP5frrr/c7d7t27bjjjjt44YUXSE9PZ8yYMTz99NMcP368Bs+CUko5346SvbyZ+zE7
S34gNj6WfmOHsCpzKeDM3g3QhCMsRITSorwq/+gbYygpzCMlQWgUT41+UhKEksLq6y4tyovIqhXf
Onfu3MkFF1zA4cOHmT17Nh9++CELFizwThYKnLwZE1N5xnR5e2vq2LFjDBs2jI0bN/LII4/wwQcf
sGDBAu/cDd9zP/bYY2zYsIH77ruPwsJCbr/9drp3786PP/5Y4/MqpZTTFLgL+TTvSz7LX0mhKQYg
UeK5d/KdbJ6XRXF+kSN7N0DncPg50eXpqzNq+GC2rfqELj7zLMptXfUxl184hCknnlMT1LbR1dd9
/oghtas4wLfffkvbtm29v3/33Xe43W7atWvH+++/T3FxMe+//z6tWrXyHvP555/X+nxt27bl22+/
rVRePkRSbvHixRw5coT33nuPwYMHe8t37NgRtN5u3brRrVs37r33XlauXMmgQYN45plnePjhh0Nq
19atW+nSpUsNHomKNI2JM2lcoscYw46SH1hWmOVNNADOjG3F0KTeJLsSmTphMn/95f/jzpumR6V3
o6aXp9ceDh8ns7X5/X+8k/XvPcGWlR95v8UbY9iy8iO+fm82991zR63bFcm6yxlj+Oc//+lX9uST
TyIiXHTRRd4eC9/ehGPHjnlXsNTGxRdfzMqVK1m7dq237ODBg/znP//xOy4mJgZjjN+5i4uLefrp
p/2Oy8nJoayszK+sW7duuFwuv+W9J3L33XfX5GGoKNCYOJPGJTry3YV8mv8lCwr8ezUuSDqP0ckD
SXZZK/umTppCaXZh1Ho3arq1ufZwhElqaiofvz+PR2c+zmv3PEFMfDJlxfmMGj74pJetRrJuX99/
/z2XXXYZY8aMYcWKFbz++utcd911nHPOOSQkJBAXF8ell17KTTfdRE5ODi+88ALNmzfn559/rtX5
7r77bl599VUuvPBCfve735GcnMzzzz9Pu3bt2LBhg/e4QYMG0aRJEyZOnMjtt98OwGuvvVZpGGnh
woXceuutjB07lk6dOlFaWsorr7xCbGwsV111Vcjt+sc//lGrx6MiR2PiTBqXyDLG8F3JXpYXfuXX
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
QmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Operations-on-a-Filtered-Column"&gt;Operations on a Filtered Column&lt;a class="anchor-link" href="#Operations-on-a-Filtered-Column"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Below we perform the same tests as above, except that the column is not a full view, but is instead a filtered view. The filters are simple filters with an arithmetic bool comparison for the first two and a string comparison for the third below. &lt;/p&gt;
&lt;p&gt;Below, &lt;code&gt;mean&lt;/code&gt; is calculated for a filtered column &lt;code&gt;sepal_length&lt;/code&gt;. Here performance of &lt;code&gt;pandas&lt;/code&gt; is better for row sizes larger than 10K. In the &lt;code&gt;mean&lt;/code&gt; on unfiltered column shown above, &lt;code&gt;pandas&lt;/code&gt; performed better for 1MM or more. Just having selection operations has shifted performance chart in favor of &lt;code&gt;pandas&lt;/code&gt; for even smaller number of records.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data.loc[(data.sepal_width&amp;gt;3) &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;             (data.petal_length&amp;lt;1.5), &amp;#39;sepal_length&amp;#39;].mean()&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.mean(data_rec[(data_rec.sepal_width&amp;gt;3) &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;                 (data_rec.petal_length&amp;lt;1.5)].sepal_length)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mean on Filtered Column&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
Ae00egZC2WnUGFNj39Jrct9KKaVUZWinURtlZmZy7wMP02fQZQy47Br6DLqMex94mMzMzLDe98yZ
M3E4HGzfvp2xY8eSnJxMSkoKv/vd78jLy/Nt98orr3DppZfSrFkzXC4XXbp04YUXXiixvzZt2pCa
msrKlSvp27cvcXFxtGvXjtdff73Etlu3bmXYsGHEx8fTqlUrHnvsMTweT4ntFi1axKhRo2jZsiUu
l4v27dvz6KOPlth2586djB49mhYtWhAXF0erVq0YP358SF4npZRS1adnOEIkMzOTkT8fTberf8+N
c2YiIhhj2L56CSN/PprF7y8gKSkp7PYN+M6WjB07lvPOO49Zs2axatUqnn76aU6cOMGrr74KwAsv
vEDXrl25+uqriY6O5v3332fatGkYY7j11lsD9rdjxw7GjBnD1KlTuemmm/jHP/7B5MmT6d27t296
+EOHDvGzn/0Mj8fD/fffT3x8PC+++CIul6tEjK+++ipJSUncddddJCYmsnTpUh566CEyMzOZPXs2
AAUFBQwfPpyCggLuvPNOmjdvzoEDB/jggw84ceLEGb1GdpsxYwaPP/643WEoG2kOqEjPAS04QuTR
WU/Q7erf06nfSF+biNCx30gMhsdmP8msR2eG3b79tWvXjnfffReAW2+9laSkJP76179y991307Vr
V5YvX05sbKxv+2nTpnHFFVfw1FNPBRQcAN9++y1ffPEFAwYMAGDMmDG0atWKV155xdfTetasWRw7
dow1a9b4TsdNmjSJ9u3bl4gtLS0t4Ni/+tWvaNSoEc8//zyPPvooMTExbN26le+//54FCxbwi1/8
wrftgw8+eMavjd3CcX0XVbs0B1Sk54BeUgmRpctW0rHviFLv69h3JAs/Xsk/1lGtn4Ufl7/vpctW
nnH8IsJtt90W0HbHHXdgjOE///kPQMAH/qlTpzh27BhDhgxh165dJS5ZdO7c2VdsgLX0+wUXXMCu
Xbt8bR999BH9+vULuPbXpEkTbrjhhhLx+R/79OnTHDt2jEGDBpGdnU1GRgYAycnJACxevJicnJwq
vwbh7I477rA7BGUzzQEV6TmgZzj8VHeUijGG6NiEMjtyigjRsfGczqt6Z09jDDGu8vcd5YwPSUfS
4DML7dq1w+Fw8P333wOwcuVKHn74YVatWkV2dnZADCdPngy4ZFFaJd6oUSOOHz/uu71nzx769etX
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
AAAAAElFTkSuQmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;For vectorised &lt;code&gt;log&lt;/code&gt; operation on a unfiltered column shown above, &lt;code&gt;numpy&lt;/code&gt; performed better than &lt;code&gt;pandas&lt;/code&gt; for number of records less than 100K while the performance was comparable for the two for sizes larger than 100K. But the moment you introduce a filter on a column, &lt;code&gt;pandas&lt;/code&gt; starts to show an edge over &lt;code&gt;numpy&lt;/code&gt; for number of records larger than 10K.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.log(data.loc[(data.sepal_width&amp;gt;3) &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;            (data.petal_length&amp;lt;1.5), &amp;#39;sepal_length&amp;#39;])&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.log(data_rec[(data_rec.sepal_width&amp;gt;3) &amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;                 (data_rec.petal_length&amp;lt;1.5)].sepal_length)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vectorised log on Filtered Column&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
mtQM85gAAAAASUVORK5CYII=
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here is another example of a &lt;code&gt;mean&lt;/code&gt; reduction on a column but with a string filter. We see a similar behavior where &lt;code&gt;numpy&lt;/code&gt; performs significantly better at small sizes and &lt;code&gt;pandas&lt;/code&gt; takes a gentle lead for larger number of records.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[13]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data[data.species==&amp;#39;setosa&amp;#39;].sepal_length.mean()&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.mean(data_rec[data_rec.species==&amp;#39;setosa&amp;#39;].sepal_length)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mean on (String) Filtered Column&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
HH4pQy+9moHDL+XuP95PXl5eRNc9Z84cHA4H33zzDddffz1paWmkp6fz29/+lqKiIvd1L7zwApdc
cgnNmjUjMTGRHj168NRTT1Wqr127dmRmZrJ69WoGDRpEUlISHTt25OWXX6507datW7n44otJTk6m
devWPPTQQ5SVlVW67u2332bs2LG0atWKxMREOnXqxIMPPljp2u+++45rrrmGFi1akJSUROvWrRk/
fnxI3iellFLB0x6OEMnLy2PMT6+hz1W/Y9L8OYgIxhi+WfcBY356DUvfWUJqamrE1Q24e0uuv/56
2rdvz9y5c1m7di2PPvoox48f58UXXwTgqaeeomfPnlx11VXExsbyzjvvMHPmTIwx3HzzzV71bd++
neuuu47p06dz44038vzzzzN16lQGDBjg3h7+0KFDXHjhhZSVlXHPPfeQnJzMM888Q2JiYqU2vvji
i6SmpnL77bfToEEDPv74Y+677z7y8vKYN28eACUlJYwePZqSkhJuu+02mjdvzoEDB3j33Xc5fvz4
Gb1Hdrvzzjv561//anczlI00BlS0x4AmHCHy4Ny/0eeq39Ft8Bh3mYjQdfAYDIaH5v2duQ/Oibi6
PXXs2JE33ngDgJtvvpnU1FT++c9/cscdd9CzZ09WrFhBQkKC+/qZM2dyxRVX8PDDD3slHADffvst
K1euZOjQoQBcd911tG7dmhdeeME903ru3LkcPXqUzz//3N0dN2XKFDp16lSpbVlZWV73/tWvfkXj
xo158sknefDBB4mLi2Pr1q3s3r2bJUuW8LOf/cx97b333nvG743dIvF8F3V2aQyoaI8BHVIJkY+X
r6broMv9PtZ10BjeWraa5zcQ1Ndby6qv++Plq8+4/SLCLbfc4lU2a9YsjDH85z//AfD6wD958iRH
jx5l5MiR7Ny5s9KQRffu3d3JBlhHv3fp0oWdO3e6y95//30GDx7sNfbXtGlTJkyYUKl9nvc+deoU
R48eZfjw4eTn55OTkwNAWloaAEuXLqWgoKDW70EkmzVrlt1NUDbTGFDRHgPaw+Eh2FUqxhhiE1Kq
nMgpIsQmJHOqqPaTPY0xxCVWX3dMfHJIJpL69ix07NgRh8PB7t27AVi9ejX3338/a9euJT8/36sN
J06c8Bqy8JeJN27cmGPHjrm/37NnD4MHD650XZcuXSqVbd26lT/+8Y988sknnDx5stK9wZo7cvvt
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
gG2iIgAAAABJRU5ErkJggg==
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Vectorized-Operation-on-a-Column"&gt;Vectorized Operation on a Column&lt;a class="anchor-link" href="#Vectorized-Operation-on-a-Column"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In this last section, we do vectorised arithmetic using multiple columns. This involves creating a view and vectorised math on these views. Even when there is no filter, &lt;code&gt;pandas&lt;/code&gt; has a slight edge over &lt;code&gt;numpy&lt;/code&gt; for large number of records. For smaller than 100K records, &lt;code&gt;numpy&lt;/code&gt; performs significantly better.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[14]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data.petal_length * data.sepal_length + &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;      data.petal_width * data.sepal_width&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data_rec.petal_length*data_rec.sepal_length + &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;      data_rec.petal_width * data_rec.sepal_width&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vectorised Math on Unfiltered Columns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In the following figure, the filter involves vectorised arithmetic operation, and &lt;code&gt;mean&lt;/code&gt; reduction is computed on the filtered column. The presence of a filter makes &lt;code&gt;pandas&lt;/code&gt; significantly faster for sizes larger than 100K, while &lt;code&gt;numpy&lt;/code&gt; maitains a lead for smaller than 10K number of records. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[16]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bench&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data.loc[data.sepal_width * data.petal_length &amp;gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;             data.sepal_length, &amp;#39;sepal_length&amp;#39;].mean()&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_rec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;np.mean(data_rec[data_rec.sepal_width * data_rec.petal_length &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;                 &amp;gt; data_rec.sepal_length].sepal_length)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vectorised Math in Filtering Columns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
SUVORK5CYII=
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Conclusion"&gt;Conclusion&lt;a class="anchor-link" href="#Conclusion"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;code&gt;Pandas&lt;/code&gt; is often used in an interactive environment such as through Jupyter notebooks. In such a case, any performance loss from &lt;code&gt;pandas&lt;/code&gt; will be in significant. But if you have smaller &lt;code&gt;pandas&lt;/code&gt; dataframes (&amp;lt;50K number of records) in a production environment, then it is worth considering &lt;code&gt;numpy&lt;/code&gt; recarrays. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;numpy&lt;/code&gt; consumes (roughtly 1/3) less memory compared to &lt;code&gt;pandas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;numpy&lt;/code&gt; generally performs better than &lt;code&gt;pandas&lt;/code&gt; for 50K rows or less&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pandas&lt;/code&gt; generally performs better than &lt;code&gt;numpy&lt;/code&gt; for 500K rows or more&lt;/li&gt;
&lt;li&gt;for 50K to 500K rows, it is a toss up between &lt;code&gt;pandas&lt;/code&gt; and &lt;code&gt;numpy&lt;/code&gt; depending on the kind of operation&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Tue, 14 Mar 2017 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2017-03-14:blog/numpy-vs-pandas-comparison.html</guid><category>python</category><category>programming</category><category>development</category><category>pandas</category><category>numpy</category></item><item><title>Profiling Python Code in Jupyter Notebooks</title><link>http://gouthamanbalaraman.com/blog/profiling-python-jupyter-notebooks.html</link><description>&lt;p&gt;Sometimes you want to quickly identify performance bottlenecks in your code. You can use some of these recipes while
using the Jupyter notebook environment. Jupyter allows a few magic commands that are great for timing and profiling a line of
code or a block of code. Let us take a look at a really simple example with these functions:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;y1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;y2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;timeit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now to see which one of these is faster, you can use the &lt;tt class="docutils literal"&gt;%timeit&lt;/tt&gt; magic command:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;3 loops, best of 3: 14.1 µs per loop&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Here the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-n&lt;/span&gt; 3&lt;/tt&gt; denotes the number of loops to execute. The default is 100000 loops. Now let's say you have
both &lt;tt class="docutils literal"&gt;func&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;gunc&lt;/tt&gt; in a cell, and you want to measure the time taken, then you can use &lt;tt class="docutils literal"&gt;%%timeit&lt;/tt&gt; in the
block. Notice the double percentage sign:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;3 loops, best of 3: 18.2 µs per loop&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;time&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On some occasions, you can get the time taken using the &lt;tt class="docutils literal"&gt;%time&lt;/tt&gt; magic command for the line or &lt;tt class="docutils literal"&gt;%%time&lt;/tt&gt; for the cell block.:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Wall time: 10 ms&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;prun&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The above recipes are more of timing code than profiling code. There is a profiler magic command &lt;tt class="docutils literal"&gt;%prun&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;%%prun&lt;/tt&gt; that
does function level code profiling. For example&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;prun&lt;/span&gt; &lt;span class="n"&gt;hunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="literal-block"&gt;
7 function calls in 0.010 seconds

 Ordered by: internal time

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      1    0.009    0.009    0.009    0.009 &amp;lt;ipython-input-23-5c434cf7f3ad&amp;gt;:3(func)
      1    0.001    0.001    0.001    0.001 {built-in method numpy.core.multiarray.arange}
      1    0.000    0.000    0.010    0.010 &amp;lt;string&amp;gt;:1(&amp;lt;module&amp;gt;)
      1    0.000    0.000    0.010    0.010 {built-in method builtins.exec}
      1    0.000    0.000    0.000    0.000 &amp;lt;ipython-input-23-5c434cf7f3ad&amp;gt;:8(gunc)
      1    0.000    0.000    0.009    0.009 &amp;lt;ipython-input-23-5c434cf7f3ad&amp;gt;:12(hunc)
      1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;lprun&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lastly, you can install the &lt;tt class="docutils literal"&gt;line_profiler&lt;/tt&gt; if you want to dig a little deep to understand what line in the code is slow.
You can install as:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
pip install line_profiler
&lt;/pre&gt;
&lt;p&gt;This extension  be loaded as:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
%load_ext line_profiler
&lt;/pre&gt;
&lt;p&gt;Let's say we have a hunch that the &lt;tt class="docutils literal"&gt;func&lt;/tt&gt; call in &lt;tt class="docutils literal"&gt;hunc&lt;/tt&gt; is the bottleneck, but we are wondering which line in &lt;tt class="docutils literal"&gt;func&lt;/tt&gt; is
the culprit, then here is how &lt;tt class="docutils literal"&gt;%lprun&lt;/tt&gt; can help.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;lprun&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;hunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="literal-block"&gt;
Timer unit: 3.00459e-07 s

Total time: 0.00950652 s
File: &amp;lt;ipython-input-23-5c434cf7f3ad&amp;gt;
Function: func at line 3

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     3                                           def func(n, a):
     4         1         1288   1288.0      4.1      y = np.arange(n)
     5         1        30340  30340.0     95.9      y = np.exp(-y*a)
     6         1           12     12.0      0.0      return yTimer unit: 3.00459e-07 s
&lt;/pre&gt;
&lt;p&gt;If you need to profile some function in a python package, then import that function and stick it after &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-f&lt;/span&gt;&lt;/tt&gt; flag. Happy profiling!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 02 Mar 2017 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2017-03-02:blog/profiling-python-jupyter-notebooks.html</guid><category>Python</category><category>Jupyter</category><category>Programming</category></item><item><title>Introducting Introspection in QTK</title><link>http://gouthamanbalaraman.com/blog/introspection-in-qtk-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Last couple of months, I have been working on the infrastructure of &lt;code&gt;QTK&lt;/code&gt;. I annouced the first point release a couple of weeks back after I implemented the core internals. Recently, I implemented the workflow paradigm for &lt;code&gt;qtk&lt;/code&gt;. I will highlight some of the core concepts here. The &lt;code&gt;Template&lt;/code&gt; in &lt;code&gt;QTK&lt;/code&gt; is like a blueprint for what you want to accomplish. Let us see how to create a flat forward curve using some of the introspection concepts introduced in 0.1.3 onwards.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;qtk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Template&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The above statement is used to import the template. Now you can use the &lt;code&gt;tab&lt;/code&gt; functionality in ipython to get all the different types of templates. Now if you want to get the description of how to create this template, then all you do is execute that template as shown below. This is going to produce a rather nice output for you to view with the required variables and such.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TS_YIELD_FLAT&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[2]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_pyout"&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A template to create a flat forward yield curve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Required Fields&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Template&lt;/code&gt; [&lt;em&gt;Template&lt;/em&gt;]: 'TermStructure.Yield.FlatCurve'&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ForwardRate&lt;/code&gt; [&lt;em&gt;Float&lt;/em&gt;]: Forward rate from an yield curve in decimal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Currency&lt;/code&gt; [&lt;em&gt;String&lt;/em&gt;]: Currency&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Optional Fields&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ObjectId&lt;/code&gt; [&lt;em&gt;String&lt;/em&gt;]: A unique name or identifier to refer to this dictionary data&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AsOfDate&lt;/code&gt; [&lt;em&gt;Date&lt;/em&gt;]: As of date for the yield curve to create a curve fixed to a given reference date. Alternately, one can provide settlement days and settlement calendar to do relative to calculation date.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DiscountBasis&lt;/code&gt; [&lt;em&gt;DayCount&lt;/em&gt;]: Discount Basis&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SettlementDays&lt;/code&gt; [&lt;em&gt;Integer&lt;/em&gt;]: Settlement days, and is used if asof date is not provided.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SettlementCalendar&lt;/code&gt; [&lt;em&gt;Calendar&lt;/em&gt;]: Settlement Calendar&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Compounding&lt;/code&gt; [&lt;em&gt;Compounding&lt;/em&gt;]: Compounding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CompoundingFrequency&lt;/code&gt; [&lt;em&gt;Frequency&lt;/em&gt;]: Compounding Frequency&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Extrapolation&lt;/code&gt; [&lt;em&gt;Boolean&lt;/em&gt;]: Enable Extrapolation&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Or if you use a simple python console, then you can use the help to print the info in &lt;code&gt;Markdown&lt;/code&gt; format. If you just need the help string, then you can use the &lt;code&gt;info&lt;/code&gt; method.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TS_YIELD_FLAT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;**Description**

A template to create a flat forward yield curve.

**Required Fields**

 - &amp;#96;Template&amp;#96; [*Template*]: &amp;apos;TermStructure.Yield.FlatCurve&amp;apos;
 - &amp;#96;ForwardRate&amp;#96; [*Float*]: Forward rate from an yield curve in decimal
 - &amp;#96;Currency&amp;#96; [*String*]: Currency

**Optional Fields**

 - &amp;#96;ObjectId&amp;#96; [*String*]: A unique name or identifier to refer to this dictionary data
 - &amp;#96;AsOfDate&amp;#96; [*Date*]: As of date for the yield curve to create a curve fixed to a given reference date. Alternately, one can provide settlement days and settlement calendar to do relative to calculation date.
 - &amp;#96;DiscountBasis&amp;#96; [*DayCount*]: Discount Basis
 - &amp;#96;SettlementDays&amp;#96; [*Integer*]: Settlement days, and is used if asof date is not provided.
 - &amp;#96;SettlementCalendar&amp;#96; [*Calendar*]: Settlement Calendar
 - &amp;#96;Compounding&amp;#96; [*Compounding*]: Compounding
 - &amp;#96;CompoundingFrequency&amp;#96; [*Frequency*]: Compounding Frequency
 - &amp;#96;Extrapolation&amp;#96; [*Boolean*]: Enable Extrapolation

&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In order to create a yield curve, you can use the &lt;code&gt;sample_data&lt;/code&gt; method attached to the template to get a sample dictionary object. This is what it looks like.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TS_YIELD_FLAT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[4]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;{&amp;apos;AsOfDate&amp;apos;: &amp;apos;Optional (Date)&amp;apos;,
 &amp;apos;Compounding&amp;apos;: &amp;apos;Optional (Compounding)&amp;apos;,
 &amp;apos;CompoundingFrequency&amp;apos;: &amp;apos;Optional (Frequency)&amp;apos;,
 &amp;apos;Currency&amp;apos;: &amp;apos;Required (String)&amp;apos;,
 &amp;apos;DiscountBasis&amp;apos;: &amp;apos;Optional (DayCount)&amp;apos;,
 &amp;apos;Extrapolation&amp;apos;: &amp;apos;Optional (Boolean)&amp;apos;,
 &amp;apos;ForwardRate&amp;apos;: &amp;apos;Required (Float)&amp;apos;,
 &amp;apos;ObjectId&amp;apos;: &amp;apos;Optional (String)&amp;apos;,
 &amp;apos;SettlementCalendar&amp;apos;: &amp;apos;Optional (Calendar)&amp;apos;,
 &amp;apos;SettlementDays&amp;apos;: &amp;apos;Optional (Integer)&amp;apos;,
 &amp;apos;Template&amp;apos;: &amp;apos;TermStructure.Yield.FlatCurve&amp;apos;}&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;You can prune the optional fields to just pass the required items. It is worth pointing out that sometimes when one of two keywords need to be provided, both would be marked as optional. Looking at the documentation as listed by &lt;code&gt;info&lt;/code&gt; or &lt;code&gt;help&lt;/code&gt; methods will clarify the usage. For example, the fixed rate bond template &lt;code&gt;INSTRUMENT_BOND_TBOND&lt;/code&gt; has &lt;code&gt;Coupon&lt;/code&gt; and &lt;code&gt;ListOfCoupon&lt;/code&gt; both marked as optional fields. But this is because you can provide either one of the two as inputs, but atleast one of the two has to be provided. This is clarified in the documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;zero_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Template&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TS_YIELD_FLAT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ForwardRate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Currency&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;USD&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ObjectId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;FlatCurve.USD&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;zero_curve&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1/15/2016&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;FlatCurve.USD&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;referenceDate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[7]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;Date(20,1,2016)&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="n"&gt;time_grid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;zero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeroRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;time_grid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time_grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Zero Rate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[10]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.text.Text at 0x7f1f95768690&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 01 Sep 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-09-01:blog/introspection-in-qtk-python.html</guid><category>qtk</category><category>python</category><category>finance</category></item><item><title>Valuing Callable Bonds Using QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/callable-bond-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In this post, I will walk you through on how to value callable bonds in QuantLib Python. The approach to construct a callable bond is lot similar to &lt;a href="http://gouthamanbalaraman.com/blog/quantlib-bond-modeling.html"&gt;creating a fixed rate bond in QuantLib&lt;/a&gt;. The one additional input that we need to provide here is the details on the callable schedule. If you follow the fixed rate bond example already, this should be fairly straight forward.&lt;/p&gt;
&lt;p&gt;As always, we will start with some initializations and imports.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;For simplicity, I am going to assume that the interest rate term structure is a flat yield curve at 3.5%.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.035&lt;/span&gt;
&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                    &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                    &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The call and put schedules for the callable bond is created as shown below. I create a container for holding all the call and put dates using the &lt;code&gt;CallabilitySchedule&lt;/code&gt; class. You can add each call using &lt;code&gt;Callability&lt;/code&gt; class and noting as &lt;code&gt;Callability.Call&lt;/code&gt; or &lt;code&gt;Callability.Put&lt;/code&gt; for either a call or put.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;callability_schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilitySchedule&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;call_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;
&lt;span class="n"&gt;call_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;September&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;null_calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NullCalendar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;callability_price&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilityPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;call_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilityPrice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Clean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;callability_schedule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callability_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                           &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;call_date&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;call_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;null_calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;advance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;What follows next is very similar to the &lt;code&gt;Schedule&lt;/code&gt; that we created in the vanilla fixed rate bond valuation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;issue_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;September&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        
&lt;span class="n"&gt;maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;September&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GovernmentBond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quarterly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;accrual_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unadjusted&lt;/span&gt;

&lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accrual_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accrual_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Backward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The callable bond is instantiated using the &lt;code&gt;CallableFixedRateBond&lt;/code&gt; class, which accepts the bond inputs and the call / put schedule.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;face_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;accrual_daycount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;coupon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.025&lt;/span&gt;


&lt;span class="n"&gt;bond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallableFixedRateBond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;face_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;coupon&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;accrual_daycount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Following&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;face_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;callability_schedule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In order to value the bond, we need an interest rate model to model the fact that the bond will get called or not in the future depending on where the future interest rates are at. The &lt;code&gt;TreeCallableFixedRateBondEngine&lt;/code&gt; can be used to value the callable bond. Below, the &lt;code&gt;value_bond&lt;/code&gt; function prices the callable bond based on the Hull-White model parameter for mean reversion and volatility.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;value_bond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_points&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bond&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeCallableFixedRateBondEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_points&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bond&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The callable bond value for a 3% mean reversion and 12% volatility is shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;value_bond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bond price: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cleanPrice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Bond price:  68.3769646975
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The price sensitivity of callable bonds to that of volatility parameter is shown below. As volatility increases, there is a higher chance of it being callable. Hence the value of the bond decreases.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sigmas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value_bond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cleanPrice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
          &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sigmas&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sigmas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[9]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;[&amp;lt;matplotlib.lines.Line2D at 0x7fa0abbdbd90&amp;gt;]&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
NFuGFvhxEQAAAABJRU5ErkJggg==
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The static cashflows can be accessed using the &lt;code&gt;cashflows&lt;/code&gt; accessor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cashflows&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;     &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;December 15th, 2,014       0.618131868132
March 16th, 2,015       0.625
June 15th, 2,015       0.625
September 15th, 2,015       0.625
December 15th, 2,015       0.625
March 15th, 2,016       0.625
June 15th, 2,016       0.625
September 15th, 2,016       0.625
December 15th, 2,016       0.625
March 15th, 2,017       0.625
June 15th, 2,017       0.625
September 15th, 2,017       0.625
December 15th, 2,017       0.625
March 15th, 2,018       0.625
June 15th, 2,018       0.625
September 17th, 2,018       0.625
December 17th, 2,018       0.625
March 15th, 2,019       0.625
June 17th, 2,019       0.625
September 16th, 2,019       0.625
December 16th, 2,019       0.625
March 16th, 2,020       0.625
June 15th, 2,020       0.625
September 15th, 2,020       0.625
December 15th, 2,020       0.625
March 15th, 2,021       0.625
June 15th, 2,021       0.625
September 15th, 2,021       0.625
December 15th, 2,021       0.625
March 15th, 2,022       0.625
June 15th, 2,022       0.625
September 15th, 2,022       0.625
September 15th, 2,022       100.0
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h4 id="conclusion"&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Here we explored a minimal example on pricing a callable bond.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Tue, 30 Aug 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-08-30:blog/callable-bond-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Heston Model Calibration Using QuantLib Python and Scipy Optimize</title><link>http://gouthamanbalaraman.com/blog/heston-calibration-scipy-optimize-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I have discussed parameter calibration in a couple of my earlier posts. In this post I want to show how you can use QuantLib Python and Scipy to do parameter calibration. In order to run this, you will need to build the QuantLib github master and the latest SWIG code with &lt;a href="https://github.com/lballabio/QuantLib-SWIG/pull/26"&gt;my pull request&lt;/a&gt;. Alternately, this should get merged into version 1.9 and you should be able to use it when it is released. This pull request adds some of the moethods of the &lt;code&gt;CalibratedModel&lt;/code&gt; such as &lt;code&gt;calibrationError&lt;/code&gt; that we will use in calibrating models using Scipy. QuantLib&amp;#39;s strength is all financial models. Scipy&amp;#39;s strength is all the solvers and numerical methods. So here, I will show you how you can make the best of both worlds. We will start as usual by importing the modules.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sqrt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scipy.optimize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let&amp;#39;s construct some of the basic dependencies such as the yield and dividend term structures. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;659.37&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;

&lt;span class="n"&gt;risk_free_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;
&lt;span class="n"&gt;dividend_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
&lt;span class="n"&gt;yield_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_free_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;dividend_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Following is a sample grid of volatilities for different expiration and strikes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;expiration_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;strikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;527.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;560.46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;593.43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;626.40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;659.37&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;692.34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;725.31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;758.28&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.37819&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34177&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30394&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.27832&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.26453&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25916&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25941&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.26127&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.3445&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2933&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.27614&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.26575&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25729&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25228&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25202&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.37419&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35372&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33729&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32492&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31601&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30036&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.29568&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.37498&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35847&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34475&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33399&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32715&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31943&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31098&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30506&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35941&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34516&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33296&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32275&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31867&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30969&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30239&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.29631&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35521&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34242&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33154&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3219&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31948&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30424&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2984&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35442&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34267&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33288&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32374&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31474&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30838&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30283&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34286&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32507&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3246&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31745&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31135&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.306&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35338&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.343&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33464&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32614&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3263&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31961&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31371&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30852&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34312&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33526&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32698&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32766&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32132&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31558&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31052&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34322&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33574&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32765&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32873&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32267&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31705&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31209&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35246&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3433&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33617&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32822&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32965&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32383&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31831&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31344&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35226&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34336&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33651&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32869&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3304&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32477&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31934&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31453&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35207&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34342&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33681&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32911&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33106&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32561&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32025&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3155&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35171&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34327&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33679&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32931&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3319&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32665&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32139&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31675&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.343&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33658&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32937&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33276&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31802&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35086&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34274&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33637&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32943&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3336&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32872&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32368&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31927&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34252&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33618&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32948&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32959&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32465&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32034&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35016&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34231&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33602&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32953&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33498&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3304&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32554&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32132&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34986&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34213&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32957&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33556&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3311&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32631&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32217&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34959&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34196&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33573&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32961&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3361&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33176&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32704&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32296&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34934&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34181&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33561&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32964&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33658&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33235&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32368&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34912&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3355&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32967&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33701&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33288&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32827&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32432&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34891&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34154&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33539&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3297&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33742&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33337&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32881&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32492&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I have abstracted some of the repetitive methods into python functions. The function &lt;code&gt;setup_helpers&lt;/code&gt; will construct the Heston model helpers and returns an array of these objects. The &lt;code&gt;cost_function_generator&lt;/code&gt; is a method to set the cost function and will be used by the Scipy modules. The &lt;code&gt;calibration_report&lt;/code&gt; lets us evaluate the quality of the fit. The &lt;code&gt;setup_model&lt;/code&gt; method initializes the &lt;code&gt;HestonModel&lt;/code&gt; and the &lt;code&gt;AnalyticHestonEngine&lt;/code&gt; prior to calibration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ref_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;heston_helpers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;grid_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ref_date&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;vols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonModelHelper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vols&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;heston_helpers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;grid_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;heston_helpers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;helpers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;params_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrationError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;helpers&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cost_function&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helpers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detailed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;detailed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%25s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%20s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Strikes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Expiry&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Market Value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
             &lt;span class="s2"&gt;&amp;quot;Model Value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Relative Error (%)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;=&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helpers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marketValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;strike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;grid_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;detailed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%15.2f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%25s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%14.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%20.7f&lt;/span&gt;&lt;span class="s2"&gt; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marketValue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
                &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
                &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marketValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helpers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;detailed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
    &lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Average Abs Error (&lt;/span&gt;&lt;span class="si"&gt;%%&lt;/span&gt;&lt;span class="s2"&gt;) : &lt;/span&gt;&lt;span class="si"&gt;%5.9f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;
    
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;init_condition&lt;/span&gt;
    &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                           &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_spot&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; 
                           &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticHestonEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="comparing-different-calibration-methods"&gt;Comparing Different Calibration Methods&lt;/h3&gt;
&lt;p&gt;Solvers such as Levenberg-Marquardt find local minimas and are very sensitive to the initial conditions. Depending on the starting conditions for your solver, you could end up with a good set of parameters with good convergence or not so good set of parameters. We will look at two initial conditions for different solvers and see how the local minima solvers perform. We will compare this with differential evolution that looks for global minima. &lt;/p&gt;
&lt;p&gt;We will setup the Heston model with two different initial conditions:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- theta, kappa, sigma, rho, v0 = (0.02, 0.2, 0.5, 0.1, 0.01)
- theta, kappa, sigma, rho, v0 = (0.07, 0.5, 0.1, 0.1, 0.1)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h4 id="local-solvers"&gt;Local Solvers&lt;/h4&gt;
&lt;h5 id="using-quantlib-levenberg-marquardt-solver"&gt;Using QuantLib Levenberg-Marquardt Solver&lt;/h5&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;As a first step, let&amp;#39;s look at QuantLib&amp;#39;s Levenberg-Marquardt solver. The initial condition considered is &lt;code&gt;theta, kappa, sigma, rho, v0 = (0.02,0.2,0.5,0.1,0.01)&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;lm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;QL LM1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.125748, kappa = 7.915000, sigma = 1.887854, rho = -0.364942, v0 = 0.055397
Average Abs Error (%) : 3.015268051
CPU times: user 4.86 s, sys: 0 ns, total: 4.86 s
Wall time: 4.86 s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Methods like Levenberg-Marquardt solve for local minimas and do not search for global minimas. The solver is very sensitive to the initial conditions. Let&amp;#39;s set a different set of initial conditions, and see what happens below. The initial condition considered is &lt;code&gt;theta, kappa, sigma, rho, v0 = (0.07,0.5,0.1,0.1,0.1)&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;lm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;QL LM2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.084523, kappa = 0.000000, sigma = 0.132289, rho = -0.514278, v0 = 0.099928
Average Abs Error (%) : 11.007433024
CPU times: user 4.97 s, sys: 0 ns, total: 4.97 s
Wall time: 4.98 s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We see that the solver produces a 11% average of absolute error. This is not particularly great.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h5 id="using-scipy-levenberg-marquardt-solver"&gt;Using Scipy Levenberg-Marquardt Solver&lt;/h5&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here we are going to try the same exercise but using Scipy. Scipy has far more optimization, minimization and root finding algorithms that are very robust. So by leveraging Scipy, we can take advantage of this rich set of options at hand.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lm&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy LM1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.125747, kappa = 7.915687, sigma = 1.887934, rho = -0.364944, v0 = 0.055394
Average Abs Error (%) : 3.015252651
CPU times: user 4.68 s, sys: 12 ms, total: 4.69 s
Wall time: 4.65 s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The solution for this particular case seems to be fairly robust. Both solvers (QuantLib and Scipy) seem to have landed on more or less the same solution for this particular initial condition. Let&amp;#39;s see how Scipy does for the second initial condition considered above -  &lt;code&gt;theta, kappa, sigma, rho, v0 = (0.07,0.5,0.1,0.1,0.1)&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lm&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy LM2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.048184, kappa = -0.548903, sigma = 0.197958, rho = -0.999547, v0 = 0.090571
Average Abs Error (%) : 7.019499509
CPU times: user 20.7 s, sys: 56 ms, total: 20.7 s
Wall time: 20.5 s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;For this particular case, Scipy solver has performed significantly better. It would be inappropriate to make loud claims about Scipy&amp;#39;s superiority based on one observation. Perhaps this calls for a more detailed study for later.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h5 id="using-least-squares-method"&gt;Using Least Squares Method&lt;/h5&gt;
&lt;p&gt;If you want to use a simpler approach like least squares, you can do that with Scipy. Here is how you would use it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[13]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scipy.optimize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;least_squares&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[14]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[15]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;least_squares&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy LS1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.125747, kappa = 7.915814, sigma = 1.887949, rho = -0.364944, v0 = 0.055394
Average Abs Error (%) : 3.015251175
CPU times: user 4.54 s, sys: 8 ms, total: 4.55 s
Wall time: 4.55 s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;With the second initial condition:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[16]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[17]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;least_squares&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy LS2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 3.136774, kappa = 0.000005, sigma = -0.000245, rho = -0.000010, v0 = 1.597904
Average Abs Error (%) : 5.096414042
CPU times: user 28.1 s, sys: 16 ms, total: 28.2 s
Wall time: 28.1 s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h4 id="global-solvers"&gt;Global Solvers&lt;/h4&gt;
&lt;h5 id="using-differential-evolution"&gt;Using Differential Evolution&lt;/h5&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The above methods are more suited to finding local minimas. One method that makes an attempt at searching for global minima is the differential evolution. Both QuantLib and Scipy have implementations of this method. Scipy however has a lot more bells and whistles to tune and calibrate the methodology. Let&amp;#39;s take a look at the Scipy&amp;#39;s &lt;code&gt;differential_evolution&lt;/code&gt; methodology.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[18]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scipy.optimize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;differential_evolution&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[19]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;bounds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[20]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;differential_evolution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxiter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy DE1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.123221, kappa = 5.012199, sigma = 0.950309, rho = -0.570340, v0 = 0.078440
Average Abs Error (%) : 2.859113482
CPU times: user 1min 39s, sys: 144 ms, total: 1min 39s
Wall time: 1min 39s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In the above example, I am setting the variable &lt;code&gt;maxiter&lt;/code&gt; in order to limit the time taken. In production scenarios, you may want to try a larger number or not provide any value and default to 1000. This can help search a larger area of the parameter space.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[21]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;bounds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[22]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;differential_evolution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxiter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy DE2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.122251, kappa = 4.996804, sigma = 0.849266, rho = -0.637706, v0 = 0.079484
Average Abs Error (%) : 2.876087363
CPU times: user 1min 57s, sys: 200 ms, total: 1min 57s
Wall time: 1min 57s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h5 id="basin-hopping-algorithm"&gt;Basin Hopping Algorithm&lt;/h5&gt;
&lt;p&gt;Here we will use the Basin Hopping (annealing like) method to solve for the parameters. A couple things to make note here. The Basin Hopping method works best when used wiht a minimizer. Here I played with various minimizers and finally decided to use something that supports bounds checking. Without bounds checking, I often ended with &lt;code&gt;nan&lt;/code&gt; and did not have a meaningful solution in the end. &lt;/p&gt;
&lt;p&gt;I have chosen bounds based on a very basic reasoning. One needs careful reasoning to use appropriate bounds for the problem at hand.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[23]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scipy.optimize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;basinhopping&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[24]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyBounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xmax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xmin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
         &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x_new&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
         &lt;span class="n"&gt;tmax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
         &lt;span class="n"&gt;tmin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tmax&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;tmin&lt;/span&gt;
&lt;span class="n"&gt;bounds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[25]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[26]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;mybound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyBounds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;minimizer_kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;method&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;L-BFGS-B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bounds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bounds&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;basinhopping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;niter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;minimizer_kwargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;minimizer_kwargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;stepsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;accept_test&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mybound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy BH1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.123455, kappa = 5.074067, sigma = 0.995095, rho = -0.562106, v0 = 0.079009
Average Abs Error (%) : 2.850972273
CPU times: user 2min 15s, sys: 456 ms, total: 2min 16s
Wall time: 2min 14s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[27]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;init_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;heston_helpers5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;engine5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;initial_condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[28]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;mybound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyBounds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;minimizer_kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;method&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;L-BFGS-B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bounds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;cost_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_function_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heston_helpers5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;basinhopping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;niter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;minimizer_kwargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;minimizer_kwargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;stepsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;accept_test&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mybound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grid_data5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scipy BH2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.123403, kappa = 4.791319, sigma = 0.904397, rho = -0.593711, v0 = 0.079215
Average Abs Error (%) : 2.863355647
CPU times: user 1min 50s, sys: 332 ms, total: 1min 50s
Wall time: 1min 49s
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h4 id="summary"&gt;Summary&lt;/h4&gt;
&lt;p&gt;Here is a summary of all the results with the calibration error overall, and the respective parameters. All the local minima methods give parameters that are very different based on the initial condition that we start with. This is different in contrary with the global minimization methods that all end up in more or less the same proximity of each other.&lt;/p&gt;
&lt;p&gt;The global solvers such as Differential Evolution and Basin Hopping are capable of finding the global minima and it is sometimes a question of computation resources. Here, I have lower &amp;quot;iterations&amp;quot; set for these routines for faster solving. Even with such a short threshold, we get fairly good solution set. I think it is premature to compare the effectiveness of different global solvers just based on the results here. The &lt;a href="http://docs.scipy.org/doc/scipy/reference/optimize.html"&gt;scipy optimize&lt;/a&gt; package has detailed documentation with various tuning parameters. I haven&amp;#39;t exploited the nuances much, and is left as an exercise for the reader.&lt;/p&gt;
&lt;p&gt;Hope you find this useful!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[29]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DataFrame&lt;/span&gt;
&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Avg Abs Error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Theta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Kappa&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sigma&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Rho&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;V0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[29]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_pyout"&gt;
&lt;div style="max-width:1500px;overflow:auto;"&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Avg Abs Error&lt;/th&gt;
      &lt;th&gt;Theta&lt;/th&gt;
      &lt;th&gt;Kappa&lt;/th&gt;
      &lt;th&gt;Sigma&lt;/th&gt;
      &lt;th&gt;Rho&lt;/th&gt;
      &lt;th&gt;V0&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;QL LM1&lt;/td&gt;
      &lt;td&gt;3.015268&lt;/td&gt;
      &lt;td&gt;0.125748&lt;/td&gt;
      &lt;td&gt;7.915000e+00&lt;/td&gt;
      &lt;td&gt;1.887854&lt;/td&gt;
      &lt;td&gt;-0.364942&lt;/td&gt;
      &lt;td&gt;0.055397&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;QL LM2&lt;/td&gt;
      &lt;td&gt;11.007433&lt;/td&gt;
      &lt;td&gt;0.084523&lt;/td&gt;
      &lt;td&gt;1.625740e-08&lt;/td&gt;
      &lt;td&gt;0.132289&lt;/td&gt;
      &lt;td&gt;-0.514278&lt;/td&gt;
      &lt;td&gt;0.099928&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy LM1&lt;/td&gt;
      &lt;td&gt;3.015253&lt;/td&gt;
      &lt;td&gt;0.125747&lt;/td&gt;
      &lt;td&gt;7.915687e+00&lt;/td&gt;
      &lt;td&gt;1.887934&lt;/td&gt;
      &lt;td&gt;-0.364944&lt;/td&gt;
      &lt;td&gt;0.055394&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy LM2&lt;/td&gt;
      &lt;td&gt;7.019500&lt;/td&gt;
      &lt;td&gt;0.048184&lt;/td&gt;
      &lt;td&gt;-5.489029e-01&lt;/td&gt;
      &lt;td&gt;0.197958&lt;/td&gt;
      &lt;td&gt;-0.999547&lt;/td&gt;
      &lt;td&gt;0.090571&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy LS1&lt;/td&gt;
      &lt;td&gt;3.015251&lt;/td&gt;
      &lt;td&gt;0.125747&lt;/td&gt;
      &lt;td&gt;7.915814e+00&lt;/td&gt;
      &lt;td&gt;1.887949&lt;/td&gt;
      &lt;td&gt;-0.364944&lt;/td&gt;
      &lt;td&gt;0.055394&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy LS2&lt;/td&gt;
      &lt;td&gt;5.096414&lt;/td&gt;
      &lt;td&gt;3.136774&lt;/td&gt;
      &lt;td&gt;4.896844e-06&lt;/td&gt;
      &lt;td&gt;-0.000245&lt;/td&gt;
      &lt;td&gt;-0.000010&lt;/td&gt;
      &lt;td&gt;1.597904&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy DE1&lt;/td&gt;
      &lt;td&gt;2.859113&lt;/td&gt;
      &lt;td&gt;0.123221&lt;/td&gt;
      &lt;td&gt;5.012199e+00&lt;/td&gt;
      &lt;td&gt;0.950309&lt;/td&gt;
      &lt;td&gt;-0.570340&lt;/td&gt;
      &lt;td&gt;0.078440&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy DE2&lt;/td&gt;
      &lt;td&gt;2.876087&lt;/td&gt;
      &lt;td&gt;0.122251&lt;/td&gt;
      &lt;td&gt;4.996804e+00&lt;/td&gt;
      &lt;td&gt;0.849266&lt;/td&gt;
      &lt;td&gt;-0.637706&lt;/td&gt;
      &lt;td&gt;0.079484&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy BH1&lt;/td&gt;
      &lt;td&gt;2.850972&lt;/td&gt;
      &lt;td&gt;0.123455&lt;/td&gt;
      &lt;td&gt;5.074067e+00&lt;/td&gt;
      &lt;td&gt;0.995095&lt;/td&gt;
      &lt;td&gt;-0.562106&lt;/td&gt;
      &lt;td&gt;0.079009&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;td&gt;Scipy BH2&lt;/td&gt;
      &lt;td&gt;2.863356&lt;/td&gt;
      &lt;td&gt;0.123403&lt;/td&gt;
      &lt;td&gt;4.791319e+00&lt;/td&gt;
      &lt;td&gt;0.904397&lt;/td&gt;
      &lt;td&gt;-0.593711&lt;/td&gt;
      &lt;td&gt;0.079215&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Sun, 31 Jul 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-07-31:blog/heston-calibration-scipy-optimize-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category><category>scipy</category></item><item><title>Valuing Bonds with Credit Spreads in QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/bonds-with-spreads-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In an earlier example on &lt;a href="http://gouthamanbalaraman.com/blog/quantlib-bond-modeling.html"&gt;pricing fixed rate bonds&lt;/a&gt; I demonstrated how to construct and value bonds using the given yield curve. In this example, let us take a look at valuing bonds with credit spreads. We will show how to add credit spreads to the give yield curve using different approaches. &lt;/p&gt;
&lt;p&gt;As usual, let us start by importing the QuantLib library and pick a valuation date and set the calculation instance evaluation date.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;For simplicity, let us imagine that the treasury yield curve is flat. This makes it easier to construct the yield curve easily. This also allows us to directly shock the yield curve, and provides a validation for the more general treatment of shocks on yield curve.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;flat_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rate_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flat_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ts_yield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rate_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_yield&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now let us construct the bond itself. We do that by first constructing the schedule, and then passing the schedule into the bond.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;issue_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bussiness_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unadjusted&lt;/span&gt;
&lt;span class="n"&gt;date_generation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Backward&lt;/span&gt;
&lt;span class="n"&gt;month_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="n"&gt;tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="n"&gt;date_generation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="n"&gt;month_end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;coupon_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;03&lt;/span&gt;
&lt;span class="n"&gt;coupons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;coupon_rate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Now lets construct the FixedRateBond&lt;/span&gt;
&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;face_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FixedRateBond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;face_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;coupons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now that we have the &lt;code&gt;fixed_rate_bond&lt;/code&gt; object, we can create a &lt;code&gt;DiscountingBondEngine&lt;/code&gt; and value the bond.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bond_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiscountingBondEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[5]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;114.18461651948999&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;So far, we have valued the bond under the treasury yield curve and have not incorporated the credit spreads. Let us assume that the market prices this bond with a &lt;code&gt;50BP&lt;/code&gt; spread on top of the treasury yield curve. Now we can, in this case, directly shock the &lt;code&gt;flat_rate&lt;/code&gt; used in the yield term structure. Let us see what the value is:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;flat_rate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0065&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;111.5097766266561&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Above we shocked the &lt;code&gt;flat_rate&lt;/code&gt; and since the yield term structure is an &lt;code&gt;Observer&lt;/code&gt; observing the &lt;code&gt;Observable&lt;/code&gt; &lt;code&gt;flat_rate&lt;/code&gt;, we could just shock the rate, and QuantLib behind the scenes recalculates all the &lt;code&gt;Observer&lt;/code&gt;s. Though, this approach is not always viable, in cases such as a bootstrapped bond curve. So let us look at two different approaches that can be used. Before we do that, we need to reset the &lt;code&gt;flat_rate&lt;/code&gt; back to what it was.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;flat_rate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[7]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;114.18461651948999&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h4 id="parallel-shift-of-the-yield-curve"&gt;Parallel Shift of the Yield Curve&lt;/h4&gt;
&lt;p&gt;The whole yield curve can be shifted up and down, and the bond revalued with the help of the &lt;code&gt;ZeroSpreadedTermStructure&lt;/code&gt;. The constructor takes the yield curve and the spread as argument.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spread1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0050&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spread_handle1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spread1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts_spreaded1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZeroSpreadedTermStructure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spread_handle1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts_spreaded_handle1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_spreaded1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bond_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiscountingBondEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_spreaded_handle1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Finally the price&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[8]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;111.50977662665609&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Once we have constructed the spreaded term structure, it is rather easy to value for other spreads. All we need to do is change the &lt;code&gt;SimpleQuote&lt;/code&gt; object &lt;code&gt;spread1&lt;/code&gt; here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spread1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[9]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;108.89999943320038&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h4 id="non-parallel-shift-of-the-yield-curve"&gt;Non-Parallel Shift of the Yield Curve&lt;/h4&gt;
&lt;p&gt;The above method allows only for parallel shift of the yield curve. The &lt;code&gt;SpreadedLinearZeroInterpolatedTermStructure&lt;/code&gt; class allows for non parallel shock. First, let us mimic a parallel shift using this class. For the constructor, we need to pass the yield term structure that we wish to shift, and the a list of spreads and a list of the corresponding dates.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spread21&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0050&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spread22&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0050&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;start_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;
&lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;advance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ts_spreaded2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SpreadedLinearZeroInterpolatedTermStructure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ts_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spread21&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spread22&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts_spreaded_handle2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_spreaded2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bond_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiscountingBondEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_spreaded_handle2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Finally the price&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[10]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;111.50977662665609&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here, once again we can change the value of &lt;code&gt;spread2&lt;/code&gt; to value for other shocks.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spread21&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spread22&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[11]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;108.89999943320038&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We can easily do non-parallel shifts just by shocking one end. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spread21&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spread22&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[12]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;111.25358792334083&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;SpreadedLinearZeroInterpolatedTermStructure&lt;/code&gt; is a very powerful class and can be used to implement key-rate duration calculations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Tue, 26 Jul 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-07-26:blog/bonds-with-spreads-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Announcing qtk for QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/announcing-qtk-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I have blogged about using QuantLib Python in this tutorial series. Learning QuantLib Python involves a knowledge of the various syntax and paying a lot of attention to detail such as the various conventions. I have started to work on the package &lt;code&gt;qtk&lt;/code&gt; that adds a layer on top of QuantLib python by making it data driven. What do I mean by that?&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;qtk&lt;/code&gt; package relies on data in the form of Python &lt;code&gt;dict&lt;/code&gt; and then uses this data to form QuantLib objects behind the scenes. Lets take a look at a small example that replicates my example on &lt;a href="http://gouthamanbalaraman.com/blog/quantlib-bond-modeling.html"&gt;bond modeling in QuantLib Python&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;qtk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Template&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;Template&lt;/code&gt; class directly maps to the different kinds of QuantLib objects that are supported. For instance the &lt;code&gt;Template.TS_YIELD_ZERO&lt;/code&gt; corresponds to the zero yield term structure. The &lt;code&gt;Field&lt;/code&gt; class has all the properties that are needed by the various &lt;code&gt;Template&lt;/code&gt;s. The &lt;code&gt;Controller&lt;/code&gt; class is what does all the processing to create QuantLib objects behind the scenes. Let us look at a minimal example below, and then explain the different features in detail.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LIST_OF_DATES&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1/15/2015&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;7/15/2015&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1/15/2016&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LIST_OF_ZERO_RATES&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.007&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DISCOUNT_BASIS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;30/360&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DISCOUNT_CALENDAR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;UnitedStates&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COMPOUNDING&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Compounded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COMPOUNDING_FREQ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Annual&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CURRENCY&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;USD&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TEMPLATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TS_YIELD_ZERO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OBJECT_ID&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;USD.Zero.Curve&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OBJECT_ID&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;BondEngine&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DISCOUNT_CURVE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;gt;USD.Zero.Curve&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TEMPLATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ENG_BOND_DISCOUNTING&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ASOF_DATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2016-01-15&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COUPON&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COUPON_FREQ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Semiannual&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CURRENCY&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;USD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PAYMENT_BASIS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;30/360&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ISSUE_DATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2015-01-15&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MATURITY_DATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2016-01-15&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACCRUAL_CALENDAR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;UnitedStates&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACCRUAL_DAY_CONVENTION&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Unadjusted&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DATE_GENERATION&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Backward&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;END_OF_MONTH&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OBJECT_ID&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;USD.TBond&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PRICING_ENGINE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;gt;BondEngine&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TEMPLATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INST_BOND_TBOND&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;asof_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1/15/2015&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;asof_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tbond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;USD.TBond&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;tbond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;105.276539925
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now let us disect the code above to understand the specifics. The &lt;code&gt;Controller&lt;/code&gt; class takes a &lt;code&gt;list&lt;/code&gt; of &lt;code&gt;dict&lt;/code&gt; as input, provided here by the variable &lt;code&gt;data&lt;/code&gt;. In the above example, we have used qtk mnemonics such as &lt;code&gt;Field.TEMPLATE.id&lt;/code&gt; instead of directly using the text &amp;quot;Template&amp;quot;. The content of data is as shown below:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[3]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;[{&amp;apos;Compounding&amp;apos;: &amp;apos;Compounded&amp;apos;,
  &amp;apos;CompoundingFrequency&amp;apos;: &amp;apos;Annual&amp;apos;,
  &amp;apos;Currency&amp;apos;: &amp;apos;USD&amp;apos;,
  &amp;apos;DiscountBasis&amp;apos;: &amp;apos;30/360&amp;apos;,
  &amp;apos;DiscountCalendar&amp;apos;: &amp;apos;UnitedStates&amp;apos;,
  &amp;apos;ListOfDate&amp;apos;: [&amp;apos;1/15/2015&amp;apos;, &amp;apos;7/15/2015&amp;apos;, &amp;apos;1/15/2016&amp;apos;],
  &amp;apos;ListOfZeroRate&amp;apos;: [0.0, 0.005, 0.007],
  &amp;apos;ObjectId&amp;apos;: &amp;apos;USD.Zero.Curve&amp;apos;,
  &amp;apos;Template&amp;apos;: &amp;apos;TermStructure.Yield.ZeroCurve&amp;apos;},
 {&amp;apos;DiscountCurve&amp;apos;: &amp;apos;-&amp;gt;USD.Zero.Curve&amp;apos;,
  &amp;apos;ObjectId&amp;apos;: &amp;apos;BondEngine&amp;apos;,
  &amp;apos;Template&amp;apos;: &amp;apos;Engine.Bond.Discounting&amp;apos;},
 {&amp;apos;AccrualCalendar&amp;apos;: &amp;apos;UnitedStates&amp;apos;,
  &amp;apos;AccrualDayConvention&amp;apos;: &amp;apos;Unadjusted&amp;apos;,
  &amp;apos;AsOfDate&amp;apos;: &amp;apos;2016-01-15&amp;apos;,
  &amp;apos;Coupon&amp;apos;: 0.06,
  &amp;apos;CouponFrequency&amp;apos;: &amp;apos;Semiannual&amp;apos;,
  &amp;apos;Currency&amp;apos;: &amp;apos;USD&amp;apos;,
  &amp;apos;DateGeneration&amp;apos;: &amp;apos;Backward&amp;apos;,
  &amp;apos;EndOfMonth&amp;apos;: False,
  &amp;apos;IssueDate&amp;apos;: &amp;apos;2015-01-15&amp;apos;,
  &amp;apos;MaturityDate&amp;apos;: &amp;apos;2016-01-15&amp;apos;,
  &amp;apos;ObjectId&amp;apos;: &amp;apos;USD.TBond&amp;apos;,
  &amp;apos;PaymentBasis&amp;apos;: &amp;apos;30/360&amp;apos;,
  &amp;apos;PricingEngine&amp;apos;: &amp;apos;-&amp;gt;BondEngine&amp;apos;,
  &amp;apos;Template&amp;apos;: &amp;apos;Instrument.Bond.TreasuryBond&amp;apos;}]&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Every &lt;code&gt;dict&lt;/code&gt; corresponds to an object, with the key value pairs being the attributes required in the creation of that object. The value of the key &lt;code&gt;Template&lt;/code&gt; denotes what object is created. So for instance, in the above example the value &lt;code&gt;Engine.Bond.Discounting&lt;/code&gt; denotes 
the &lt;code&gt;DiscountingBondEngine&lt;/code&gt;. In the above data, every dict has a key &lt;code&gt;ObjectId&lt;/code&gt; which is a unique name required for every object. Objects can be cross referenced by using the special prefix &amp;quot;-&amp;gt;&amp;quot; along with the &lt;code&gt;ObjectId&lt;/code&gt;. You can see this usage in the last &lt;code&gt;dict&lt;/code&gt; where the &lt;code&gt;PricingEngine&lt;/code&gt; references the &lt;code&gt;BondEngine&lt;/code&gt; object, and the &lt;code&gt;BondEngine&lt;/code&gt; object references the &lt;code&gt;USD.Zero.Curve&lt;/code&gt; yield term structure.&lt;/p&gt;
&lt;p&gt;Once the data is prepared, the API call to process is extremely simple because &lt;code&gt;qtk&lt;/code&gt; does the major brunt of interfacing with QuantLib.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;asof_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1/15/2015&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;asof_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tbond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;USD.TBond&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;tbond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;105.276539925
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;Controller&lt;/code&gt; accepts the &lt;code&gt;data&lt;/code&gt; and the &lt;code&gt;process&lt;/code&gt; method processes as of the calculation date. Once processed, the QuantLib objects can be accessed and queried for output.&lt;/p&gt;
&lt;p&gt;This project is alpha and has a few templates written as of now. Would love to hear your thoughts. Checkout the &lt;a href="https://github.com/gouthambs/qtk-python"&gt;qtk project page&lt;/a&gt; to get involved.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Wed, 20 Jul 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-07-20:blog/announcing-qtk-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category><category>qtk</category></item><item><title>QuantLib Python Notebooks On Docker</title><link>http://gouthamanbalaraman.com/blog/quantlib-python-notebook-docker.html</link><description>&lt;p&gt;The typical way to get QuantLib python running in your computer
is by compiling QuantLib and the SWIG bindings in your computer.
I have heard from some of my blog readers that they run into issues
with getting QuantLib-Python running in their system. Here I will show
how you can easily get started on QuantLib-Python using Docker.&lt;/p&gt;
&lt;h2&gt;Docker&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.docker.com/what-docker"&gt;Docker&lt;/a&gt; is a platform for containerization of software. 
In other words, Docker lets one to wrap an application in a complete ecosystem needed to run
the application (aka image), such as system libraries and filesystem. This means that irrespective of
what operating system your computer runs, a Docker image will run reliably on the Docker containers. 
Docker containers are very lightweight, and it starts up in a matter of couple of seconds.&lt;/p&gt;
&lt;h2&gt;Docker and QuantLib&lt;/h2&gt;
&lt;p&gt;Every now and then, I would run into conflicts between the development version of QuantLib and 
the release version.  So in order to not have such conflicts, Docker containers are a perfect 
solution. Every image is isolated and it is easy to load a specific version and not have any 
conflicts. In order to keep my Docker images minimal, I use Alpine Linux as a base instead of Ubuntu.&lt;/p&gt;
&lt;h3&gt;Getting Up and Running&lt;/h3&gt;
&lt;p&gt;In order to get started on using Docker, you need to first install Docker. The first step
is to get Docker itself. You can get the Docker client by going to 
&lt;a href="https://www.docker.com/products/docker"&gt;getting started page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you have done the installation, you can get quantlib-python by doing the following
on a shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;docker pull gbalaraman/quantlib-notebook
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is going to pull the quantlib-notebook image from Docker Hub. This process takes a few 
seconds. Think of this as the same as downloading an installer for a software.&lt;/p&gt;
&lt;p&gt;Once you have the image downloaded, you can run quantlib-python notebooks by doing the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;docker run -d -p 8888:8888 --mount src=&amp;lt;your notebook folder&amp;gt;,target=/home/notebooks,type=bind --name ql_notebook gbalaraman/quantlib-notebook
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you are using latest docker images published by Luigi, you should mount to &lt;code&gt;/notebooks&lt;/code&gt;
folder on the container. So in all it would look like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;docker run -d -p 8888:8888 --mount src=&amp;lt;your notebook folder&amp;gt;,target=/notebooks,type=bind --name ql_notebook2 lballabio/quantlib-notebook
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Those using older docker versions, you had to do this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;docker run -d -p 8888:8888 -v &amp;lt;your notebook folder&amp;gt;:/home/notebooks/ --name ql_notebook gbalaraman/quantlib-notebook
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above command runs the image "gbalaraman/quantlib-notebook" as a daemon (-d) and
will forward the port 8888 in the container to the port 8888 in localhost (-p 8888:8888).
We are calling the container where this image runs as ql_notebook (--name ql_notebook). 
In "-v &lt;your notebook folder&gt;:/home/notebooks/", you should put the folder in you machine
where you want the notebooks to be stored. This takes care of mapping your local folder
to the volume in the container where the notebook will run from.
You can visit &lt;a href="http://localhost:8888"&gt;http://localhost:8888&lt;/a&gt; to access the QuntLib python 
notebook environment to play with. This image also has a few other packages included in it, 
such as numpy, pandas, scipy, matplolib and seaborn. This is most of
all you would need to run the notebooks that I publish as part of my QuantLib python tutorial
series. &lt;/p&gt;
&lt;p&gt;When you are done you can stop the Docker container by using the command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;docker stop ql_notebook
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is equivalent to shutting down the notebook. If you want to start docker again,
this time around you can start it by saying:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;docker start ql_notebook
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Give this a try and drop a word about your experience with it. You can also take a look at
&lt;a href="http://www.implementingquantlib.com/"&gt;Luigi Ballabio's&lt;/a&gt; presentation on 
&lt;a href="https://www.youtube.com/watch?v=LZbsxs_VGtQ"&gt;QuantLib using Docker&lt;/a&gt; for another take on 
this subject.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Sat, 02 Jul 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-07-02:blog/quantlib-python-notebook-docker.html</guid><category>python</category><category>finance</category><category>programming</category><category>quantlib</category></item><item><title>Valuing Interest Rate Caps and Floors Using QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/interest-rate-cap-floor-valuation-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In this post, I will walk you through a simple example of valuing caps. I want to talk about two specific cases: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Value caps given a constant volatility&lt;/li&gt;
&lt;li&gt;Value caps given a cap volatility surface&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Caps, as you might know, can be valued as a sum of caplets. The value of each caplet is determined by the Black formula. In practice, each caplet would have a different volatility. Meaning, a caplet that is in the near term can have a different volotility profile compared to the caplet that is far away in tenor. Similarly caplet volatilities differ with the strike as well.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="constant-volatility"&gt;Constant Volatility&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let us start by constructing different componets required in valuing the caps. The components that we would need are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;interest rate term structure for discounting &lt;/li&gt;
&lt;li&gt;interest rate term structure for the floating leg&lt;/li&gt;
&lt;li&gt;construction of the cap&lt;/li&gt;
&lt;li&gt;the pricing engine to value caps using the Black formula&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For simplicity, we will construct only one interest rate term structure here, and assume that the discounting and the floating leg is referenced by the same. Below the term structure of interest rates is constructed from a set of zero rates.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
         &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2031&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2036&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2046&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;yields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.006616&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.007049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.007795&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="mf"&gt;0.009599&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.011203&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.015068&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.017583&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="mf"&gt;0.018998&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.020080&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;interpolation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;compounding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;
&lt;span class="n"&gt;compounding_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Annual&lt;/span&gt;

&lt;span class="n"&gt;term_structure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZeroCurve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                       &lt;span class="n"&gt;interpolation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compounding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compounding_frequency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ts_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;As a next step, lets construct the cap itself. In order to do that, we start by constructing the &lt;code&gt;Schedule&lt;/code&gt; object to project the cashflow dates. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;period&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;buss_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;
&lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Forward&lt;/span&gt;
&lt;span class="n"&gt;end_of_month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buss_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buss_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                       &lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_of_month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now that we have the schedule, we construct the &lt;code&gt;USDLibor&lt;/code&gt; index. Below, you can see that I use &lt;code&gt;addFixing&lt;/code&gt; method to provide a fixing date for June 10, 2016. According the schedule constructed, the start date of the cap is June 14, 2016, and there is a 2 bussiness day settlement lag (meaning June 10 reference date) embedded in the &lt;code&gt;USDLibor&lt;/code&gt; definition. So in order to set the rate for the accrual period, the rate is obtained from the fixing data provided. For all future dates, the libor rates are automatically inferred using the forward rates provided by the given interest rate term structure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ibor_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USDLibor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ts_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ibor_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addFixing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;0.0065560&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ibor_leg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IborLeg&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ibor_index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now that we have all the required pieces, the &lt;code&gt;Cap&lt;/code&gt; can be constructed by passing the &lt;code&gt;ibor_leg&lt;/code&gt; and the &lt;code&gt;strike&lt;/code&gt; information. Constructing a floot is done through the &lt;code&gt;Floor&lt;/code&gt; class. The &lt;code&gt;BlackCapFloorEngine&lt;/code&gt; can be used to price the cap with constant volatility as shown below. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;strike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;
&lt;span class="n"&gt;cap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ibor_leg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;vols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.547295&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackCapFloorEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;54369.8580629
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="using-volatility-surfaces"&gt;Using Volatility Surfaces&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In the above exercise, we used a constant volatility value. In practice, one needs to strip the market quoted capfloor volatilities to infer the volatility of each and every caplet. &lt;code&gt;QuantLib&lt;/code&gt; provides excellent tools in order to do that. Let us assume the following dummy data represents the volatility surface quoted by the market. I have the various &lt;code&gt;strikes&lt;/code&gt;, &lt;code&gt;expiries&lt;/code&gt;, and the volatility quotes in percentage format. I take the raw data and create a &lt;code&gt;Matrix&lt;/code&gt; in order to construct the volatility surface.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;strikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;expiries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;vols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Matrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expiries&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mf"&gt;47.27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;55.47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;64.07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;70.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;72.13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;69.41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;72.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;67.28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;66.08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;68.64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;65.83&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;46.65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;54.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;61.47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;65.53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;66.28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;62.83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;64.42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;60.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;58.71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;60.35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;55.91&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;46.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;52.65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;59.32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;62.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;62.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;58.09&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;59.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;55.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;53.59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;54.74&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;49.54&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
   &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vols&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vols&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
        &lt;span class="n"&gt;vols&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;CapFloorTermVolSurface&lt;/code&gt; offers a way to store the capfloor volatilities. These are however &lt;code&gt;CapFloor&lt;/code&gt; volatilities, and not the volatilities of the individual options.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bdc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;
&lt;span class="n"&gt;daycount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;capfloor_vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CapFloorTermVolSurface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bdc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expiries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daycount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;OptionletStripper1&lt;/code&gt; class lets you to strip the individual caplet/floorlet volatilities from the capfloor volatilities. We have to &amp;#39;jump&amp;#39; some hoops here to make it useful for pricing. The &lt;code&gt;OptionletStripper1&lt;/code&gt; class does not allow you to be consumed directly by a pricing engine. The &lt;code&gt;StrippedOptionletAdapter&lt;/code&gt; takes the stripped optionlet volatilities, and creates a term structure of optionlet volatilities. We then wrap that into a handle using &lt;code&gt;OptionletVolatilityStructureHandle&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;optionlet_surf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OptionletStripper1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capfloor_vol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ibor_index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ovs_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OptionletVolatilityStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrippedOptionletAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optionlet_surf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Below, we visulaize the capfloor volatility surface, and the optionlet volatility suface for a fixed strike.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;tenors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;strike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.015&lt;/span&gt;
&lt;span class="n"&gt;capfloor_vols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;capfloor_vol&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tenors&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;opionlet_vols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ovs_handle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tenors&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tenors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capfloor_vols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CapFloor Vols&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tenors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opionlet_vols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Optionlet Vols&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bbox_to_anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[11]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.legend.Legend at 0x894efd0&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
AAAAAElFTkSuQmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;BlackCapFloorEngine&lt;/code&gt; can accept the optionlet volatility surface in order to price the caps or floors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;engine2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackCapFloorEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ovs_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;54384.928315
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;QuantLib&lt;/code&gt; C++ class allow for one to view the projected cashflows in terms of individual caplets. I just realized that the python extension does not have this feature added to it. Will give a PR one of these days and update this post. &lt;/p&gt;
&lt;p&gt;Hope you find this useful.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 23 Jun 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-06-23:blog/interest-rate-cap-floor-valuation-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>QuantLib Python Cookbook Announcement</title><link>http://gouthamanbalaraman.com/blog/quantlib-python-cookbook-announcement.html</link><description>&lt;p&gt;&lt;a href="https://leanpub.com/quantlibpythoncookbook"&gt;
    &lt;div class="center_img"&gt;
        &lt;img alt="QuantLib Python Cookbook" 
             src="https://s3.amazonaws.com/titlepages.leanpub.com/quantlibpythoncookbook/hero?1465967986" 
             title= "QuantLib Python Cookbook"&gt;
    &lt;/div&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hello everybody! &lt;a href="http://www.implementingquantlib.com/"&gt;Luigi Ballabio&lt;/a&gt; and I have published "QuantLib Python Cookbook" 
on &lt;a href="https://leanpub.com/quantlibpythoncookbook"&gt;Leanpub&lt;/a&gt;. This book is a collection of 
&lt;a href="https://www.youtube.com/playlist?list=PLu_PrO8j6XAvOAlZND9WUPwTHY_GYhJVr"&gt;Luigi's youtube videos&lt;/a&gt; and 
my blog posts &lt;a href="http://gouthamanbalaraman.com/blog/quantlib-python-tutorials-with-examples.html"&gt;tutorials on QuantLib python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This book gives an introduction to various QuantLib concepts such as interest rate curve construction, calibration and
simulation of interest and equity models, and finally valuation of bonds and equities. This book is meant to be a resource for the 
QuantLib community at large.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Wed, 15 Jun 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-06-15:blog/quantlib-python-cookbook-announcement.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Modeling Volatility Smile and Heston Model Calibration Using QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/volatility-smile-heston-model-calibration-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;European options on an equity underlying such as an index (S&amp;amp;P 500) or a stock (AMZN) trade for different combinations of strikes and maturities. It turns out that the Black-Scholes implied volatility for these options with different maturities and strikes is not the same. The fact that the implied volatility varies with strike is often referred in the market as having a &lt;em&gt;smile&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;First let us define some of the basic data conventions such as the day_count, calendar etc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;659.37&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;

&lt;span class="n"&gt;dividend_yield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;risk_free_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;
&lt;span class="n"&gt;dividend_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
&lt;span class="n"&gt;flat_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_free_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;dividend_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Following is a sample matrix of volatility quote by exipiry and strike. The volatilities are log-normal volatilities and can be interpolated to construct the implied volatility surface.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;expiration_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;strikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;527.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;560.46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;593.43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;626.40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;659.37&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;692.34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;725.31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;758.28&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.37819&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34177&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30394&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.27832&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.26453&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25916&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25941&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.26127&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.3445&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2933&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.27614&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.26575&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25729&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25228&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25202&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.37419&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35372&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33729&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32492&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31601&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30036&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.29568&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.37498&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35847&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34475&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33399&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32715&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31943&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31098&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30506&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35941&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34516&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33296&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32275&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31867&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30969&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30239&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.29631&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35521&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34242&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33154&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3219&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31948&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30424&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2984&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35442&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34267&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33288&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32374&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31474&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30838&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30283&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34286&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32507&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3246&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31745&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31135&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.306&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35338&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.343&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33464&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32614&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3263&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31961&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31371&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30852&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34312&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33526&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32698&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32766&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32132&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31558&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31052&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34322&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33574&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32765&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32873&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32267&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31705&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31209&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35246&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3433&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33617&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32822&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32965&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32383&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31831&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31344&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35226&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34336&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33651&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32869&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3304&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32477&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31934&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31453&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35207&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34342&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33681&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32911&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33106&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32561&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32025&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3155&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35171&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34327&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33679&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32931&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3319&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32665&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32139&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31675&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.343&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33658&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32937&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33276&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31802&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35086&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34274&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33637&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32943&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3336&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32872&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32368&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.31927&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34252&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33618&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32948&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32959&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32465&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32034&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.35016&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34231&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33602&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32953&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33498&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3304&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32554&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32132&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34986&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34213&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32957&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33556&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3311&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32631&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32217&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34959&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34196&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33573&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32961&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3361&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33176&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32704&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32296&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34934&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34181&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33561&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32964&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33658&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33235&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32368&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34912&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3355&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32967&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33701&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33288&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32827&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32432&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.34891&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34154&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33539&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3297&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33742&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.33337&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32881&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.32492&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="implied-volatility-surface"&gt;Implied Volatility Surface&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Each row in &lt;code&gt;data&lt;/code&gt; is a different exipiration time, and each column corresponds to various strikes as given in &lt;code&gt;strikes&lt;/code&gt;. We load all this data into the &lt;code&gt;QuantLib&lt;/code&gt; &lt;code&gt;Matrix&lt;/code&gt; object. This can then be used seamlessly in the various surface construction routines. The variable &lt;code&gt;implied_vols&lt;/code&gt; holds the above data in a &lt;code&gt;Matrix&lt;/code&gt; format. One unusual bit of info that one needs to pay attention to is the ordering of the rows and columns in the &lt;code&gt;Matrix&lt;/code&gt; object. The implied volatilities in the &lt;code&gt;QuantLib&lt;/code&gt; context needs to have strikes along the row dimension and expiries in the column dimension. This is transpose of the way the data was constructed above. All of this detail is taken care by swapping the &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;j&lt;/code&gt; variables below. Pay attention to the line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;implied_vols[i][j] = data[j][i]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;in the cell below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;implied_vols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Matrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;implied_vols&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;implied_vols&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
        &lt;span class="n"&gt;implied_vols&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now the Black volatility surface can be constructed using the &lt;code&gt;BlackVarianceSurface&lt;/code&gt; method.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;black_var_surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackVarianceSurface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;implied_vols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The volatilities for any given strike and expiry pair can be easily obtained using &lt;code&gt;black_var_surface&lt;/code&gt; shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;strike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;600.0&lt;/span&gt;
&lt;span class="n"&gt;expiry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt; &lt;span class="c1"&gt;# years&lt;/span&gt;
&lt;span class="n"&gt;black_var_surface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blackVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expiry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;0.3352982638587421&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="visualization"&gt;Visualization&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;mpl_toolkits.mplot3d&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Axes3D&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Given an expiry, we can visualize the volatility as a function of the strike.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;strikes_grid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;expiry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="c1"&gt;# years&lt;/span&gt;
&lt;span class="n"&gt;implied_vols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;black_var_surface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blackVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expiry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;strikes_grid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# can interpolate here&lt;/span&gt;
&lt;span class="n"&gt;actual_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# cherry picked the data for given expiry&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikes_grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;implied_vols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Black Surface&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actual_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;o&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Actual&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Strikes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vols&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;upper right&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The whole volatility surface can also be visualised as shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plot_years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plot_strikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;535&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meshgrid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plot_strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plot_years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;black_var_surface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blackVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
              &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yr&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
                  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;yr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
             &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="n"&gt;surf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot_surface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rstride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cstride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coolwarm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorbar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shrink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aspect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[10]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.colorbar.Colorbar instance at 0x0963C7D8&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
vAkQfkNBZ0yFuptDSVf4/7UsC0VReOedd7j66qt56qmnDjr4wp45+S1btjBgwIA2z0kmk4W0xoQJ
EzBNk927dx/0awYEQJCC6DV0JHV75JFHAC/98cwzz7QxFeoNUjfYe7rivvvuY+PGjYV0hS/jGz9+
PJMnT2br1q3k83keeughBg8efEhrOO2009iwYQObN2+mX79+LFiwgOeff77Nc+rq6qiqqkIQBFat
WoXruofNuD3gy0OwA+4l7E3qdv311x81pkKCINC/f3++973v8dxzzxV8c2tqarjooov47W9/y/33
3091dTUnnXQSV1xxBXPnzuXuu+8+pNeVZZnHH3+c8ePHM2LECC699FKGDx/OvHnzmDdvHgAvvvgi
J598MqeeeiozZ87khRde6Iq3HPBlx3XdfX0F9BC2b9/uDho0qPD98uXL3W9/+9ttnrNp0yb3pJNO
cl3XdefMmePOmTOn8Nj48ePdFStWHJnFdiE7duxwhw8f7n700UduLpdzFy5c6E6fPt21bbvwHMdx
unGFAUXsL54EX+2+gh1wL2FvUreuNhXqaVRXV7Nu3TpOOeUUFEVh4sSJPPHEE22KiT19Zx8QsDeC
ANyL8KVuI0eOZO3atdx5553cdtttnHLKKYwcOZJly5bx0EMPAW2lbhMmTDhgqdsnn3xS6PYaNWoU
6XSaRx99tNuc3YBum94cEHC4CWRoAXvFcRz69+/PqlWreOyxx3qNs1tAtxHcinSS4FMSsFfeeust
hgwZwsCBA1m4cCFTpkwBPD3yq6++CvRcuVtAQG8gCMABe+WFF17g8ssvB9ins1uxZranyt0CAnoi
QQAO6BDDMHj99df5zne+s8djvd3ZLSCgpxAE4IAOWbx4MaNHjy54TPim8sBR5ewWENCdBAE4oEOe
f/75QvoBPFlbT3R225+PL8BNN93E0KFDGTlyJGvWrDliawsI2C/7EQoHfAnJZrNueXm529LSUvhZ
Q0ODe84557hDhw51x40b5zY2NhYeu+eee9zjjz/e/cpXvuLW1NQcsXValuUef/zx7qZNm1zDMNyR
I0e669evb/OcN954w50wYYLruq67YsUKd8yYMUdsfV9Cur2xobd9BTK0gG7hk08+4bLLLit8/9ln
n/GjH/2IxsbGA7bXTCaTzJ49m5qaGoDCFJI77rijcNxrr72Ws846i0svvRRoO6cvoMsJkv+dJEhB
BHQLX/nKV1izZg1r1qzhgw8+QFEU/vVf/xVBELj55psLj/nBd/369SxYsID169dTU1PD9ddfz5Yt
W/bw8W2vwOjI63fr1q1H5k0GBOyHIAAHdDvFemP/1qw9HemN/+///u+Ajt/+eIFKI6CnEATggG6n
WG8sCAKPPfYYI0eOZPr06YWW5470xsB+fXwDlUZAT2Z/OeCAgMOKIAhhoBYY4bruLkEQqoBdrQ//
GOjruu50QRAeA1a4rvub1t97AqgB5gLnANuAVcDlruv+tej45wM3uK57viAIpwMPu677hVFyQEA3
EhiyB3Q3E4APXNfdBeC67k7/gdYg+3rrt7XAwKLfGwBsAW4AlgAS8CvXdf8qCML3W481z3XdRYIg
nC8IwkYgB0w93G8oIOBACXbAAd2KIAgvAItd13269fu+rutub/3//wd8zXXdKwRBGAE8B3wd6A+8
BQxxgz/ggF5MsAMO6DYEQYgDY4Gri348VxCEU/EkkJsAfze7XhCE/wHWAxZwfRB8A3o7wQ44ICAg
oJsIVBABAQEB3UQQgAMCAgK6if8P098E7FtyaO4AAAAASUVORK5CYII=
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;One can also construct a local volatility surface (&lt;em&gt;a la&lt;/em&gt; Dupire) using the &lt;code&gt;LocalVolSurface&lt;/code&gt;. There are some issues with this as shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;local_vol_surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocalVolSurface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackVolTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;black_var_surface&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
    &lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plot_years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plot_strikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;535&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meshgrid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plot_strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plot_years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;local_vol_surface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
              &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yr&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
                  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;yr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
             &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="n"&gt;surf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot_surface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rstride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cstride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coolwarm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorbar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shrink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aspect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[12]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.colorbar.Colorbar instance at 0x091720F8&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
edtQAAAAAElFTkSuQmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The correct pricing of local volatility surface requires an arbitrage free implied volatility surface. If the input implied volatility surface is not arbitrage free, this can lead to negative transition probabilities and/or negative local volatilities and can give rise to mispricing. Refer to Fengler&amp;#39;s arbtirage free smoothing [1] which QuantLib currently lacks.&lt;/p&gt;
&lt;p&gt;When you use an arbitrary smoothing, you will notice that the local volatility surface leads to undesired negative volatilities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[13]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;black_var_surface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setInterpolation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bicubic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;local_vol_surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocalVolSurface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackVolTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;black_var_surface&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
    &lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plot_years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plot_strikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;535&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meshgrid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plot_strikes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plot_years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;local_vol_surface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
              &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yr&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
                  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;yr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
             &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="n"&gt;surf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot_surface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rstride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cstride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coolwarm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorbar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shrink&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aspect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_pyerr"&gt;
&lt;pre class="ipynb"&gt;&lt;div class="output_subarea output_text output_pyerr"&gt;
&lt;pre&gt;
&lt;span class="ansired"&gt;---------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="ansired"&gt;RuntimeError&lt;/span&gt;                              Traceback (most recent call last)
&lt;span class="ansigreen"&gt;&amp;lt;ipython-input-13-51cf0ac8418d&amp;gt;&lt;/span&gt; in &lt;span class="ansicyan"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;&lt;span class="ansiblue"&gt;()&lt;/span&gt;
&lt;span class="ansigreen"&gt;     12&lt;/span&gt; Z = np.array([local_vol_surface.localVol(y, x) 
&lt;span class="ansigreen"&gt;     13&lt;/span&gt;               &lt;span class="ansigreen"&gt;for&lt;/span&gt; xr&lt;span class="ansiyellow"&gt;,&lt;/span&gt; yr &lt;span class="ansigreen"&gt;in&lt;/span&gt; zip&lt;span class="ansiyellow"&gt;(&lt;/span&gt;X&lt;span class="ansiyellow"&gt;,&lt;/span&gt; Y&lt;span class="ansiyellow"&gt;)&lt;/span&gt;&lt;span class="ansiyellow"&gt;&lt;/span&gt;
&lt;span class="ansigreen"&gt;---&amp;gt; 14&lt;/span&gt;&lt;span class="ansiyellow"&gt;                   for x, y in zip(xr,yr) ]
&lt;/span&gt;&lt;span class="ansigreen"&gt;     15&lt;/span&gt;              ).reshape(len(X), len(X[0]))
&lt;span class="ansigreen"&gt;     16&lt;/span&gt; &lt;span class="ansiyellow"&gt;&lt;/span&gt;

&lt;span class="ansigreen"&gt;C:\Users\gbalaram\Documents\Code\env\Lib\site-packages\QuantLib\QuantLib.pyc&lt;/span&gt; in &lt;span class="ansicyan"&gt;localVol&lt;/span&gt;&lt;span class="ansiblue"&gt;(self, *args)&lt;/span&gt;
&lt;span class="ansigreen"&gt;   7467&lt;/span&gt; &lt;span class="ansiyellow"&gt;&lt;/span&gt;
&lt;span class="ansigreen"&gt;   7468&lt;/span&gt;     &lt;span class="ansigreen"&gt;def&lt;/span&gt; localVol&lt;span class="ansiyellow"&gt;(&lt;/span&gt;self&lt;span class="ansiyellow"&gt;,&lt;/span&gt; &lt;span class="ansiyellow"&gt;*&lt;/span&gt;args&lt;span class="ansiyellow"&gt;)&lt;/span&gt;&lt;span class="ansiyellow"&gt;:&lt;/span&gt;&lt;span class="ansiyellow"&gt;&lt;/span&gt;
&lt;span class="ansigreen"&gt;-&amp;gt; 7469&lt;/span&gt;&lt;span class="ansiyellow"&gt;         &lt;/span&gt;&lt;span class="ansigreen"&gt;return&lt;/span&gt; _QuantLib&lt;span class="ansiyellow"&gt;.&lt;/span&gt;LocalVolTermStructure_localVol&lt;span class="ansiyellow"&gt;(&lt;/span&gt;self&lt;span class="ansiyellow"&gt;,&lt;/span&gt; &lt;span class="ansiyellow"&gt;*&lt;/span&gt;args&lt;span class="ansiyellow"&gt;)&lt;/span&gt;&lt;span class="ansiyellow"&gt;&lt;/span&gt;
&lt;span class="ansigreen"&gt;   7470&lt;/span&gt; &lt;span class="ansiyellow"&gt;&lt;/span&gt;
&lt;span class="ansigreen"&gt;   7471&lt;/span&gt;     &lt;span class="ansigreen"&gt;def&lt;/span&gt; enableExtrapolation&lt;span class="ansiyellow"&gt;(&lt;/span&gt;self&lt;span class="ansiyellow"&gt;)&lt;/span&gt;&lt;span class="ansiyellow"&gt;:&lt;/span&gt;&lt;span class="ansiyellow"&gt;&lt;/span&gt;

&lt;span class="ansired"&gt;RuntimeError&lt;/span&gt;: negative local vol^2 at strike 655 and time 0.75; the black vol surface is not smooth enough&lt;/pre&gt;
&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
TkSuQmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="heston-model-calibration"&gt;Heston Model Calibration&lt;/h2&gt;
&lt;p&gt;Heston model is defined by the following stochastic differential equations. &lt;/p&gt;
&lt;p&gt;\begin{eqnarray}
        dS(t, S)  &amp;amp;=&amp;amp; \mu S dt + \sqrt{v} S dW_1 \\
        dv(t, S)  &amp;amp;=&amp;amp; \kappa (\theta - v) dt + \sigma \sqrt{v} dW_2 \\
        dW_1 dW_2 &amp;amp;=&amp;amp; \rho dt
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;Here the asset is modeled as a stochastic process that depends on volatility $v$ which is a mean reverting stochastic process with a constant volatility of volatility $\sigma$. The two stochastic processes have a correlation $\rho$.&lt;/p&gt;
&lt;p&gt;Let us look at how we can calibrate the Heston model to some market quotes. As an example, let&amp;#39;s say we are interested in trading options with 1 year maturity. So we will calibrate the Heston model to fit to market volatility quotes with one year maturity. Before we do that, we need to construct the pricing engine that the calibration routines would need. In order to do that, we start by constructing the Heston model with some dummy starting parameters as shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[14]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# dummy parameters&lt;/span&gt;
&lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                           &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; 
                           &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticHestonEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="c1"&gt;# engine = ql.FdHestonVanillaEngine(model)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now that we have the Heston model and a pricing engine, let us pick the quotes with all strikes and 1 year maturity in order to calibrate the Heston model. We build the Heston model helper which will be fed into the calibration routines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[15]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;heston_helpers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;black_var_surface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setInterpolation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bicubic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;one_year_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="c1"&gt;# 12th row in data is for 1 year expiry&lt;/span&gt;
&lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;expiration_dates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;one_year_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;one_year_idx&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="c1"&gt;#sigma = black_var_surface.blackVol(t/365.25, s)&lt;/span&gt;
    &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonModelHelper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                  &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                                  &lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                  &lt;span class="n"&gt;dividend_ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;heston_helpers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[16]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;lm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[17]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;theta = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, kappa = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;, v0 = &lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;theta = 0.135147, kappa = 1.878471, sigma = 0.002035, rho = -1.000000, v0 = 0.043485
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let us look at the quality of calibration by pricing the options used in the calibration using the model and lets get an estimate of the relative error.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[18]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%20s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Strikes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Market Value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
     &lt;span class="s2"&gt;&amp;quot;Model Value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Relative Error (%)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;=&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marketValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%15.2f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%14.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%20.7f&lt;/span&gt;&lt;span class="s2"&gt; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marketValue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
        &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
        &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marketValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_helpers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Average Abs Error (&lt;/span&gt;&lt;span class="si"&gt;%%&lt;/span&gt;&lt;span class="s2"&gt;) : &lt;/span&gt;&lt;span class="si"&gt;%5.3f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;        Strikes    Market Value     Model Value   Relative Error (%)
======================================================================
         527.50      184.23863       177.26114           -3.7872037 
         560.46      162.13295       156.75990           -3.3139776 
         593.43      141.96233       138.13403           -2.6967003 
         626.40      123.03554       121.33552           -1.3817289 
         659.37      108.50169       106.27965           -2.0479306 
         692.34       93.29771        92.86049           -0.4686261 
         725.31       79.64951        80.95876            1.6437604 
         758.28       67.62146        70.44848            4.1806550 
----------------------------------------------------------------------
Average Abs Error (%) : 2.440
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;p&gt;[1] Mathias R. Fengler, &lt;em&gt;Arbitrage Free Smoothing of Implied Volatility Surface&lt;/em&gt;, &lt;a href="https://core.ac.uk/download/files/153/6978470.pdf"&gt;https://core.ac.uk/download/files/153/6978470.pdf&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Click here to download the &lt;a href="/extra/notebooks/heston_model_calibration_smile.ipynb"&gt;ipython notebook&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 19 May 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-05-19:blog/volatility-smile-heston-model-calibration-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Valuing Convertible Bonds Using QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/value-convertible-bond-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In this blog I will work through an example of valuing convertible bonds in QuantLib. Lets start by doing the usual setup of creating a &lt;code&gt;calculation_date&lt;/code&gt; and setting it as the &lt;code&gt;evaluationDate&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2004&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;One little quirk in the QuantLib convertible bond implementation is that there are places where the redemption amount is hard coded to &lt;code&gt;100&lt;/code&gt;. So if you have conversion ratio evaluated as 
\begin{eqnarray}
Conversion\ Ratio = \frac{Redemption\ Amount}{Conversion\ Price}
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;you will need to scale to an appropriate value with a redemption amount of &lt;code&gt;100&lt;/code&gt;. For instance, vendors report conversion ratio with a redemption amount of 1000. The conversion ratio obtained this way should be divided by a factor of &lt;code&gt;10&lt;/code&gt; to get the equivalent conversion ratio for use in the QuantLib calculations. This is a limitation right now (as of version 1.7), which can be fixed in the future.&lt;/p&gt;
&lt;p&gt;Following is the details of the convertible bond of interest.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# St. Mary Land &amp;amp; Exploration Company &lt;/span&gt;
&lt;span class="c1"&gt;# Bloomberg ticker: SM 5.75 03/15/22 &lt;/span&gt;

&lt;span class="n"&gt;redemption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.00&lt;/span&gt;
&lt;span class="n"&gt;face_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;
&lt;span class="n"&gt;spot_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;29.04&lt;/span&gt;
&lt;span class="n"&gt;conversion_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;26.0&lt;/span&gt;
&lt;span class="n"&gt;conversion_ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.84615&lt;/span&gt;  &lt;span class="c1"&gt;# BBG quotes 38.4615; had to scale by a factor of 10&lt;/span&gt;

&lt;span class="n"&gt;issue_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        
&lt;span class="n"&gt;maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GovernmentBond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;coupon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0575&lt;/span&gt;
&lt;span class="n"&gt;frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;
&lt;span class="n"&gt;tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;accrual_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unadjusted&lt;/span&gt;
&lt;span class="n"&gt;payment_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unadjusted&lt;/span&gt;

&lt;span class="n"&gt;call_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2007&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;call_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;
&lt;span class="n"&gt;put_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2007&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2012&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;put_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;

&lt;span class="c1"&gt;# assumptions&lt;/span&gt;
&lt;span class="n"&gt;dividend_yield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;
&lt;span class="n"&gt;credit_spread_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.03&lt;/span&gt;  
&lt;span class="n"&gt;risk_free_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.40&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The call and put schedule for this bond is created as shown below. Here for each call date, we create a &lt;code&gt;CallabilityPrice&lt;/code&gt;, then use that to form the &lt;code&gt;Callability&lt;/code&gt; object. This is appended to the &lt;code&gt;CallabilitySchedule&lt;/code&gt; object to form a list of call and put schedules.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;callability_schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilitySchedule&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;call_date&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;call_dates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="n"&gt;callability_price&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilityPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                            &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilityPrice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Clean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;callability_schedule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callability_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                       &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="n"&gt;call_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="p"&gt;)&lt;/span&gt;
    
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;put_date&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;put_dates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;puttability_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilityPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;put_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                            &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallabilityPrice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Clean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;callability_schedule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;puttability_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                               &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                               &lt;span class="n"&gt;put_date&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Any dividend information for the underlying stock is used to form the &lt;code&gt;DividendSchedule&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dividend_schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DividendSchedule&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# No dividends&lt;/span&gt;
&lt;span class="n"&gt;dividend_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dividend_yield&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;spot_price&lt;/span&gt;
&lt;span class="n"&gt;next_dividend_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2004&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dividend_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spot_price&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dividend_yield&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;advance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_dividend_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dividend_schedule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FixedDividend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dividend_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now we bulid the fixed coupon convertible bond object&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accrual_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accrual_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Backward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;credit_spread_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credit_spread_rate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;exercise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AmericanExercise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;convertible_bond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConvertibleFixedCouponBond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exercise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="n"&gt;conversion_ratio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="n"&gt;dividend_schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="n"&gt;callability_schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                                 &lt;span class="n"&gt;credit_spread_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="n"&gt;issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;coupon&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                                                 &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                 &lt;span class="n"&gt;redemption&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Build the Black-Scholes-Merton process to model the equity part&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spot_price_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_price&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;yield_ts_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_free_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dividend_ts_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_yield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;volatility_ts_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackVolTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackConstantVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bsm_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackScholesMertonProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_price_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;dividend_ts_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                           &lt;span class="n"&gt;yield_ts_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                           &lt;span class="n"&gt;volatility_ts_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Build the convertible bond pricing engine&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;time_steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BinomialConvertibleEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;crr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time_steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Price the bond&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;convertible_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;NPV &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;convertible_bond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;NPV  132.308276818
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Click here to download the &lt;a href="/extra/notebooks/convertible_bond.ipynb"&gt;ipython notebook on convertible bonds&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Wed, 16 Mar 2016 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-03-16:blog/value-convertible-bond-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Understanding Interest Rate Risk</title><link>http://gouthamanbalaraman.com/blog/understanding-interest-rate-risk.html</link><description>&lt;p&gt;Interest rate changes affect returns on bonds and other fixed income assets, in which 
a lot of people nearing retirement would have their money invested. But volatility in 
interest rates also affect non-investment businesses which then indirectly affect the prices
that we pay for products that we consume.&lt;/p&gt;
&lt;p&gt;There are different businesses units that care about interest rate risk. Some businesses
hurt when rates go down, while others care if the rates go up. The fact that different 
businesses have different concerns on interest rate movements mean that hedging strategies 
can be employed. In some sense, hedging is a way of distributing risk from one entity to 
others. When all is well, this can be a great thing for your business. The concept or 
interest rate risk management involves understanding, quantifying and hedging interest rate risk. &lt;/p&gt;
&lt;h2&gt;Who cares about interest rate risk?&lt;/h2&gt;
&lt;p&gt;There are different industries and businesses that are affected by interest rate fluctuations. Let
us look at a few examples.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fixed Income Investors&lt;/strong&gt;: Funds that we contribute to our retirement accounts or pension plans are 
  invested in equity and fixed income funds. Fixed income investors purchase bonds which are 
  affected by interest rate fluctuations. Price of a fixed income bond is (generally) inversely 
  propotional to interest rate movements, i.e. the value of the investment drops when interest rates
  rise and gains when interest rates drop. The sensitivity of fixed income investment to interest rate
  depends on the asset's maturity. Longer maturity investments are more sensitive to interest rate 
  changes than short maturity investments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mortgage Lenders &amp;amp; Servicers&lt;/strong&gt;: Mortgage lenders allow prospective home buyers to lock in on a 
  mortgage rate for a couple of months. Lets say, that the lender has provided the home buyer a locked
  mortgage rate for a loan of \$100,000. But in 2 months time, when the home buyer closes on the loan,
  should the interest rates rise, then mortgage loan is worth less than \$100,000 and the lender stands
  to lose when he sells in the secondary market. Similarly, on the mortgage servicing side, when interest
  rates go down, the loans in the servicing portfolio could drop out due to interest rate refinancing. This
  can lead to decrease in projected cashflows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Small and Large Businesses&lt;/strong&gt;: Businesses need to raise capital in order to expand, and very often
  do so by using loans from financial institutions. The loans given out to small to medium businesses
  typically carry floating rate payments. Because of a variable interest rate loan, businesses are exposed
  to the interest rate fluctuations. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Addressing Interest Rate Risk&lt;/h2&gt;
&lt;p&gt;There are various tools available to market practitioners to mitigate exposure to interest rate risks.
Derivative contracts such as interest rate swaps allow two parties to exchange cashflows such as 
fixed to float, or float on one tenor with float on another tenor. By entering a fixed for float swap,
businesses can convert a floating payment on their loans into a net fixed payment.&lt;/p&gt;
&lt;p&gt;Futures contracts on interest rate with different maturities on the deliverable allows one to hedge
interest rate risk exposure on their books. The Futures contracts are exchange traded and offer 
liquidity and do not have credit risk associated.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this blog post, I provided an introduction to interest rate risk and how it can be managed. At a later
post, I will drill into some of the specifics of how certain derivatives can help hedge interest rate risk.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Wed, 09 Mar 2016 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-03-09:blog/understanding-interest-rate-risk.html</guid><category>hedging</category><category>finance</category><category>risk management</category></item><item><title>An Introduction to the Fundamental Review of the Trading Book (FRTB)</title><link>http://gouthamanbalaraman.com/blog/introduction-fundamental-review-of-the-trading-book-frtb.html</link><description>&lt;p&gt;Basel Committee on Banking Supervision (BCBS) released a consultative document 
titled, "The Fundamental Review of the Trading Book" (FRTB) in 2012 &lt;a href="http://www.bis.org/publ/bcbs219.htm"&gt;1&lt;/a&gt;. 
The intent of this document and the subsequent discussions and studies was to address the shortcomings of the 
existing market risk capital framework, and reduce the variability in the minimum capital standard
for market risk across different jurisdictions.&lt;/p&gt;
&lt;p&gt;The key changes proposed under the &lt;a href="http://www.bis.org/bcbs/publ/d352.pdf"&gt;new market risk framework&lt;/a&gt;
finalized on 14th January 2016:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;A revised internal models-approach (IMA)&lt;/em&gt;. The new approach introduces a more rigorous model
  approval process that enables supervisors to remove internal modelling permission for
  individual trading desks, more consistent identification and capitalisation of material risk factors
  across banks, and constraints on the capital-reducing effects of hedging and diversification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;A revised standardised approach (SA)&lt;/em&gt;. The revisions fundamentally overhaul the standardised
  approach to make it sufficiently risk-sensitive to serve as a credible fallback for, as well as a
  floor to, the IMA, while still providing an appropriate standard for banks that do not require a
  sophisticated treatment for market risk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;A shift from Value-at-Risk (VaR) to an Expected Shortfall (ES) measure of risk under stress&lt;/em&gt;. Use of
  ES will help to ensure a more prudent capture of “tail risk” and capital adequacy during periods
  of significant financial market stress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Incorporation of the risk of market illiquidity&lt;/em&gt;. Varying liquidity horizons are incorporated into the
  revised SA and IMA to mitigate the risk of a sudden and severe impairment of market liquidity
  across asset markets. These replace the static 10-day horizon assumed for all traded
  instruments under VaR in the current framework.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;A revised boundary between the trading book and banking book&lt;/em&gt;. Establishment of a more
  objective boundary will serve to reduce incentives to arbitrage between the regulatory banking
  and trading books, while still being aligned with banks' risk management practices. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The BCBS estimates that FRTB will result in 40% increase in total market risk capital 
requirements as compared to the current Basel 2.5 framework. The changes proposed under
FRTB not only have an impact on the capital requirements, but it will also pose significant
challenges to a bank's technology infrastructure.&lt;/p&gt;
&lt;p&gt;.. to be continued&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Fri, 19 Feb 2016 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2016-02-19:blog/introduction-fundamental-review-of-the-trading-book-frtb.html</guid><category>regulation</category><category>finance</category></item><item><title>Valuing Options on Commodity Futures Using QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/value-options-commodity-futures-black-formula-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The Black-Scholes equation is the well known model to price equity European options. In the case of equities, the spot price fluctuates and hence the intuition to model as a stochastic process makes sense. In the case of commodities, however, the spot price does not fluctuate as much, and hence cannot be modeled as a stochastic process to value options on commodities. In the 1976 paper [1], Fischer Black addressed this problem by modeling the futures price, which demonstrates fluctuations, as the lognormal stochastic process.&lt;/p&gt;
&lt;p&gt;The futures price at time $t$, $F_t$ with a is modeled as:&lt;/p&gt;
&lt;p&gt;\begin{eqnarray}
dF_t &amp;amp;=&amp;amp; \sigma_t F_t dW
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;where $\sigma_t$ is the volatility of the underlying, and $dW$ is the Weiner process.&lt;/p&gt;
&lt;p&gt;The value of an option at strike $K$, maturing at $T$, risk free rate $r$ with volatility $\sigma$ of the underlying is given by the closed form expression:&lt;/p&gt;
&lt;p&gt;\begin{eqnarray}
c &amp;amp;=&amp;amp;  e^{-r T} [FN(d_1) - KN(d_2)] \nonumber \\
p &amp;amp;=&amp;amp; e^{-r T} [KN(-d_2) - FN(-d_1)]
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;where
\begin{eqnarray}
d_1 &amp;amp;=&amp;amp; \frac{\ln(F/K) + (\sigma^2/2)T}{\sigma\sqrt{T}} \nonumber\\
d_2 &amp;amp;=&amp;amp; \frac{\ln(F/K) - (\sigma^2/2)T}{\sigma\sqrt{T}} = d_1 - \sigma\sqrt{T}
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;This formula can be easily used to price caps, swaptions, futures options contract. Here we will use &lt;code&gt;QuantLib&lt;/code&gt; to price the options on commodity futures.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bussiness_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;
&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="option-on-treasury-futures-contract"&gt;Option on Treasury Futures Contract&lt;/h2&gt;
&lt;p&gt;Options on treasury futures (10 Yr Note TYF6C 119) can be valued using the Black formula. Let us value a Call option maturing on December 24, 2015, with a strike of 119. The current futures price is  126.95, and the volatility is 11.567%. The risk free rate as of December 1, 2015 is 0.105%. Let us value this Call option as of December 1, 2015.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;interest_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.00105&lt;/span&gt;
&lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;yield_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                             &lt;span class="n"&gt;interest_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Continuous&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;
&lt;span class="n"&gt;option_maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;strike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;119&lt;/span&gt;
&lt;span class="n"&gt;spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;126.953&lt;/span&gt;&lt;span class="c1"&gt;# futures price&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;11.567&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.&lt;/span&gt;
&lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;

&lt;span class="n"&gt;discount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_maturity_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;strikepayoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainVanillaPayoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dayCounter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yearFraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                          &lt;span class="n"&gt;option_maturity_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stddev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;black&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackCalculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikepayoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                           &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                           &lt;span class="n"&gt;stddev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                           &lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Option Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Delta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Gamma&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gamma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Theta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vega&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vega&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Rho&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Option Price        : 7.9686
Delta               : 0.9875
Gamma               : 0.0088
Theta               : -0.9356
Vega                : 1.0285
Rho                 : 7.3974
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="natural-gas-futures-option"&gt;Natural Gas Futures Option&lt;/h2&gt;
&lt;p&gt;I saw &lt;a href="http://quantlib.10058.n7.nabble.com/Quantlib-methods-for-option-pricing-td17018.html"&gt;this&lt;/a&gt; question on quantlib users group. Thought I will add this example as well. &lt;/p&gt;
&lt;p&gt;Call option with a 3.5 strike, spot 2.919, volatility 0.4251. The interest rate is 0.15%.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;interest_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0015&lt;/span&gt;
&lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;yield_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                             &lt;span class="n"&gt;interest_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Continuous&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;96.12&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;365.&lt;/span&gt;

&lt;span class="n"&gt;strike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.5&lt;/span&gt;
&lt;span class="n"&gt;spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.919&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.4251&lt;/span&gt;
&lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;

&lt;span class="n"&gt;discount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;strikepayoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainVanillaPayoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stddev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;strikepayoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainVanillaPayoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;black&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackCalculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strikepayoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stddev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Option Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Delta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Gamma&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gamma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Theta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Vega&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vega&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%4.4f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Rho&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Option Price        : 0.0789
Delta               : 0.2347
Gamma               : 0.4822
Theta               : -0.3711
Vega                : 0.4600
Rho                 : 0.1597
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this notebook, I demonstrated how Black formula can be used to value options on commodity futures. It is worth pointing out that different vendors usually have different scaling conventions when it comes to reporting greeks. One would needs to take that into account when comparing the values shown by QuantLib with that of other vendors&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;p&gt;[1] Fischer Black, &lt;em&gt;The pricing of commodity contracts&lt;/em&gt;, Journal of Financial Economics, (3) 167-179 (1976) &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Click here to download the &lt;a href="/extra/notebooks/commodity_futures_options.ipynb"&gt;ipython notebook on treasury futures&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Thu, 17 Dec 2015 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-12-17:blog/value-options-commodity-futures-black-formula-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Valuing Treasury Futures Using QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/value-treasury-futures-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In this post, we will learn how to value treasury futures contract using QuantLib. The treasury futures contract gives the buyer the right to buy the underlying by the time the contract expires. The underlying is usually delivered from a basket of securities. So in order to properly value the futures contract, we would need to find the deliverable. Here we start by doing a naive calculation by constructing a fictional security. We will see what is wrong about this approach. As a next step we will perform the cheapest to deliver calculation and subsequently use that deliverable to value the same contract.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bussiness_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Following&lt;/span&gt;
&lt;span class="n"&gt;end_of_month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;face_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;coupon_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="build-yield-curve"&gt;Build Yield Curve&lt;/h2&gt;
&lt;p&gt;As a first step, we build the treasury curve out of the treasury securities such as T-Bills, T-Notes and Treasury bonds.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# build curve&lt;/span&gt;
&lt;span class="n"&gt;prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;99.9935&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;99.9576&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;99.8119&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;99.5472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;99.8867&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mf"&gt;100.0664&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;99.8711&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;100.0547&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;100.3047&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;100.2266&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;coupon_rates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.00875&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
               &lt;span class="mf"&gt;0.0125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.01625&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;maturity_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                  &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                  &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                  &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                  &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2045&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="n"&gt;issue_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="n"&gt;coupon_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bond_helpers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;coupon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; \
    &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coupon_rates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;issue_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_dates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;coupon_frequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Backward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FixedRateBondHelper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                                    &lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="n"&gt;face_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;coupon&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                                    &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;
                                    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bond_helpers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;yield_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PiecewiseCubicZero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bond_helpers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;yield_curve_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;maturity_dates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;|&lt;/span&gt;&lt;span class="si"&gt;%20s&lt;/span&gt;&lt;span class="s2"&gt;  &lt;/span&gt;&lt;span class="si"&gt;%9.6f&lt;/span&gt;&lt;span class="s2"&gt;|&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;| December 24th, 2015   0.999935|
| February 25th, 2016   0.999576|
|      May 26th, 2016   0.998119|
| November 10th, 2016   0.995472|
| November 30th, 2017   0.981524|
| November 15th, 2018   0.964278|
| November 30th, 2020   0.920306|
| November 30th, 2022   0.868533|
| November 15th, 2025   0.799447|
| November 15th, 2045   0.384829|
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="treasury-futures"&gt;Treasury Futures&lt;/h2&gt;
&lt;p&gt;Here we want to understand how to model treasury futures contract. Let us look at the TYZ5, the treasury futures on the 10 year note for delivery in December 2015. The notional deliverable is a 10-year 6% coupon note. In reality, the seller of the futures contract can deliver from a basket of securities. &lt;/p&gt;
&lt;p&gt;For now, lets assume that the deliverable is actually a 6% coupon 10-year note issued as of the calculation date. Let us construct a 10 year treasury note and value this security. The futures price for the TYZ5 is $127.0625.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_tsy_security&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="n"&gt;bond_maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;coupon_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;coupon_frequency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                        &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                        &lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;face_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.&lt;/span&gt;
    &lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    
    &lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;bond_maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;coupon_frequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Forward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FixedRateBond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;face_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;coupon_rate&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                                   &lt;span class="n"&gt;day_count&lt;/span&gt;
                                   &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;security&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bond_issue_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt; 
&lt;span class="n"&gt;delivery_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bond_maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bond_issue_date&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;coupon_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;coupon_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.&lt;/span&gt;

&lt;span class="n"&gt;deliverable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_tsy_security&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_issue_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;bond_maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;coupon_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;coupon_frequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;calendar&lt;/span&gt;
                                  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bond_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiscountingBondEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yield_curve_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;deliverable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Lets calculate the Z-Spread for this deliverable. The Z-Spread is the static spread added to the yield curve to match the price of the security. This spread is a measure of the risk associated with the security. For a treasury security, you would expect this to be zero. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;futures_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;127.0625&lt;/span&gt;
&lt;span class="n"&gt;clean_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;futures_price&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivery_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;zspread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BondFunctions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zSpread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deliverable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clean_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                   &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                   &lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Z-Spread =&lt;/span&gt;&lt;span class="si"&gt;%3.0f&lt;/span&gt;&lt;span class="s2"&gt;bp&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zspread&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Z-Spread = 71bp
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here we get a spread of 71 basis points. This is unusually high for a treasury futures contract. &lt;/p&gt;
&lt;h3 id="cheapest-to-deliver"&gt;Cheapest To Deliver&lt;/h3&gt;
&lt;p&gt;Above we used a fictional 6% coupon bond as the deliverable. In reality, the deliverable is picked from a basket of securities based on what is the cheapest to deliver. Cheapest to deliver is not the cheapest in price. The seller of the futures contract, has to buy the delivery security from the market and sell it at an adjusted futures price. The adjusted futures price is given as:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adjusted Futures Price = Futures Price x Conversion Factor&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The gain or loss to the seller is given by the basis,&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Basis = Cash Price - Adjusted Futures Price&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So the cheapest to deliver is expected to be the security with the lowest basis. The conversion factor for a security is the price of the security with a 6% yield. Let us look at a basket of securities that is underlying this futures contract to understand this aspect.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# basket describes the coupon rate, maturity date, price&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;basket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mf"&gt;1.625&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;97.921875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.625&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;97.671875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;98.546875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;97.984375&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.875&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;99.375&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.875&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;99.296875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;100.265625&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;100.0625&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;98.296875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;98.09375&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;101.06250&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;99.25&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;100.546875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;100.375&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.375&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;101.671875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;103.25&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;102.796875&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;105.0625&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;104.875&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;securities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;min_basis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;min_basis_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;coupon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="n"&gt;issue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maturity&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_tsy_security&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;maturity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;coupon&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bond_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiscountingBondEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yield_curve_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BondFunctions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cleanPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.&lt;/span&gt;
    &lt;span class="n"&gt;adjusted_futures_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;futures_price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;
    &lt;span class="n"&gt;basis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adjusted_futures_price&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;basis&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;min_basis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;min_basis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;basis&lt;/span&gt; 
        &lt;span class="n"&gt;min_basis_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="n"&gt;securities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    
&lt;span class="n"&gt;ctd_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;min_basis_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ctd_bond&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ctd_cf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;securities&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;min_basis_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ctd_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctd_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%lf&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Minimum Basis&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_basis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%lf&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Conversion Factor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctd_cf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%lf&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Coupon&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctd_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Maturity&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctd_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%lf&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctd_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Minimum Basis                  = 0.450601
Conversion Factor              = 0.791830
Coupon                         = 2.125000
Maturity                       = June 30th, 2022
Price                          = 101.062500
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The basis is the loss for a notional of \$100 that the seller accrues to close this contract. For a single futures contract (which has a \$100000 notional), there is a loss of \$450.60.&lt;/p&gt;
&lt;p&gt;NOTE: You will need my &lt;a href="https://github.com/lballabio/quantlib/pull/370"&gt;pull request&lt;/a&gt; to execute the &lt;code&gt;FixedRateBondForward&lt;/code&gt; class since it is not exposed in SWIG at the moment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;futures_maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;futures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FixedRateBondForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;futures_maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                  &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;ctd_bond&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_curve_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The valuation of the futures contract and the underlying is shown below:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model_futures_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cleanForwardPrice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ctd_cf&lt;/span&gt;
&lt;span class="n"&gt;implied_yield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;impliedYield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctd_price&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ctd_cf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;futures_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                     &lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;z_spread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BondFunctions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zSpread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctd_bond&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctd_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yield_curve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                    &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                    &lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ytm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BondFunctions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_yield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctd_bond&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctd_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%lf&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Model Futures Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_futures_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%lf&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Market Futures Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;futures_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%lf&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Model Adjustment&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_futures_price&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;futures_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%2.3f%%&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Implied Yield&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;implied_yield&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%2.1f&lt;/span&gt;&lt;span class="s2"&gt;bps&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Forward Z-Spread&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z_spread&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-30s&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;%2.3f%%&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Forward YTM &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ytm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Model Futures Price            = 127.610365
Market Futures Price           = 127.062500
Model Adjustment               = 0.547865
Implied Yield                  = -7.473%
Forward Z-Spread               = 1.6bps
Forward YTM                    = 1.952%
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a href="https://www.cmegroup.com/education/files/understanding-treasury-futures.pdf"&gt;Understanding Treasury Futures&lt;/a&gt;, CME Group PDF&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this notebook, we looked into understanding and valuing treasury futures contracts. We used the QuantLib &lt;code&gt;FixedRateBondForward&lt;/code&gt; class in order to model the futures contract. But, we also made a cheapest to deliver calculation to figure out the deliverable. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Click here to download the &lt;a href="/extra/notebooks/understanding_treasury_futures.ipynb"&gt;ipython notebook on treasury futures&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Wed, 02 Dec 2015 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-12-02:blog/value-treasury-futures-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>QuantLib Python Tutorials With Examples</title><link>http://gouthamanbalaraman.com/blog/quantlib-python-tutorials-with-examples.html</link><description>
        I have written a lot of little tutorials on using QuantLib python bindings. In these posts I explain some
        of the QuantLib concepts using minimal examples. Following are the links to these posts:
        &lt;ul&gt;
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
            
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/quantlib-basics.html"&gt;Introduction to QuantLib Python&lt;/a&gt;&lt;/b&gt;: This post will walk through some of the basics of QuantLib Python library. &lt;/li&gt;
                    
                
            
        
            
                
                    
                
                    
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/quantlib-bond-modeling.html"&gt;Modeling Fixed Rate Bonds in QuantLib Python&lt;/a&gt;&lt;/b&gt;: This post will walk through an example of modeling fixed rate bonds using QuantLib Python. &lt;/li&gt;
                    
                
            
        
            
                
                    
                
                    
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/quantlib-term-structure-bootstrap-yield-curve.html"&gt;An Introduction to Interest Rate Term Structure in QuantLib Python&lt;/a&gt;&lt;/b&gt;: This post will walk through the basics of bootstrapping yield curve in QuantLib Python. &lt;/li&gt;
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/hull-white-simulation-quantlib-python.html"&gt;Hull White Term Structure Simulations with QuantLib Python&lt;/a&gt;&lt;/b&gt;: Discusses simulation of the Hull White interest rate term structure model in QuantLib Python &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/european-option-binomial-tree-quantlib-python.html"&gt;Option Model Handbook, Part III: European Option Pricing With QuantLib Python&lt;/a&gt;&lt;/b&gt;: Demonstrates how to price European options using QuantLib Python. Methods using Black-Scholes-Merton formula and binomial tree will be discussed. &lt;/li&gt;
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/hull-white-simulation-monte-carlo-convergence.html"&gt;On the Convergence of Hull White Monte Carlo Simulations&lt;/a&gt;&lt;/b&gt;: Discusses the convergence of the Monte-Carlo simulations of the Hull-White model &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/valuing-european-option-heston-model-quantLib.html"&gt;Valuing European Option Using the Heston Model in QuantLib Python&lt;/a&gt;&lt;/b&gt;: Introduces an example on how to value European options using Heston model in Quantlib Python &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/interest-rate-swap-quantlib-python.html"&gt;Modeling Vanilla Interest Rate Swaps Using QuantLib Python&lt;/a&gt;&lt;/b&gt;: Provides a basic introduction to valuing interest rate swaps using QuantLib Python. &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/short-interest-rate-model-calibration-quantlib.html"&gt;Short Interest Rate Model Calibration in QuantLib Python&lt;/a&gt;&lt;/b&gt;: Provides examples of short interest rate model calibration to swaption volatilities in QuantLib Python &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/value-treasury-futures-quantlib-python.html"&gt;Valuing Treasury Futures Using QuantLib Python&lt;/a&gt;&lt;/b&gt;: Provides an introduction to valuation of treasury futures contract in QuantLib Python. &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/value-options-commodity-futures-black-formula-quantlib-python.html"&gt;Valuing Options on Commodity Futures Using QuantLib Python&lt;/a&gt;&lt;/b&gt;: Describes how to value options on commodity futures contract using the Black formula in QuantLib Python &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/value-convertible-bond-quantlib-python.html"&gt;Valuing Convertible Bonds Using QuantLib Python&lt;/a&gt;&lt;/b&gt;: Provides an introduction to valuation of convertible bonds using QuantLib Python with a minimal example. &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/volatility-smile-heston-model-calibration-quantlib-python.html"&gt;Modeling Volatility Smile and Heston Model Calibration Using QuantLib Python&lt;/a&gt;&lt;/b&gt;: Provides an introduction to constructing implied volatility surface consistend with the smile observed in the market and calibrating Heston model using QuantLib Python. &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/quantlib-python-cookbook-announcement.html"&gt;QuantLib Python Cookbook Announcement&lt;/a&gt;&lt;/b&gt;: Announcement of the "QuantLib Python Cookbook" &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/interest-rate-cap-floor-valuation-quantlib-python.html"&gt;Valuing Interest Rate Caps and Floors Using QuantLib Python&lt;/a&gt;&lt;/b&gt;: A tutorial on valuing caps and floors using QuantLib Python. &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/quantlib-python-notebook-docker.html"&gt;QuantLib Python Notebooks On Docker&lt;/a&gt;&lt;/b&gt;: Running QuantLib python notebooks on Docker &lt;/li&gt;
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/announcing-qtk-quantlib-python.html"&gt;Announcing qtk for QuantLib Python&lt;/a&gt;&lt;/b&gt;: Announcing qtk, a new interface to interact with QuantLib Python &lt;/li&gt;
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/bonds-with-spreads-quantlib-python.html"&gt;Valuing Bonds with Credit Spreads in QuantLib Python&lt;/a&gt;&lt;/b&gt;: Provides an example of valuing bonds with credit spreads using QuantLib Python. This post walks through an example of shifting the yield term structure. &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/heston-calibration-scipy-optimize-quantlib-python.html"&gt;Heston Model Calibration Using QuantLib Python and Scipy Optimize&lt;/a&gt;&lt;/b&gt;: In this post we do a deep dive on calibration of Heston model using QuantLib Python and Scipy's Optimize package. &lt;/li&gt;
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/callable-bond-quantlib-python.html"&gt;Valuing Callable Bonds Using QuantLib Python&lt;/a&gt;&lt;/b&gt;: In this post we look at valuing callable bonds using QuantLib Python &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/variance-reduction-hull-white-quantlib.html"&gt;Variance Reduction in Hull-White Monte Carlo Simulation Using Moment Matching&lt;/a&gt;&lt;/b&gt;: This post explains how to use moment matching to reduce variance in Monte Carlo simulation of the Hull-White term structure model. &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                    &lt;li&gt; &lt;b&gt;&lt;a href="/blog/american-option-pricing-quantlib-python.html"&gt;American Option Pricing with QuantLib and Python&lt;/a&gt;&lt;/b&gt;: This post explains valuing American Options using QuantLib and Python &lt;/li&gt;
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
                    
                
                    
                
            
        
            
                
                    
                
                    
                
                    
                
                    
                
            
        
        
        &lt;/ul&gt;
    </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Fri, 30 Oct 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-10-30:blog/quantlib-python-tutorials-with-examples.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Short Interest Rate Model Calibration in QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/short-interest-rate-model-calibration-quantlib.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I have talked about Hull-White model in my earlier blog posts. The focus of those posts was to see how to use the model classes. The model parameters were assumed to be given. However in practice, the model parameters need to calibrated from market data. Typically instruments such as swaptions, caps or floors and their market prices / volatilities are taken as inputs. Then the model parameters are fit in such a way that the model prices these options close enough. The goodness of fit depends, apart from the choice of the numerical methods, on the type of model itself. This is because models such as Hull-White 1 factor cannot fit some of the humped volatility term structures observed in the market. Never the less, Hull-White is usually a good starting point to understand calibration process.&lt;/p&gt;
&lt;p&gt;Here we will discuss Hull-White model in detail. Then we will also show how the same procedure can be applied to calibrate other short rate models.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="hull-white-1-factor-model"&gt;Hull-White 1 Factor Model&lt;/h2&gt;
&lt;p&gt;Hull-White model was one of the first practical exogenous models that attempted to fit to the market interest rate term structures. The model is described as:&lt;/p&gt;
&lt;p&gt;\begin{equation}
dr_t = (\theta(t) - a r_t) dt + \sigma dW_t
\end{equation}&lt;/p&gt;
&lt;p&gt;where $a$ is the mean reversion constant, $\sigma$ is the volatility parameter. The parameter $\theta(t)$ is chosen in order to fit the input term structure of interest rates. &lt;/p&gt;
&lt;p&gt;What is the &amp;quot;right&amp;quot; value for parameters $a$ and $\sigma$? This is the question that we address by calibrating to market instruments.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;February&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;settlement&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;February&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;term_structure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settlement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.04875825&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Euribor1Y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In this example we are going to calibrate to the swaption volatilities as shown below. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CalibrationData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CalibrationData&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                             &lt;span class="s2"&gt;&amp;quot;start, length, volatility&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CalibrationData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1148&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;CalibrationData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1108&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;CalibrationData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1070&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;CalibrationData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1021&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;CalibrationData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1000&lt;/span&gt; &lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_swaption_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;swaptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;fixed_leg_tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fixed_leg_daycounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;floating_leg_daycounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;vol_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SwaptionHelper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                                   &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                                   &lt;span class="n"&gt;vol_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;fixed_leg_tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;fixed_leg_daycounter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;floating_leg_daycounter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                   &lt;span class="n"&gt;term_structure&lt;/span&gt;
                                   &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;swaptions&lt;/span&gt;    

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;82&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Model Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Market Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Implied Vol&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Market Vol&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Rel Error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;82&lt;/span&gt;
    &lt;span class="n"&gt;cum_err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;model_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;market_vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;volatility&lt;/span&gt;
        &lt;span class="n"&gt;black_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blackPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;market_vol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rel_error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_price&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;black_price&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
        &lt;span class="n"&gt;implied_vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;impliedVolatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                          &lt;span class="mf"&gt;1e-5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rel_error2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;implied_vol&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;market_vol&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;
        &lt;span class="n"&gt;cum_err&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;rel_error2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;rel_error2&lt;/span&gt;
        
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;black_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;implied_vol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;market_vol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rel_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;82&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cumulative Error : &lt;/span&gt;&lt;span class="si"&gt;%15.5f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cum_err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="calibrating-reversion-and-volaitility"&gt;Calibrating Reversion and Volaitility&lt;/h3&gt;
&lt;p&gt;Here we use the &lt;code&gt;JamshidianSwaptionEngine&lt;/code&gt; to value the swaptions as part of calibration. The &lt;code&gt;JamshidianSwaptionEngine&lt;/code&gt; requires one-factor affine models as input. For other interest rate models, we need a pricing engine that is more suited to those models.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JamshidianSwaptionEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;swaptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_swaption_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;optimization_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;end_criteria&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optimization_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_criteria&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;a = 0.04642, sigma = 0.00580
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;----------------------------------------------------------------------------------
    Model Price    Market Price     Implied Vol      Market Vol       Rel Error
----------------------------------------------------------------------------------
        0.00878         0.00949         0.10620         0.11480        -0.07485
        0.00967         0.01008         0.10629         0.11080        -0.04061
        0.00866         0.00872         0.10634         0.10700        -0.00614
        0.00649         0.00623         0.10644         0.10210         0.04237
        0.00354         0.00332         0.10661         0.10000         0.06582
----------------------------------------------------------------------------------
Cumulative Error :         0.11614
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JamshidianSwaptionEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;swaptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_swaption_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;optimization_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;end_criteria&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optimization_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_criteria&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;a = 0.04642, sigma = 0.00580
----------------------------------------------------------------------------------
    Model Price    Market Price     Implied Vol      Market Vol       Rel Error
----------------------------------------------------------------------------------
        0.00878         0.00949         0.10620         0.11480        -0.07485
        0.00967         0.01008         0.10629         0.11080        -0.04061
        0.00866         0.00872         0.10634         0.10700        -0.00614
        0.00649         0.00623         0.10644         0.10210         0.04237
        0.00354         0.00332         0.10661         0.10000         0.06582
----------------------------------------------------------------------------------
Cumulative Error :         0.11614
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h3 id="calibrating-volatility-with-fixed-reversion"&gt;Calibrating Volatility With Fixed Reversion&lt;/h3&gt;
&lt;p&gt;Some times we need to calibrate with one parameter held fixed. This can be done in the QuantLib libraries. However, this ability is not exposed in the SWIG wrappers as of version 1.6. I have created a &lt;a href="https://github.com/lballabio/quantlib/issues/336"&gt;github issue&lt;/a&gt; and provided a patch to address this issue. You will need this patch to execute the following cells. Below, the model is calibrated with a fixed reversion value of 5%.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;constrained_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JamshidianSwaptionEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;constrained_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;swaptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_swaption_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;optimization_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;end_criteria&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;constrained_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optimization_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_criteria&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NoConstraint&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;constrained_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;a = 0.05000, sigma = 0.00586
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;----------------------------------------------------------------------------------
    Model Price    Market Price     Implied Vol      Market Vol       Rel Error
----------------------------------------------------------------------------------
        0.00878         0.00949         0.10621         0.11480        -0.07474
        0.00967         0.01008         0.10628         0.11080        -0.04068
        0.00866         0.00872         0.10633         0.10700        -0.00626
        0.00649         0.00623         0.10644         0.10210         0.04231
        0.00354         0.00332         0.10663         0.10000         0.06595
----------------------------------------------------------------------------------
Cumulative Error :         0.11615
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="black-karasinski-model"&gt;Black Karasinski Model&lt;/h2&gt;
&lt;p&gt;The Black Karasinski model is described as:&lt;/p&gt;
&lt;p&gt;\begin{equation}
d\ln(r_t) = (\theta_t - a \ln(r_t)) dt + \sigma dW_t
\end{equation}&lt;/p&gt;
&lt;p&gt;In order to calibrate, we use the &lt;code&gt;TreeSwaptionEngine&lt;/code&gt; which will work with all short rate models. The calibration is shown below. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[10]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackKarasinski&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeSwaptionEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;swaptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_swaption_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;optimization_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;end_criteria&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optimization_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_criteria&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;a = 0.03902, sigma = 0.11695
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[11]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;----------------------------------------------------------------------------------
    Model Price    Market Price     Implied Vol      Market Vol       Rel Error
----------------------------------------------------------------------------------
        0.00872         0.00949         0.10550         0.11480        -0.08095
        0.00967         0.01008         0.10631         0.11080        -0.04045
        0.00868         0.00872         0.10654         0.10700        -0.00430
        0.00650         0.00623         0.10666         0.10210         0.04446
        0.00355         0.00332         0.10676         0.10000         0.06733
----------------------------------------------------------------------------------
Cumulative Error :         0.12163
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="g2-model"&gt;G2++ Model&lt;/h2&gt;
&lt;p&gt;As a final example, let us look at a calibration example of the 2-factor G2++ model.
\begin{equation}
dr_t = \varphi(t) + x_t + y_t
\end{equation}&lt;/p&gt;
&lt;p&gt;where $ x_t $ and $ y_t $ are defined by&lt;/p&gt;
&lt;p&gt;\begin{eqnarray}
dx_t &amp;amp;=&amp;amp; -a x_t dt + \sigma dW^1_t\nonumber \\
dy_t &amp;amp;=&amp;amp; -b y_t dt + \eta dW^2_t \nonumber \\
\left&amp;lt;dW^1_t dW^2_t\right&amp;gt; &amp;amp;=&amp;amp; \rho dt 
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;Once again, we use the &lt;code&gt;TreeSwaptionEngine&lt;/code&gt; to value the swaptions in the calibration step. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[12]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;G2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeSwaptionEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# engine = ql.G2SwaptionEngine(model, 10, 400)&lt;/span&gt;
&lt;span class="c1"&gt;# engine = ql.FdG2SwaptionEngine(model)&lt;/span&gt;
&lt;span class="n"&gt;swaptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_swaption_helpers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_structure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;optimization_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LevenbergMarquardt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;end_criteria&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EndCriteria&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calibrate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optimization_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_criteria&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, sigma = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, b = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, eta = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt;, rho = &lt;/span&gt;&lt;span class="si"&gt;%6.5f&lt;/span&gt;&lt;span class="s2"&gt; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;a = 0.04050, sigma = 0.00474, b = 0.04438, eta = 0.00301, rho = 0.03541 
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[13]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calibration_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;----------------------------------------------------------------------------------
    Model Price    Market Price     Implied Vol      Market Vol       Rel Error
----------------------------------------------------------------------------------
        0.00870         0.00949         0.10535         0.11480        -0.08228
        0.00967         0.01008         0.10633         0.11080        -0.04029
        0.00868         0.00872         0.10651         0.10700        -0.00456
        0.00650         0.00623         0.10665         0.10210         0.04438
        0.00355         0.00332         0.10680         0.10000         0.06770
----------------------------------------------------------------------------------
Cumulative Error :         0.12265
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post, we saw some simple examples of calibrating the model to the swaption volatilities. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Click here to download the &lt;a href="/extra/notebooks/interest_rate_model_calibration.ipynb"&gt;ipython notebook&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Tue, 27 Oct 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-10-27:blog/short-interest-rate-model-calibration-quantlib.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Modeling Vanilla Interest Rate Swaps Using QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/interest-rate-swap-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;An Interest Rate Swap is a financial derivative instrument in which two parties agree to exchange interest rate cash flows based on a notional amount from a fixed rate to a floating rate or from one floating rate to another floating rate. &lt;/p&gt;
&lt;p&gt;Here we will consider an example of a plain vanilla USD swap with 10 million notional and 10 year maturity. Let the fixed leg pay 2.5% coupon semiannually, and the floating leg pay Libor 3m quarterly. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="sample-code"&gt;Sample Code&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Here we construct the yield curve objects. For simplicity, we will use flat curves for discounting and Libor 3M. This will help us focus on the Swap construction part. Please refer to &lt;a href="http://gouthamanbalaraman.com/blog/quantlib-term-structure-bootstrap-yield-curve.html"&gt;curve construction example&lt;/a&gt; for some details. Once we construct the &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# construct discount curve and libor curve&lt;/span&gt;

&lt;span class="n"&gt;risk_free_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;
&lt;span class="n"&gt;libor_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;discount_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_free_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;libor_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;libor_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#libor3M_index = ql.Euribor3M(libor_curve)  &lt;/span&gt;
&lt;span class="n"&gt;libor3M_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USDLibor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;libor_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;To construct the Swap instrument, we have to specify the fixed rate leg and floating rate leg. We construct the fixed rate and floating rate leg schedules below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;settle_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;advance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;advance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settle_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fixed_leg_tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fixed_schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settle_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                             &lt;span class="n"&gt;fixed_leg_tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Forward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;float_leg_tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;float_schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settle_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                              &lt;span class="n"&gt;float_leg_tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModifiedFollowing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Forward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Below, we construct a &lt;code&gt;VanillaSwap&lt;/code&gt; object  by including the fixed and float leg schedules created above.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;notional&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000000&lt;/span&gt;
&lt;span class="n"&gt;fixed_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.025&lt;/span&gt;
&lt;span class="n"&gt;fixed_leg_daycount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;float_spread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.004&lt;/span&gt;
&lt;span class="n"&gt;float_leg_daycount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;ir_swap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VanillaSwap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VanillaSwap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Payer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;notional&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fixed_schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
               &lt;span class="n"&gt;fixed_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fixed_leg_daycount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;float_schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;libor3M_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;float_spread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;float_leg_daycount&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We evaluate the swap using a discounting engine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;swap_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiscountingSwapEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;discount_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swap_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="result-analysis"&gt;Result Analysis&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The cashflows for the fixed and floating leg can be extracted from the &lt;code&gt;ir_swap&lt;/code&gt; object. The fixed leg cashflows are shown below:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;leg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%2d&lt;/span&gt;&lt;span class="s2"&gt;    &lt;/span&gt;&lt;span class="si"&gt;%-18s&lt;/span&gt;&lt;span class="s2"&gt;  &lt;/span&gt;&lt;span class="si"&gt;%10.2f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt; 1    April 27th, 2016     127083.33
 2    October 27th, 2016   127083.33
 3    April 27th, 2017     126388.89
 4    October 27th, 2017   127083.33
 5    April 27th, 2018     126388.89
 6    October 29th, 2018   128472.22
 7    April 29th, 2019     126388.89
 8    October 28th, 2019   126388.89
 9    April 27th, 2020     126388.89
10    October 27th, 2020   127083.33
11    April 27th, 2021     126388.89
12    October 27th, 2021   127083.33
13    April 27th, 2022     126388.89
14    October 27th, 2022   127083.33
15    April 27th, 2023     126388.89
16    October 27th, 2023   127083.33
17    April 29th, 2024     128472.22
18    October 28th, 2024   126388.89
19    April 28th, 2025     126388.89
20    October 27th, 2025   126388.89
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The floating leg cashflows are shown below:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;leg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%2d&lt;/span&gt;&lt;span class="s2"&gt;    &lt;/span&gt;&lt;span class="si"&gt;%-18s&lt;/span&gt;&lt;span class="s2"&gt;  &lt;/span&gt;&lt;span class="si"&gt;%10.2f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt; 1    January 27th, 2016    60760.46
 2    April 27th, 2016      60098.65
 3    July 27th, 2016       60098.65
 4    October 27th, 2016    60760.46
 5    January 27th, 2017    60760.46
 6    April 27th, 2017      59436.87
 7    July 27th, 2017       60098.65
 8    October 27th, 2017    60760.46
 9    January 29th, 2018    62084.17
10    April 27th, 2018      58113.40
11    July 27th, 2018       60098.65
12    October 29th, 2018    62084.17
13    January 28th, 2019    60098.65
14    April 29th, 2019      60098.65
15    July 29th, 2019       60098.65
16    October 28th, 2019    60098.65
17    January 27th, 2020    60098.65
18    April 27th, 2020      60098.65
19    July 27th, 2020       60098.65
20    October 27th, 2020    60760.46
21    January 27th, 2021    60760.46
22    April 27th, 2021      59436.87
23    July 27th, 2021       60098.65
24    October 27th, 2021    60760.46
25    January 27th, 2022    60760.46
26    April 27th, 2022      59436.87
27    July 27th, 2022       60098.65
28    October 27th, 2022    60760.46
29    January 27th, 2023    60760.46
30    April 27th, 2023      59436.87
31    July 27th, 2023       60098.65
32    October 27th, 2023    60760.46
33    January 29th, 2024    62084.17
34    April 29th, 2024      60098.65
35    July 29th, 2024       60098.65
36    October 28th, 2024    60098.65
37    January 27th, 2025    60098.65
38    April 28th, 2025      60098.65
39    July 28th, 2025       60098.65
40    October 27th, 2025    60098.65
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Some other analytics such as the fair value, fair spread etc can be extracted as shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%20.3f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Net Present Value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%20.3f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fair Spread&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fairSpread&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%20.3f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fair Rate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fairRate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%20.3f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fixed Leg BPS&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixedLegBPS&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%-20s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%20.3f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Floating Leg BPS&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ir_swap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floatingLegBPS&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;Net Present Value   :          -115054.034
Fair Spread         :                0.005
Fair Rate           :                0.024
Fixed Leg BPS       :            -9629.981
Floating Leg BPS    :             9642.042
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Here we saw a simple example on how to construct a swap and value them. We evaluated the fixed and floating legs and then valued the &lt;code&gt;VanillaSwap&lt;/code&gt; using the &lt;code&gt;DiscountingSwapEngine&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Click here to download the &lt;a href="/extra/notebooks/irswapexample.ipynb"&gt;ipython notebook on interest rate swaps&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Tue, 20 Oct 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-10-20:blog/interest-rate-swap-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Valuing European Option Using the Heston Model in QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/valuing-european-option-heston-model-quantLib.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Heston model can be used to value options by modeling the underlying asset such as the stock of a company. The one major feature of the Heston model is that it inocrporates a stochastic volatility term.&lt;/p&gt;
&lt;p&gt;\begin{eqnarray}
dS_t &amp;amp;=&amp;amp; \mu S_tdt + \sqrt{V_t} S_t dW_t^1 \\
dV_t &amp;amp;=&amp;amp; \kappa(\theta-V_t) + \sigma \sqrt{V_t} dW_t^2
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;Here :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$S_t$ is the asset&amp;#39;s value at time $t$&lt;/li&gt;
&lt;li&gt;$\mu$ is the expected growth rate of the log normal stock value&lt;/li&gt;
&lt;li&gt;$V_t$ is the variance of the asset $S_t$&lt;/li&gt;
&lt;li&gt;$W_t^1$ is the stochastic process governing the $S_t$ process&lt;/li&gt;
&lt;li&gt;$\theta$ is the value of mean reversion for the variance $V_t$&lt;/li&gt;
&lt;li&gt;$\kappa$ is the strengh of mean reversion&lt;/li&gt;
&lt;li&gt;$\sigma$ is the volatility of volatility&lt;/li&gt;
&lt;li&gt;$W_t^2$ is the stochastic process governing the $V_t$ process&lt;/li&gt;
&lt;li&gt;The correlation between $W_t^1$ and $W_t^2$ is $\rho$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, the Black-Scholes-Merton process assumes that the volatility is constant.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scipy.integrate&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cumtrapz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;romb&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let us consider a European call option for AAPL with a strike price of \$130 maturing on 15th Jan, 2016. Let the spot price be \$127.62. The volatility of the underlying stock is know to be 20%, and has a dividend yield of 1.63%. We assume a short term risk free rate of 0.1%. Lets value this option as of 8th May, 2015. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# option parameters&lt;/span&gt;
&lt;span class="n"&gt;strike_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;110.0&lt;/span&gt;
&lt;span class="n"&gt;payoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainVanillaPayoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# option data&lt;/span&gt;
&lt;span class="n"&gt;maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;127.62&lt;/span&gt;
&lt;span class="n"&gt;strike_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;130&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt; &lt;span class="c1"&gt;# the historical vols for a year&lt;/span&gt;
&lt;span class="n"&gt;dividend_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mf"&gt;0.0163&lt;/span&gt;
&lt;span class="n"&gt;option_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;

&lt;span class="n"&gt;risk_free_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Using the above inputs, we construct the European option as shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# construct the European Option&lt;/span&gt;
&lt;span class="n"&gt;payoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainVanillaPayoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;exercise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EuropeanExercise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;european_option&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VanillaOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exercise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In order to price the option using the Heston model, we first create the Heston process. In order to create the Heston process, we use the parameter values: mean reversion strength &lt;code&gt;kappa = 0.1&lt;/code&gt;, the spot variance &lt;code&gt;v0 = volatility*volatility = 0.04&lt;/code&gt;, the mean reversion variance &lt;code&gt;theta=v0&lt;/code&gt;, volatility of volatility &lt;code&gt;sigma = 0.1&lt;/code&gt; and the correlation between the asset price and its variance is &lt;code&gt;rho = -0.75&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# construct the Heston process&lt;/span&gt;

&lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;volatility&lt;/span&gt;  &lt;span class="c1"&gt;# spot variance&lt;/span&gt;
&lt;span class="n"&gt;kappa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;theta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;
&lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;rho&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;

&lt;span class="n"&gt;spot_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;flat_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_free_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dividend_yield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;heston_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;dividend_yield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;spot_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;On valuing the option using the Heston model, we get the net present value as:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticHestonEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HestonModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heston_process&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;h_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;The Heston model price is&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;h_price&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;The Heston model price is 6.5308651372
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Performing the same calculation using the Black-Scholes-Merton process, we get:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;flat_vol_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackVolTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackConstantVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bsm_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackScholesMertonProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;dividend_yield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;flat_vol_ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticEuropeanEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;bs_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;The Black-Scholes-Merton model price is &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bs_price&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;The Black-Scholes-Merton model price is  6.74927181246
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The difference in the price between the two models is: &lt;code&gt;bs_price - h_price = 0.21840667525992163&lt;/code&gt;. This difference is due to the stochastic modeling of the volatility as a CIR-process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;This post provided a minimal example of valuing European options using the Heston model. 
Comparison with the Black-Scholes-Merton model is shown for instructional purpose.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Tue, 08 Sep 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-09-08:blog/valuing-european-option-heston-model-quantLib.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Adding Caching to Python Flask-Blogging Engine</title><link>http://gouthamanbalaraman.com/blog/adding-caching-to-python-flask-blogging-extension.html</link><description>&lt;p&gt;I deployed my blog (using &lt;a class="reference external" href="https://github.com/gouthambs/Flask-Blogging"&gt;Flask-Blogging&lt;/a&gt; extension)
to a site I am building. I am currently hosting the test version on the free instance
of &lt;a class="reference external" href="https://openshift.com"&gt;Openshift&lt;/a&gt;. So these are not very powerful servers, and
I wasn't expecting any great performance. Here is what I saw while
using Version 0.3.2 of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Flask-Blogging&lt;/span&gt;&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$&amp;gt; ab -kc 30 -t 10 https://ucarpool.org/blog/

Benchmarking ucarpool.org (be patient)
Finished 267 requests

Document Path:          /blog/
Document Length:        4882 bytes

Concurrency Level:      30
Time taken for tests:   10.061 seconds
Complete requests:      267
Failed requests:        0
Keep-Alive requests:    267
Total transferred:      1428480 bytes
HTML transferred:       1303494 bytes
Requests per second:    26.54 [#/sec] (mean)
Time per request:       1130.451 [ms] (mean)
Time per request:       37.682 [ms] (mean, across all concurrent requests)
Transfer rate:          138.65 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   34  95.5      0     353
Processing:   272 1040 374.4    936    2166
Waiting:      267 1037 374.5    933    2163
Total:        546 1074 349.5    968    2166

Percentage of the requests served within a certain time (ms)
  50%    964
  66%   1039
  75%   1133
  80%   1248
  90%   1812
  95%   1910
  98%   2030
  99%   2070
 100%   2166 (longest request)
&lt;/pre&gt;
&lt;p&gt;Thats a measely 26 requests/sec!&lt;/p&gt;
&lt;p&gt;One of the features I have wanted to add to this extension is the ability to
cache the pages. Blogs are typically heavy on reads, and light on writes. This
makes an excellent case for caching.&lt;/p&gt;
&lt;p&gt;In order to enable caching support, I am using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Flask-Cache&lt;/span&gt;&lt;/tt&gt; the caching
extension for &lt;tt class="docutils literal"&gt;Flask&lt;/tt&gt;. The version 0.4.0 of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Flask-Blogging&lt;/span&gt;&lt;/tt&gt; is released with
caching support built in. &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Flask-Cache&lt;/span&gt;&lt;/tt&gt; makes the caching backend
configurable. It has support for various backends such as filesystem,
redis, and memcache.&lt;/p&gt;
&lt;p&gt;Here is resulting performance after using a filesystem based cache:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$&amp;gt; ab -kc 30 -t 10 https://ucarpool.org/blog/
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 1528965 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking ucarpool.org (be patient)
Finished 1815 requests

Document Path:          /blog/
Document Length:        4882 bytes

Concurrency Level:      30
Time taken for tests:   10.004 seconds
Complete requests:      1815
Failed requests:        0
Keep-Alive requests:    1815
Total transferred:      9710280 bytes
HTML transferred:       8860830 bytes
Requests per second:    181.43 [#/sec] (mean)
Time per request:       165.351 [ms] (mean)
Time per request:       5.512 [ms] (mean, across all concurrent requests)
Transfer rate:          947.92 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    6  44.3      0     400
Processing:    80  158  46.1    150     411
Waiting:       79  156  46.1    147     410
Total:         83  164  58.9    152     518

Percentage of the requests served within a certain time (ms)
  50%    152
  66%    173
  75%    183
  80%    190
  90%    217
  95%    277
  98%    357
  99%    420
 100%    518 (longest request)
&lt;/pre&gt;
&lt;p&gt;Now we are able to serve 180 requests/second. A good 7X performance gain for using a
filesystem cache. Using in memory like Redis, or SSD filesystem should be even better.&lt;/p&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Flask-Blogging, the Flask extension to add Markdown based blog support to Flask sites, incorporates
caching support which has greatly improved its performance.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Sat, 25 Jul 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-07-25:blog/adding-caching-to-python-flask-blogging-extension.html</guid><category>python</category><category>flask</category><category>programming</category></item><item><title>Flask-Blogging: A Python Flask Blog Engine as an Extension</title><link>http://gouthamanbalaraman.com/blog/flask-blogging-python-flask-blog-engine-extension.html</link><description>&lt;p&gt;I wanted to add a blog to my flask site. I decided to write it as an
extension. This makes the blog code easy to plug into any site, and
fairly reusable.&lt;/p&gt;
&lt;p&gt;Flask-Blogging is a blog engine as a Flask extension based on Markdown.
Please see:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://flask-blogging.readthedocs.org/en/latest/"&gt;Flask-Blogging documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/gouthambs/Flask-Blogging"&gt;Flask-Blogging github&lt;/a&gt; project page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Out of the box Flask-Blogging has support for the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Bootstrap based site&lt;/li&gt;
&lt;li&gt;Markdown based blog editor&lt;/li&gt;
&lt;li&gt;Models to store blog&lt;/li&gt;
&lt;li&gt;Authentication of User’s choice&lt;/li&gt;
&lt;li&gt;Sitemap, ATOM support&lt;/li&gt;
&lt;li&gt;Disqus support for comments&lt;/li&gt;
&lt;li&gt;Google analytics for usage tracking&lt;/li&gt;
&lt;li&gt;Well documented, tested, and extensible design&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="minimal-example"&gt;
&lt;h2&gt;Minimal Example&lt;/h2&gt;
&lt;p&gt;Here is a minimal example for getting a blog up and running. There is no
security in the authentication here. But if you have authentication
setup using either Flask-Login or Flask-Security, it should be straight forward
to configure authentication. This example uses version 0.3.2.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;render_template_string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MetaData&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask.ext.login&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UserMixin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LoginManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; \
    &lt;span class="n"&gt;login_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logout_user&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask.ext.blogging&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SQLAStorage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BloggingEngine&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SECRET_KEY&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;secret&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# for WTF-forms and login&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BLOGGING_URL_PREFIX&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/blog&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BLOGGING_DISQUS_SITENAME&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BLOGGING_SITEURL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://localhost:8000&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# extensions&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'sqlite:////tmp/blog.db'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MetaData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;sql_storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SQLAStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;blog_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BloggingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sql_storage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;login_manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoginManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# user class for providing authentication&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UserMixin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Paul Dirac&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# typically the user's name&lt;/span&gt;

&lt;span class="nd"&gt;&amp;#64;login_manager.user_loader&lt;/span&gt;
&lt;span class="nd"&gt;&amp;#64;blog_engine.user_loader&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;index_template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt; &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        {&lt;/span&gt;&lt;span class="si"&gt;% i&lt;/span&gt;&lt;span class="s2"&gt;f current_user.is_authenticated() %}
            &amp;lt;a href=&amp;quot;/logout/&amp;quot;&amp;gt;Logout&amp;lt;/a&amp;gt;
        {&lt;/span&gt;&lt;span class="si"&gt;% e&lt;/span&gt;&lt;span class="s2"&gt;lse %}
            &amp;lt;a href=&amp;quot;/login/&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;
        {&lt;/span&gt;&lt;span class="si"&gt;% e&lt;/span&gt;&lt;span class="s2"&gt;ndif %}
        &amp;amp;nbsp&amp;amp;nbsp&amp;lt;a href=&amp;quot;/blog/&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;
        &amp;amp;nbsp&amp;amp;nbsp&amp;lt;a href=&amp;quot;/blog/sitemap.xml&amp;quot;&amp;gt;Sitemap&amp;lt;/a&amp;gt;
        &amp;amp;nbsp&amp;amp;nbsp&amp;lt;a href=&amp;quot;/blog/feeds/all.atom.xml&amp;quot;&amp;gt;ATOM&amp;lt;/a&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="nd"&gt;&amp;#64;app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;render_template_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;&amp;#64;app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/login/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;testuser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;login_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/blog&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;&amp;#64;app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/logout/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;logout&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;logout_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_reloader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="screen-shots"&gt;
&lt;h2&gt;Screen Shots&lt;/h2&gt;
&lt;div class="section" id="blog-editor"&gt;
&lt;h3&gt;Blog Editor&lt;/h3&gt;
&lt;p&gt;Here is a screenshot of the blog editor page. This editor uses the awesome
&lt;a class="reference external" href="https://github.com/toopay/bootstrap-markdown"&gt;Bootstrap-Markdown&lt;/a&gt; editor.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="" src="http://flask-blogging.readthedocs.org/en/latest/_images/blog_editor.png" /&gt;
&lt;p class="caption"&gt;Blog Editor&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="blog-page"&gt;
&lt;h3&gt;Blog Page&lt;/h3&gt;
&lt;p&gt;The blog page when rendered looks as shown here. The page is configured out of the
box to include LaTeX support. The math is rendered using MathJax. I have thought
about using KaTex, but decided to wait till they have support for &lt;tt class="docutils literal"&gt;eqnarray&lt;/tt&gt;.
As you can see, it uses Disqus for comments.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="" src="http://flask-blogging.readthedocs.org/en/latest/_images/blog_page.png" /&gt;
&lt;p class="caption"&gt;Blog Page&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Install the extension with the following commands:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ easy_install flask-blogging
&lt;/pre&gt;
&lt;p&gt;or alternatively if you have pip installed:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ pip install flask-blogging
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Here I introduced the Flask-Blogging extension that can be used as
a flask blog engine to your flask site.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Sat, 04 Jul 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-07-04:blog/flask-blogging-python-flask-blog-engine-extension.html</guid><category>python</category><category>flask</category><category>programming</category></item><item><title>How to Build a Fundamental Factor Model</title><link>http://gouthamanbalaraman.com/blog/build-fundamental-factor-model.html</link><description>&lt;p&gt;In a multi-factor model, the return of a stock can be broken out 
into multiple factors.&lt;/p&gt;
&lt;p&gt;$$ r_i = \alpha_i + \sum_{j=1}^{K} \beta_{ij} f_j + \epsilon_i $$&lt;/p&gt;
&lt;p&gt;The term $\epsilon_i$ is the error term which is assumed to have a 
distribution with zero mean. Now we can write the average return as&lt;/p&gt;
&lt;p&gt;$$ E(r_i) = E(\alpha_i) + \sum_{j=1}^{K} \beta_{ij} E(f_j) $$&lt;/p&gt;
&lt;p&gt;This can be expressed concisely using the matrix representation:&lt;/p&gt;
&lt;p&gt;$$ r_i = \mathbf{\beta}^T_i \mathbf{f}  + \epsilon_i $$&lt;/p&gt;
&lt;p&gt;where:&lt;/p&gt;
&lt;p&gt;\begin{eqarray}
\mathbf{\beta}&lt;em i1="i1"&gt;i &amp;amp;=&amp;amp; (\alpha_i, \beta&lt;/em&gt;, \beta_{i2}, ..., \beta_{iK})^T \ 
\mathbf(f) &amp;amp;=&amp;amp; (1, f_1, f_2, ..., f_K)^T
\end{eqarray}&lt;/p&gt;
&lt;p&gt;Using this notation, the average return can then be written as:&lt;/p&gt;
&lt;p&gt;$$ E(r_i) = \mathbf{\beta}_i^T E(\mathbf{f}) $$&lt;/p&gt;
&lt;p&gt;We see that the average return on the stock is the product of factor exposures ($\mathbf{\beta}_i$) and factor premium ($\mathbf{f}$). In a fundamental factor model, the &lt;em&gt;factor exposures&lt;/em&gt;  are characteristics of an investment (such as a stock) that is known, such as the Price to Earnings ratio, or momentum of the stock, or market capitalization. The &lt;em&gt;factor premium&lt;/em&gt; is the unknown that we wish to determine empirically. &lt;/p&gt;
&lt;p&gt;One of the tenets of quantitative portfolio management is:
&lt;em&gt;the average return of an investment is the payoff
for taking risk&lt;/em&gt;. The risk of a stock has two components:&lt;/p&gt;
&lt;p&gt;Total Risk = Non-Diversifiable Risk + Diversifiable Risk&lt;/p&gt;
&lt;p&gt;Risk can be measured using the variance of the returns:&lt;/p&gt;
&lt;p&gt;$$ V(r_i) = V(\alpha + \beta_{i1}f_1 + ... + \beta_{iK}f_K) + V(\epsilon_i) + V(\epsilon_i)$$.&lt;/p&gt;
&lt;p&gt;This can be expressed in the matrix notation as:&lt;/p&gt;
&lt;p&gt;$$ V(r_i) = \mathbf{\beta}_i^T V(\mathbf{f}) \mathbf{\beta}_i + V(\epsilon_i) $$&lt;/p&gt;
&lt;p&gt;where $V(\mathbf{f})$ is a $(K+1) \times (K+1)$-dimensional variance-covariance matrix. The diversifiable component which an investor can mitigate by diversification
is the term $V(\epsilon_i)$. The non-diversifiable componenent which the market 
rewards is obtained from factor exposures $\mathbf{\beta}_i$ and factor premium
risk $V(\mathbf{f})$.&lt;/p&gt;
&lt;h2&gt;Preparatory Work&lt;/h2&gt;
&lt;p&gt;There are a series of steps that one has to do before we can run a 
multi-variable regression to determine the factor premiums. &lt;/p&gt;
&lt;h3&gt;Choosing the factors&lt;/h3&gt;
&lt;p&gt;We need to choose the factors that we wish to include in the model. This step 
is usually driven by the intuition an investor has on the market, and 
characteristics of the stock that are important. For instance, some fundamental factors that would make sense for equity investments include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Valuation Factors&lt;/em&gt;: Market capitalization (size), price-to-book ratio (P/B),
price-to-earnings ratio (P/E), price-to-sales ratio (P/S).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Solvency Factors&lt;/em&gt;: Debt-to-equity ratio (D/E), current ratio (CUR, a metric
of short term solvency), interest coverage ratio.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Growth Potential Factors&lt;/em&gt;: Capital-expenditure-to-sales ratio, R&amp;amp;D-expenditure-to-sales ratio, advertising-expenditure-to-sales ratio.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Technical factors&lt;/em&gt;: Momentum, trading volume, short interest shares shorted&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Analyst factors&lt;/em&gt;: Analyst rating changes, earnings revision etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Similarly some fundamental factors that would make sense for fixed income investments 
include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Credit Factors&lt;/em&gt;: Credit quality, different vendor ratings&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interest Rate Sensitivity Factors&lt;/em&gt;: Effective duration, key rate duration at
various tenors, convexity&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Asset Type Factors&lt;/em&gt;: Some factors can be asset specific, such as:&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Municipals&lt;/em&gt;: &lt;ol&gt;
&lt;li&gt;State or issuer&lt;/li&gt;
&lt;li&gt;Purpose such as revenue or general obligation&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Mortgages&lt;/em&gt;:&lt;ol&gt;
&lt;li&gt;Coupon&lt;/li&gt;
&lt;li&gt;Amortization type&lt;/li&gt;
&lt;li&gt;Issuer&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Treatment of the Risk-Free Rate&lt;/h3&gt;
&lt;p&gt;Since we are building a model to measure the payoff for undertaking risk, it is
conventional to subtract the risk-free rate from the returns of the investment. The
rational is that the risk-free rate is the return that can be obtained on any
investment without any risk. In order to do this, we need to define what is
considered risk-free. In the U.S. markets, the U.S. treasury bills are used
as a proxy for the risk free rate. In other markets, one has to exercise care
in identifying a risk free rate. All sovereign bond/bill  rates do not 
immediately translate into risk-free rates because a lot of countries (developing 
and developed) have risk of default as well. &lt;/p&gt;
&lt;p&gt;Once the risk-free rate $r_{ft}$ has been identified, the excess return can be defined
as &lt;/p&gt;
&lt;p&gt;$$ r_{it}' = r_{it} - r_{ft} $$&lt;/p&gt;
&lt;h3&gt;Building the Data Sample&lt;/h3&gt;
&lt;p&gt;One of the crucial components in the factor model building process is 
to create a data sample that can then be used to deduce the model 
parameters. For example, to model the U.S. equity market one can use
the top 2000 to 3000 stocks by market cap. Depending on where we cutoff, 
this will include stocks in the large-cap and mid-cap range. This would mean
that the model may not precisely model the effects in the small-cap stocks.
On the other hand, limiting to stocks in the mid-cap or large-cap range can
provide more stability to the model, and that could be a desirable thing.  &lt;/p&gt;
&lt;p&gt;Once we have a filter for deciding how we want to build the basket of 
instruments for model building, we also have to decide the frequency and 
period for which we need to collect the data. What do we mean by that? The
regression step involved in the model building will fit the stock returns
$r_{it}$ for a period (such as one day returns or monthly returns) as 
a function of various factors $f$. The return data is collected over multiple
periods, such as 3 years or 5 years. For instance, our data sample could
be top 3000 stocks by market cap with monthly returns collected for 3 years.
A rule of thumb is that the frequency of the investor's re-balancing strategy
should determine the frequency of the returns used in the model building.
If the re-balances  monthly, then one should use monthly returns in the 
model fitting. There should be sufficient time periods included in order
to avoid spurious fitting effects and to improve robustness of fit. 
It is conventional to use 3 to 5 years worth of data while using monthly 
returns, and 2 to 3 years while using weekly returns.  &lt;/p&gt;
&lt;p&gt;Another factor that one should keep in mind is to include companies
that are not only alive at the time of model building but also to include
companies that may have gotten delisted or bankrupt. Failure to do 
so will introduce what is called as &lt;em&gt;survivorship bias&lt;/em&gt; in your model. &lt;/p&gt;
&lt;h2&gt;Fitting the Model&lt;/h2&gt;
&lt;p&gt;Once we have the data sample assembled, one can use regression utilities
in statistical packages such as &lt;em&gt;R&lt;/em&gt;, Python's &lt;em&gt;Statsmodels&lt;/em&gt; package, &lt;em&gt;Matlab&lt;/em&gt;,
SAS to perform a panel regression. The goal of the panel regression is 
to estimate factor premium $\mathbf{f}$ given by the equation &lt;/p&gt;
&lt;p&gt;$$ r_i = \mathbf{\beta}^T_i \mathbf{f}  + \epsilon_i $$&lt;/p&gt;
&lt;p&gt;where the returns $r_i$ and the factor exposures $\mathbf{\beta}_i$
are known. A simple way to estimate factor premiums is by using 
Ordinary Least Squares (OLS). This will also give us an estimate
of the sample variance-covariance matrix $V(\mathbf{\hat{f}})$.&lt;/p&gt;
&lt;p&gt;\begin{eqnarray} 
\mathbf{f} &amp;amp;=&amp;amp; \left( \sum_{t=1}^T \sum_{i=1}^N  (\mathbf{\beta}_{it} - \bar{\mathbf{\beta}} ) (  \mathbf{\beta}_{it} - \bar{\mathbf{\beta}} )^T
\right)^{-1}
  \sum_{t=1}^{T} \sum_{i=1}^{N} (\mathbf{\beta}_{it} - \bar{\mathbf{\beta}} ) (r_{it} - \bar{r})
\end{eqnarray}
where &lt;/p&gt;
&lt;p&gt;$$
\bar{\mathbf{\beta}} = \frac{1}{NT} \sum_{t=1}^{T} \sum_{i=1}^{N} \mathbf{\beta}_{it} 
$$
and
$$
\bar{r} = \frac{1}{NT} \sum_{t=1}^{T} \sum_{i=1}^{N} r_{it} 
$$ &lt;/p&gt;
&lt;p&gt;The variance-covariance matrix of the factor premium estimate is given as:&lt;/p&gt;
&lt;p&gt;\begin{eqnarray}
\hat{V}(\hat{f}) &amp;amp;=&amp;amp; \hat{\sigma}^2 
\left(
 \sum_{t=1}^T \sum_{i=1}^N&lt;br /&gt;
  (\mathbf{\beta}_{it} - \bar{\mathbf{\beta}} ) 
  (  \mathbf{\beta}_{it} - \bar{\mathbf{\beta}} )^T
\right)
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;where $\hat{\sigma}^2$ is the variance of the error term $\epsilon_{it}$
$$
\hat{\sigma}^2 = \frac{1}{NT} \sum_{t=1}^T \sum_{i=1}^N&lt;br /&gt;
 (r_{it} - \mathbf{\beta}_{it}\hat{f})
$$&lt;/p&gt;
&lt;h2&gt;Robustness Considerations&lt;/h2&gt;
&lt;p&gt;It is important that the estimates of the factor premium and 
the variance of factor premiums are robust. One way to accomplish
that is by  using generalized least squares (GLS). 
Corrections for heteroskedasticity and autocorrelation can be
incorporated by using the &lt;a href="https://en.wikipedia.org/wiki/Newey%E2%80%93West_estimator"&gt;Newey-West Estimator&lt;/a&gt; to correct for heteroskedacity and auto correlation.
The statistical package R has an implementation of Newey-West in the 
&lt;a href="http://cran.r-project.org/web/packages/sandwich/index.html"&gt;sandwich&lt;/a&gt; package.
&lt;a href="http://www.ledoit.net/honey.pdf"&gt;Covariance Shrinkage&lt;/a&gt; was suggested by Ledoit
and Wolf as a way to reduce estimation error in the Covariance Matrix. This technique
helps reduce the extremes in the covariance matrix coefficients towards a 
central value, and is necessary in the portfolio optimization process. &lt;/p&gt;
&lt;h2&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;Here we gave an introduction to the process of building a factor model. This text
is informative for some one to get started. There are lots of nuances that one 
needs to consider to incorporate the intuition of investment managers and 
follow the wind as the market currents change.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Ludwig B. Chincarini &amp;amp; Daehwan Kim, &lt;em&gt;Quantitative Equity Portfolio Management&lt;/em&gt;, McGraw Hill&lt;/li&gt;
&lt;li&gt;Olivier Ledoit &amp;amp; Michael Wolf, &lt;em&gt;Honey, I Shrunk the Sample Covariance Matrix&lt;/em&gt;, &lt;a href="http://www.ledoit.net/honey.pdf"&gt;http://www.ledoit.net/honey.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Mon, 22 Jun 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-06-22:blog/build-fundamental-factor-model.html</guid><category>finance</category></item><item><title>On the Convergence of Hull White Monte Carlo Simulations</title><link>http://gouthamanbalaraman.com/blog/hull-white-simulation-monte-carlo-convergence.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I had recently written an introductory post on &lt;a href="http://gouthamanbalaraman.com/blog/hull-white-simulation-quantlib-python.html"&gt;simulating short rates in the Hull-White Model&lt;/a&gt;. This &lt;a href="http://quantlib.10058.n7.nabble.com/Matching-results-between-HW-tree-and-simulation-models-td16399.html"&gt;question on the QuantLib forum&lt;/a&gt; raised some interesting questions on the convergence of the Hull-White model simulations. In this post, I discuss the convergence of Monte-Carlo simulations using the Hull-White model.&lt;/p&gt;
&lt;p&gt;The Hull-White Short Rate Model is defined as:&lt;/p&gt;
&lt;p&gt;$$ dr_t = (\theta(t) - a r_t)dt + \sigma dW_t $$,&lt;/p&gt;
&lt;p&gt;where $a$ and $\sigma $ are constants, and $\theta(t)$ is
chosen in order to fit the input term structure of interest rates.
Here we use QuantLib to show how to simulate the Hull-White model
and investigate some of the properties.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The variables used in this post are described below: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;timestep&lt;/code&gt; is the number of steps used to discretize the time grid&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hw_process&lt;/code&gt; the object that defines the Hull-White process, &lt;/li&gt;
&lt;li&gt;&lt;code&gt;length&lt;/code&gt; is the time span of the simulation in years&lt;/li&gt;
&lt;li&gt;&lt;code&gt;low_discrepancy&lt;/code&gt; is a boolean variable that is used to chose &lt;code&gt;Sobol&lt;/code&gt; low discrepancy random or not&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brownnian_bridge&lt;/code&gt; is a boolean that choses brownian bridge for path generation &lt;/li&gt;
&lt;li&gt;&lt;code&gt;num_paths&lt;/code&gt; is the number of paths in the simulation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt; is the constant parameter in the Hull-White model&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sigma&lt;/code&gt; is the constant parameter $\sigma$ in the Hull-White model that describes volatility&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scipy.integrate&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cumtrapz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;romb&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;

&lt;span class="n"&gt;todays_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;todays_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;get_path_generator&lt;/code&gt; function creates the a path generator. This function takes various inputs such as &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_path_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hw_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                       &lt;span class="n"&gt;low_discrepancy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;brownian_bridge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    Returns a path generator&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;low_discrepancy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;usg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniformLowDiscrepancySequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianLowDiscrepancySequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianSobolPathGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;hw_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;brownian_bridge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;usg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniformRandomSequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniformRandomGenerator&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianRandomSequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianPathGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;hw_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;brownian_bridge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;generate_paths&lt;/code&gt; function uses the generic path generator produced by the &lt;code&gt;get_path_generator&lt;/code&gt; function to return a tuple of the array of the points in the time grid and a matrix of the short rates generated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;sample_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sample_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
        &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The &lt;code&gt;generate_paths_zero_price&lt;/code&gt; essentially is a wrapper around &lt;code&gt;generate_path_generator&lt;/code&gt; and &lt;code&gt;generate_paths&lt;/code&gt; taking all the required raw inputs. This function returns the average of zero prices from all the paths for different points in time. I wrote this out so that I can conveniently change all the required inputs and easily plot the results.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_paths_zero_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                              &lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;low_discrepancy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                              &lt;span class="n"&gt;brownian_bridge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    This function returns a tuple (T_array, F_array), where T_array is the array &lt;/span&gt;
&lt;span class="sd"&gt;    of points in the time grid, and F_array is the array of the average of zero &lt;/span&gt;
&lt;span class="sd"&gt;    prices observed from the simulation.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;hw_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhiteProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_path_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hw_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;low_discrepancy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;brownian_bridge&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;avgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;simps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; 
                               &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;)])))&lt;/span&gt; 
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;avgs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_paths_discount_factors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                              &lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;low_discrepancy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                              &lt;span class="n"&gt;brownian_bridge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    This function returns a tuple (T_array, S_matrix), where T_array is the array &lt;/span&gt;
&lt;span class="sd"&gt;    of points in the time grid, and S_matrix is the matrix of the spot rates for &lt;/span&gt;
&lt;span class="sd"&gt;    each path in the different points in the time grid.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;hw_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhiteProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_path_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hw_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;low_discrepancy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;brownian_bridge&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;avg_grid_array&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;simps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;avg_grid_array&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;t_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;t_array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; Variance of the integral of short rates, used below&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; 
                            &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="factors-affecting-the-convergence"&gt;Factors affecting the convergence&lt;/h2&gt;
&lt;p&gt;In order to understand the convergence of Monte-Carlo for the Hull-White model, let us compare the market discount factor,  &lt;/p&gt;
&lt;p&gt;$$ P^M(t, T) = \exp\left(-\int_t^Tf^{M} (t,u)du\right)$$&lt;/p&gt;
&lt;p&gt;with the expectation of the discount factors from the sample of Monte-Carlo paths,&lt;/p&gt;
&lt;p&gt;$$P^{MC}(t,T) = E_t\left\{ e^{-\int_t^T r^{MC}(u) du} \right\}$$.&lt;/p&gt;
&lt;p&gt;Here $f^{M}(t, T)$ is the instantaneous forward rate implied by the market, and $r^{MC}(s)$ is the instantaneous short rate from the 
Monte-Carlo simulations. The error in the Monte-Carlo simulation can be defined as:&lt;/p&gt;
&lt;p&gt;$$ \epsilon(T) = P^M(0,T) - P^{MC}(0,T) $$ &lt;/p&gt;
&lt;p&gt;As a first step, let us look at the plots of $\epsilon(t)$ for different values of $a$ and $\sigma$.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Here we vary sigma with fixed a and observe the error epsilon&lt;/span&gt;
&lt;span class="c1"&gt;# define constants &lt;/span&gt;
&lt;span class="n"&gt;num_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;
&lt;span class="n"&gt;sigma_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;timestep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;
&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="c1"&gt;# in years&lt;/span&gt;
&lt;span class="n"&gt;forward_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;avg_grid_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# generate spot curve&lt;/span&gt;
&lt;span class="n"&gt;spot_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;todays_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward_rate&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#initialize plots&lt;/span&gt;
&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;zero_price_theory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;spot_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
                              &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sigma_array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zero_price_empirical&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths_zero_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plots&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zero_price_theory&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zero_price_empirical&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$\sigma=$&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# plot legend&lt;/span&gt;
&lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_label&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;#, loc=0, bbox_to_anchor=(1.1,0.4))&lt;/span&gt;
&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;T (years)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;|$\epsilon(T)$|&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Descount Factor Error for $a=$&lt;/span&gt;&lt;span class="si"&gt;%0.2f&lt;/span&gt;&lt;span class="s2"&gt; and Varying $\sigma$&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
V/wfSyJ8tpTlvpsAAAAASUVORK5CYII=
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The above plot illustrates that for $\sigma=0.01$, the Monte-Carlo model shows good convergence, and the convergence gradually deteriorates as $\sigma$ increases and approaches $a$. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Here we vary a with fixed sigma and observe the error epsilon&lt;/span&gt;
&lt;span class="c1"&gt;#define constants&lt;/span&gt;
&lt;span class="n"&gt;num_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;
&lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;a_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;timestep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;
&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="c1"&gt;# in years&lt;/span&gt;
&lt;span class="n"&gt;forward_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;avg_grid_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# generate spot curve&lt;/span&gt;
&lt;span class="n"&gt;spot_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;todays_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward_rate&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#initialize plots&lt;/span&gt;
&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;zero_price_theory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;spot_curve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
                              &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a_array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zero_price_empirical&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths_zero_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plots&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zero_price_theory&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zero_price_empirical&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;  
        &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a=&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    
&lt;span class="c1"&gt;# plot legend&lt;/span&gt;
&lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_label&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;#, loc=0, bbox_to_anchor=(1.1,0.4))&lt;/span&gt;
&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;T (years)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;|$\epsilon(T)$|&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Discount Factor Error for $\sigma$=&lt;/span&gt;&lt;span class="si"&gt;%0.2f&lt;/span&gt;&lt;span class="s2"&gt; and Varying $a$&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
/HgeAgAAAABJRU5ErkJggg==
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The above plot illustrates that for $a=0.1$ the convergence of Monte-Carlo is poor, and it gradually improves as $a$ increases more than $\sigma$.&lt;/p&gt;
&lt;p&gt;From the plots above, we observe that the convergence is good if the ratio $\sigma/a &amp;lt; 1$, and the convergence detiorates as the ratio $\sigma/a$ increases above unity. Now, let us try to formalize this observation from the theoretical footing of the Hull-White model.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="distribution-of-discount-factors"&gt;Distribution of Discount Factors&lt;/h2&gt;
&lt;p&gt;The Monte-Carlo approach estimates the market discount factor as the expectation of discount factors from each Monte-Carlo path. 
If distribution of discount factors has a standard deviation $\sigma_D$, then the error in our estimate of $P^{MC}(t,T)$  on using $N$ paths will be of the order of:
$$\epsilon(t,T) \approx \frac{\sigma_D}{\sqrt(N)}. $$&lt;/p&gt;
&lt;p&gt;In other words, there are two factors at play in our Monte-Carlo estimate, the number of Monte-Carlo paths $N$ and the standard deviation of the distribution of discount factors $\sigma$. Using more Monte-Carlo paths will lead to improved convergence. But at the same time, 
the $\sigma_D$ has to be relatively small for us to get a good estimate. &lt;/p&gt;
&lt;p&gt;The integral of short rates can be shown to be normally distributed (refer Brigo-Mercurio, second edition page 75), and is given as 
$$ \int_t^T r(u) du | \mathcal{F}_t \sim  \mathcal{N}\left(B(t,T)[r(t)-\alpha(t)] + \ln\frac{P^M(0,t)}{P^M(0,T)} + \frac{1}{2}[V(0,T) - V(0,t)], V(t,T)\right)$$&lt;/p&gt;
&lt;p&gt;where,
\begin{eqnarray}
B(t,T) &amp;amp;=&amp;amp; \frac{1}{a} \left[ 1 - e^{-a(T-t)}\right] \\
V(t,T) &amp;amp;=&amp;amp; \frac{\sigma^2}{a^2}\left[ T - t + \frac{2}{a}e^{-a(T-t)} - \frac{1}{2a}e^{-2a(T-t)} - \frac{3}{2a}\right]
\end{eqnarray}&lt;/p&gt;
&lt;p&gt;Based on this result, the discount factor from the Monte-Carlo simulation of short rates&lt;/p&gt;
&lt;p&gt;$$ P^{MC}(t, T) = \exp\left(- \int_t^T r(u) du | \mathcal{F}_t  \right)$$&lt;/p&gt;
&lt;p&gt;will have a log-normal distribution with a standard deviation &lt;/p&gt;
&lt;p&gt;$$ \sigma_D(t,T) = P^M(t,T)\sqrt{e^{V(t,T)} -1 }$$&lt;/p&gt;
&lt;p&gt;This result follows from the fact that if $X$ is a random process with a normal distribution having mean $\mu$ and standard deviation $\sigma$, then &lt;a href="http://en.wikipedia.org/wiki/Log-normal_distribution"&gt;log-normal distribution&lt;/a&gt; $Y=e^X$ will satisfy:
\begin{eqnarray}
E(Y) &amp;amp;=&amp;amp; e^{\mu+\sigma^2/2}\\
Var(Y) &amp;amp;=&amp;amp; (e^{\sigma^2} -1 )E(Y)^2
\end{eqnarray}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="collapseheader box-flex1"&gt;&lt;span style="font-weight: bold;"&gt;Expand Code&lt;/span&gt;
&lt;div class="input_area box-flex1" style="display:none"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#define constants&lt;/span&gt;
&lt;span class="n"&gt;num_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;
&lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;timestep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;
&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="c1"&gt;# in years&lt;/span&gt;
&lt;span class="n"&gt;forward_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;avg_grid_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# generate spot curve&lt;/span&gt;
&lt;span class="n"&gt;spot_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;todays_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward_rate&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;discount_factor_matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths_discount_factors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;avg_grid_array&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;discount_factor_matrix&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="n"&gt;l1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Empirical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vol_theory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; 
              &lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;l2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vol_theory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;r--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Theory&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;l2&lt;/span&gt;
&lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_label&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Time (Years)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$\sigma_D(0,T)$ (%)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Standard Deviation of Discount Factors &amp;quot;&lt;/span&gt;
          &lt;span class="s2"&gt;&amp;quot;(a=&lt;/span&gt;&lt;span class="si"&gt;%0.2f&lt;/span&gt;&lt;span class="s2"&gt;, $\sigma$=&lt;/span&gt;&lt;span class="si"&gt;%0.2f&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
GxvLxo0b85974403MmTIEOrUqcOnn37K+PHj+ec//5n//Pnz53PaaadRv3592rVrxwcffADAtGnT
6NixI/Xq1aNt27Y8//zzFbRHRMrgyBF4+WX4+99hwQI8h9JI5QSeXdePefPg6FHo2BHuuguuuUYJ
yY2qVEnphhsit67nniv5a4Jda1mxYgXXX389+/fv55577mHUqFGMHDmSDRs2kJKSwiWXXMKll15K
rVo2vf2rr77Ke++9R8+ePbnzzjsZM2YMX3zxRcB1z549m0WLFtGrVy8yMzOZNWtWXr0yK1asYNy4
ccydO5f+/fuzffv2/Oq/Jk2asHDhQtq0acPnn3/O4MGD6dGjB6effnrJN1ykoiQkwJo1eLJz2NH4
NOYd7M9PGSdBzRhatYKLL7akJO5VpZKSkzweDyNGjKBatYJd/sgjj1CtWjXatGnDuHE2W8eoUaN4
6KGHuOeee6hevToDBgwgPj6e9evX06VLFwCGDh3KOeecA8BDDz1E/fr12bZtGy1atCjyviNGjKBX
r14A1KhRo9CyqVOncu2119K/f38Amjdvnr9syJAh+bf79OnDwIED+eKLL5SUxN1iY9k+YBzvftmI
b7c2BqDRcTBiBPTsqdZ00aBKJaXSlG4iJSYmhvnz5xe5pjR9+nSa+NQh1KxZE4Djjz++0GPp6en5
62nZsmX+stq1a9OoUSO2b99eJCn5P9ff1q1bufDCCwMuW7RoEffddx+//vorubm5HDlyJD8pijjq
0CFrqXDccTYst9fevTB/PqxYYfNG1KoFQ4ZAcjJROwJDVVSlklJl4PF4CjXFTk9PZ//+/YVKOeFq
1aoV69evL/J4ZmYml1xyCbNmzWL48OHExcUxcuRINfUWZ23dCh99ZK3pcnIgMRF69eLw0dhCLeqq
VYN+/WwUhtoami7qKClVoEgd1N977z2+/PJLevTowT//+U969eoVsOou0Pv5zEDJtddey8CBAxk6
dCjJycns2LGD9PR0mjdvzrFjx0hMTCQ2NpZFixaxePFiTj311IjEL1Ii6enwwguwZo3dj4mB008n
67zz+WRxDIveJ79F3VlnwUUXWSFKopOSUgUaNmxYoX5KAwYMYPjw4fkND/L43/df9oc//IH77ruP
ZcuW0a1bN2bNmhXwtTExMQHXnfdYjx49mDZtGrfddhubNm2iSZMmPP3007Rv354nn3ySUaNGkZmZ
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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The plot above compares the standard deviation of the discount factors $\sigma_D$ from the closed form expression with a Monte-Carlo estimate. The empirical estimate is in agreement with the theoretical expectation. We can estimate the value of $\sigma_D$ for the asymptotic limit of $T\rightarrow\infty$:&lt;/p&gt;
&lt;p&gt;$$ \sigma_D(0, T) \approx P^M(0,T)e^{f^M(0,T)/a-\sigma^2/(4a^3)}\sqrt{e^{\sigma^2T/a^2} - 1}$$&lt;/p&gt;
&lt;p&gt;The exponential term, $e^{\sigma^2T/a^2}$,  can become very large when $\sigma^2T/a^2$ grows above 1.
Thus we can expect good convergence when  $\sigma^2T/a^2$ remains small or close to zero for the 
time $T$ of interest to us.&lt;/p&gt;
&lt;p&gt;The above result suggests that if the parameters $\sigma$ and $a$ are not chosen carefully, (i.e. $\sigma/a &amp;gt;1$) then the convergence of the simulation would be poor and the results untrustworthy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;This post shows how convergence of Monte Carlo simulations of Hull-White short rate model is dependent
on the ratio $\sigma /a$. You can download the &lt;a href="/extra/notebooks/hull_white_monte_carlo_convergence.ipynb"&gt;ipython notebook on convergence of Monte Carlo simulations of
Hull-White model&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Fri, 22 May 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-05-22:blog/hull-white-simulation-monte-carlo-convergence.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>Option Model Handbook, Part III: European Option Pricing With QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/european-option-binomial-tree-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;I have written about option pricing earlier. The &lt;a href="http://gouthamanbalaraman.com/blog/option-model-handbook-part-I-introduction-to-option-models.html"&gt;introduction to option pricing&lt;/a&gt; gave an overview of the theory behind option pricing. The post on &lt;a href="http://gouthamanbalaraman.com/blog/option-model-handbook-part-II-introduction-to-binomial-trees.html"&gt;introduction to binomial trees&lt;/a&gt; outlined the binomial tree method to price options.&lt;/p&gt;
&lt;p&gt;In this post, we will use QuantLib and the Python extension to illustrate a very simple example. Here we are going to price a European option using the Black-Scholes-Merton formula. We will price them again using the Binomial tree and understand the agreement between the two. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt; &lt;span class="c1"&gt;# version 1.5&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Let us consider a European call option for AAPL with a strike price of \$130 maturing on 15th Jan, 2016. Let the spot price be \$127.62. The volatility of the underlying stock is know to be 20%, and has a dividend yield of 1.63%. Lets value this option as of 8th May, 2015.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# option data&lt;/span&gt;
&lt;span class="n"&gt;maturity_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;127.62&lt;/span&gt;
&lt;span class="n"&gt;strike_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;130&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt; &lt;span class="c1"&gt;# the historical vols for a year&lt;/span&gt;
&lt;span class="n"&gt;dividend_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mf"&gt;0.0163&lt;/span&gt;
&lt;span class="n"&gt;option_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;

&lt;span class="n"&gt;risk_free_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Actual365Fixed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;calculation_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_date&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We construct the European option here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# construct the European Option&lt;/span&gt;
&lt;span class="n"&gt;payoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlainVanillaPayoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strike_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;exercise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EuropeanExercise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maturity_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;european_option&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VanillaOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exercise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The Black-Scholes-Merto process is constructed here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;spot_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;flat_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_free_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dividend_yield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividend_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;flat_vol_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackVolTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackConstantVol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculation_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bsm_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlackScholesMertonProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;dividend_yield&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;flat_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                           &lt;span class="n"&gt;flat_vol_ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Lets compute the theoretical price using the &lt;code&gt;AnalyticEuropeanEngine&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticEuropeanEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;bs_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;The theoretical price is &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bs_price&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre class="ipynb"&gt;The theoretical price is  6.74927181246
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Lets compute the price using the binomial-tree approach.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;binomial_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;binomial_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BinomialVanillaEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;crr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binomial_engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;european_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;binomial_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bsm_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;In the plot below, we show the convergence of binomial-tree approach by comparing its price with the BSM price.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Binomial Tree Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="n"&gt;bs_price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bs_price&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;r--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BSM Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Steps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Binomial Tree Price For Varying Steps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[8]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.legend.Legend at 0x7f0b85fa7510&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
wKLIpxhYA5wV57gy509dvNhxrrjCca66qnLzrwpRlezpft2XdOnSxXn//fcdx3Gc7du3OyNHjnTO
Pvtsx3EcZ+PGjU6zZs2c559/3gmHw862bducqVOnOl9//bXjOI4zYcIEp0ePHk7Hjh2dkpKS0jSH
DBni7L///s5ll10W95wffvih07Fjx9L11157zUlLS3Pmzp0bc6w/XVF+Et1z1PA5pC8EnkuwrxvQ
NfKZCFwJvF7RE8hyEKLiBKcJXbBgAaFQiPPPP59QKESjRo045ZRTOPjgg0t/07ZtWw4++ODSln1R
URGffPIJZ511VrnHkxo8eDDZ2dnMmzcvajrRli1bMmbMGCZMmMAJJ5xQevx3333HKaecQosWLWjb
ti333HMPYPMb/PWvf6VHjx60bNmS888/v3T+B7H3JDsg3QQLRl/u2+ZOlFhl05644hAO22cfDX8u
RPlINFdoopmA4h2/F7MGOQmmCe3ZsyepqamMGDGCCy64gKOPPprs7OyY311yySU8+eSTnHHGGTz/
/PMMHjw4ZoazRITDYSZNmsQvv/zCwQcfzMcff8zMmTO56KKLWLt2LTt37oya7ay4uJj+/ftz4403
8uabb7Jz585SMXv44Yd5/fXXmT59Oq1atWL06NH8/ve/59ln44U3RUVJdjW6BWiJuYxcCogvDJcB
r1TmJK44gKwHIcrCKWOa0KZNm/LRRx8RCoW4/PLLad26NYMHD2bt2rVRaQwZMoTCwkI2bdrEU089
xaWXXrrH865cuZLs7GxatWrFnXfeydNPP81+++0H2NSYv//970lJSaFRo0ZRv3vjjTdo37491113
HQ0aNCAzM5OjjjoKgIKCAu666y7at29Peno6d9xxBxMnTiwddlvsHXViJjj/vVBSAg0a7Lu8CLFH
Ktrqr8K5RRNNEzp37lzatGnDAQccwPjx4wGYP38+w4YN49prr41qjTdq1IiBAwdy5513UlRURJ8+
fXjzzTfLPG/79u1ZtixeT/bo6TuDLFu2jG7dusXdt3jxYoYMGRI1U1paWhpr1qyJml5TVI464YCR
5SBExXGnCU1NTeXjjz+O2b///vtz6aWX8u2338bsGz58OA888EClZ34L5iMRubm5/PTTTwn3TZky
hQ0bNpR+tm7dKmGoIuqcOOzate/yIURtwEkwTej8+fO5//77WbFiBWCt9ueee640JuGnb9++vPfe
e4wePTqpeR04cCCrVq3ioYceYseOHRQXFzNz5kwAfve733HLLbeUzpy2bt06Xn+9wv1ZRALqnDj4
l4UQsSSaJjQrK4uZM2dy9NFHk5mZSZ8+fejVqxf3338/EDvl5UknnUTz5s3j7gtS2Wk0s7KyePfd
d5k8eTLt2rWjZ8+epe85XXPNNZx11lkMGDCApk2b0qdPn1LhEHtPnZgmdOZMGDfOlu+4A9q3r6Zc
CREHTRMqqhtNE5oAuZWEEKJqqXPioIC0EELsPXVCHIJdWYUQQuwddUIcZDkIIUTVInEQQggRg8RB
CCFEDHVi+AyJg6hJZGdnl9nnX4iqxj9AYlUhcRCiiikqKtrXWRBir5FbSQghRAwSByGEEDFIHIQQ
QsQgcRBCCBGDxEEIIUQMEgchhBAxSByEEELEUOfEQUN2CyHE3lMnxEGjsgohRNVSJ8RB04QKIUTV
kmxx2B+Y5ftsBK4OHHMxMAf4GvgY6FXRkyjmIIQQVUuyx1aaDxwWWU4BVgCvBo75CTgRE47TgMeB
YypyEsUchBCiaqnOgff6AwuBZYHtn/iWPwM6VjRhWQ5CCFG1VGfM4QLg2T0cMwp4q6IJK+YghBBV
S3VZDg2AM4GbyjjmJGAkcFy8nWPGjCldzsvLIy8vr3Td31tJbiUhRH2lsLCQwsLCKkmrumYkGQxc
icUU4tELeCWy/8c4+x3HcRImfvfdsHSpLXfqBLfeujdZFUKIukFk0qlK1fPV5Va6EHguwb5cTBiG
EV8Y9ohiDkIIUbVUh1upCRaMvty3LT/yXQDcDmQDj0a27QKOqsgJJA5CCFG1VIc4bAFaBrYV+JZ/
G/lUGomDEEJULXXuDWmJgxBC7D0SByGEEDFIHIQQQsRQ58Rh1y4oo9erEEKIclDnxAGiX4oTQghR
ceqUOKSm2rdcS0IIsXfUenFwHE8cGjSwb784rFsH//oXLFpU/XkTQojaSp0QB4CUFE8c/OMrzZkD
33wDn35a/XkTQojaSq0XB79LKS3ySp/fctixw763b6/efAkhRG2mToqDP0AtcRBCiIpTJ8XB71Zy
xcH9FkIIsWfqpDj43Uo7d9q3LAchhCg/dUYcUlIkDkIIUVXUGXFQQFoIIaqOOi8OshyEEKLi1Btx
2LFDYy4JIUR5qfXi4I6jtCe3UjjsCYUQQoiyqfXiUF7LAdSdVQghykudEof0dFtOJA6KOwghRPmo
M+KQkhJ/VFa/tSBxEEKI8lFnxCGeW8lxZDkIIURlqFPiEHQrlZRE91CSOAghRPmoU+IQHFspGIBW
QFoIIcpHMsVhf2CW77MRuDrOcf8EfgDmAIdV9CRljcoaFINt2yqauhBC1E/Skpj2fLzKPgVYAbwa
OOYMoAewH3A08ChwTEVOUtZ7DsH3GmQ5CCFE+agut1J/YCGwLLD9LOCJyPJnQHOgTUUSLsutFBSH
eDEHzTcthBCxVJc4XAA8G2d7B6IFYznQsSIJl9VbKWgpBMXh5ZfhhhugqKgiZxRCiLpPMt1KLg2A
M4GbEuwPBdbjjoA0ZsyY0uW8vDzy8vKAssVhT5bDDz/YtqVLISenrEsQQoiaT2FhIYWFhVWSVnWI
w+nAl8C6OPtWAJ186x0j22Lwi4OfvRGHzZvtu7g4fsaFEKI24W84A4wdO7bSaVWHW+lC4LkE+14H
hkeWjwF+AdZUJPHyuJWaNIled9myxb4lDkIIEU2yLYcmWDD6ct+2/Mh3AfAW1mPpR2ALcFlFT1Ae
y6FpUxMCv+UQDsPWrbYscRBCiGiSLQ5bgJaBbQWB9av25gTlFYdVq6LFwbUaADZt2pscCCFE3aNO
viEddCs1a2bffnFwrQbwYg9CCCGM8ojD/sD7wHeR9V7ArUnLUQXxj8paluUA0eLgFwS5lYQQIpry
iMO/gVsAt+/PN1iQuUZQHsshnjj43UoSByGEiKY84tAYe3vZxQF2JSc7Fac8MYfMTLMsdu3yhtvw
i8PmzZpfWggh/JRHHNZh4x+5nAusSk52Kk5ZQ3a7lkODBtCwoS271oPfrRQOR4sF2CB9GotJCFFf
KY84XIX1MNofWAlcB1yZzExVhPIMvNewITRqZMuuOATFwO9a2r0b7rgD/vrX5ORZCCFqOuXpyroQ
OBnIxMSkRnX89FsOwWlCXXFo0KB84tCunS1v2AAbN9pn2zbIyEhe/oUQoiZSHsvhHmy01M2YMGQD
dyUzUxWhvG6lROKQEikBv+XgH4hv/fqqz7MQQtR0yiMOp2PDWrhsAAYmJzsVJ15X1uCQ3fHcSm7M
oVUr+/a/CCdxEELUd8ojDilAI996BjbSao0gnltp927rfVSemEPbtvbtD1BLHIQQ9Z3yxByewV6C
+w82vPZlwJPJzFRF8ItDKGTfu3fbJ55byd3mikObyNRCidxK6+KNJSuEEHWc8ojD34CvsQH0HOB/
gXeSmamK4BcHsLjD7t0Wd/AHpINdWV1xcIPQfnH4+WdvOZ7lsGaNzf/gxjiEEKKuUd6B996OfGoc
/q6sEB13SNRbyd2XlgYtI8MCljfmsGAB3H8/nHIKnHtu1V6LEELUFMqKOXwc+d4MFAc+NaY7a9By
cMVh2zaLO6SnW7DaLw5ufKFJE8jKsmV3m+NEi8PPP3sCBPD99/b93XcIIUSdpSzL4bjId2Z1ZKSy
JBIH123UIBI694uDu88vDq5baetWsyoyMuy37vsO2dm2f/ly+1692uIXrrtKCCHqEnvqrZQGfF8d
GaksicTBHZLbrbz9AWlXHDIzTSBSUmxbSYlnNeTkeC4nf1DaFYdw2FsWQoi6xp7EoQSYD3SuhrxU
ij2Jg2s5uCKxbVu05RAKmUiAuZbiiYMbd9i2LTpYvWRJdF5++QU+/jjaDSWEELWR8gSkc7C5HGZi
M7uB9Vo6K1mZqggVdSvt2BEdcwBzLW3aZK4lvzi4ouGKQ9BSCIrD88/DrFm2fNxxCCFEraU84uBO
7BPybasxA1xX1K3kjzm4lb8/KO1aBjk53gxyrltpxQr7bt8eVq6EpUu9fJSUwNy5tjx7tsRBCFG7
KUscMoDfYcN1f429BFdj5nFwifeeA3gCUJY4NG5s3/6gtN9ycIPQQcvhmGNg0qTooPTChd4LdvPm
KVgthKjdlBVzeAI4AhOGM4D7qiVHFSQoDu53MOYQrytr0HLYtKnsmIMrDl27mvUQDsOyZbbN37V1
1y4TCBfHgYcftiHA3UEBhRCiJlOWOBwIDMPmchgKnFgtOaoglenK6gqHP+YAsZZD8+aW3qZN9jvX
rdShA3SOhOhd15IrDgceaN9z5nh5/O47+PZbWLQIZszYu+sVQojqoCxxKEmwXKOoTFfWYEDanWPa
ncchJcWEIRSCFi1s37x59v5Ddrb9LjfXti9ebL2Uli83ITrnHNv+zTder6X33vPy+847Xp5dliyJ
nt9aCCH2NWWJQy+i34o+mIq/Id0cmAjMA+YCxwT2twSmALOBb4ER5Uy3FP+Q3RAbc3Ath5QU2xcO
mwiAJw6ue8l1ETVv7qXnDuk9e7Z9d+xo337LwQ1EH3AAdOpkvykuNkth2TITlkaNoHVrc1HNnOnl
f9o0+Mtf7BOcgEgIIfYVZYlDKpDl+6T5lpuWM/2HgLcwF1UvTCT8XAXMAg4F8oD7Kf94T0D5Yw7g
WQ+/RGanCMYcVq+275wc7zdu3OGbb+zbFYcOHexcq1fDV1/ZtoMOMmvjkENsfc4cz2o47jgYGJkF
4+23TaThT7GwAAAey0lEQVQWLoQXXrBta9bAY49FxyR27zaLxKkxfcOEEPWF8sznUFmaASdgvZzA
XFMbA8eswhOapsDPVNCFlWjgvaBbCTxxcH8T7K3kbo8nDm6rvkMH+05Pt6C043jCcdBB9u2Kw8yZ
8PnnZoX06we9e1t6a9ZAYSEUFJgA9Olj3WYXLIBnnrE0Z82CsWPhzjvhrrvMcpFICCGqiwq10itI
V2AdMB44BPgSuAbY6jvm38AHwErMIjmvoidJ1JXVPyKrS6NG0cuukDQN2EHxxMHFtRzAXEuuK6p1
a88F1b27uaxc99URR3jpnHYaPP20ZzH07AmXXGIWwn33WcB64UITEPe6li+HRx+18x1wgCcSjuN9
0tPh0EOtJ5W/bObMsRjLccd5ZeT+9ptv7Fr91wQmkosW2fnSAneI45jLLFhm7u9CIfsIIWo3yRSH
NOBwzHX0OfAP4Gbgdt8xt2DxhjygO/AuJiTFBBgzZkzpcl5eHnl5eThObMwhWJn5LQf/cmZm9Pa0
NM+l4xcHt8IHq4DdyYHAKs+PPrJl12oAq4R//Wv47DNb79/f29enD7z5pglH8+Zw+eV2fOfOMHKk
uZbWrLH8nXWWvVPx8cfmilqyJPatbD9TpkCXLtC3r73M99//WoAdzIr57W/tnFu3wlNPmTssPR2u
vtpECqw8x42DL7+0a7jqKq+yLymBhx4y8fqf/7H9Llu2WFfdRo3gxhuj57pYuRL+/W84+WQ4/vjo
PM+da/k8/3zLm5/PP7dA/QknRG93HMt7586x4r17t5VR166xIlVSYh9/I0GIukRhYSGFhYVVklYy
xWF55PN5ZH0iJg5+jgXujiwvBBYB+wNfBBPzi4OL36XkVgRBcfBbDhkZ3rLrUgL7bVaW19JPZDm0
b++JEHg9liBaHAAOO8zEoUcP6NbN256WBuedB2+9BcOGRbfADzsMrrjCgtYnnujlt18/q1Q//9xa
7e61uq30UMjy/skn1ntq8eLoPG/ZAj/8AHffDWeeaT2m1q+3a9m1Cx55BK65xoTlP/8xYQDrfvvG
G/Ybx4HnnjPXF8CTT8Idd5iF5DhmDa1da/veeQcGDbLlcBieeMIE4sUXTVBcEdi61c5XXGxiMnKk
l+8VK2xfOGwTMvXo4e377DMYP96u7fbbo0Vg4kT44AMr45NP9rY7DvzjH5aP22+PFqLNm81q228/
uPji6P9x2TK77qFDzSL08/XXNoT7kCGxEz/NnGn3lNu12Z+PWbPMAvTfg2DW7vr1dl1B3HnRNcGU
KAu34ewyduzYSqeVzJjDamAZEGmT0h8bo8nP95HtAG0wYfipvCcIupSgbHFIZDmAF3cAr/sqWCvT
PTbofunY0R7wjAyv5e1y6KHwu99Bfn5svg8/HG691SrjIEccAaeeGi1k7nUcd5y5pU491T4DBtik
Q/37w29+A3/7GwwfDvvvD0ceCTfcYBXhrbdaZbRpk8U01q+3c48dC0cfba3zf/4T/u//4Isv7JqH
DjXxeOMNqwSnTTMrKT3drnvjRnj2WcvbjBnWknfL+u23PbfYBx94YrVjB7z2mndNb7zhDZU+c6bn
ogN45RVP/CdN8lxpJSXw+uu2vHKl1xkAzFqaNs2Wp0zxKlQwF9oPP5hQvv9+dNm+/z6sWgXTp9u3
n5deMkvppZeiYz47dsCECfbbTz6J/s3ixWZ9PfJI9NzkbnkUFJiYBnniCftPvv02entJicWexo6N
viawcr7xRrNGg8yZYw2C4DW51/zCC7GDRIbD9r/MC3YdwcT8vffid7tevx7mz4/d7uZxU4L+jRs2
xI+lOY4GsNzXJFMcAEZjc1DPwXor3QPkRz4AfwGOjOx/D7gRKIpNJj5BlxKU7VbyuxPcbqwu/ha8
33IAz3oIikNaGvzhD/ZwBofKCIXMEojnm08W6ekmINdfb+6qnj0tH02bmmUwcKDl8+ST4Y9/tDjJ
iBEmVtu2WQXaqJEdO2AAnH22pTtunBcjufRSuPJKS+eLL0wI3H0XXwzHHmuV2XPPWYUxaZLtO/98
Ky/Xulm5Ej780P67gw+2ysAVjrlzrYLMyLD/acECr+L5739NBNwW9JtvepXL229798SmTd4Lh44T
XXlOn+51WNi+3fLh8u673vLixd55Fy2Cn3zNlhkzvE4K778fXcG5PdR27fLcjmCVnStMs2bFzlXu
Wmz+92LAynnNmuhjXKZONaF+5x37D10cB15+2bpav/VW9G+KijwLKzhp1eefw+TJ9p8H3+Z/+WUT
yVdfjd7uONa4eOCB6DICuwfuvNMss2Bl/+WXcPPN9r8FeekluO66WGELh+HBB60hExSVn3+Ge++1
awjy/ffmst0Y7BKD/UfvvBObXjhs5eu3xF22bLFOJW5s08/atdYQiceKFfGF0nGs52M8oQyHo//b
4O+S1VEl2eIwB+iNxRHOAX7B3rguiOxfD5wZ2X8w8GxFEq+o5VCWOLiWQ0ZGrE/64IMtnaDrCKz3
Ujw3QE0jJcViGA89ZC4Xt5xSUmDUKLM0mjWz+IPrBhswwIRj+3a7QU87zetx9Zvf2DGvvWat6COP
NCtk6FCztObNs+lUd+60ff36ebGXF1+0EWzDYXOfjRhh5f7tt/a7l1+2404/3SwjMGthxw6vorvs
MnshccUK68n1889WYaekwODBdoz7wuHcufaAZ2WZe2r7ds/CmDbNHrz27U1IP/vMq0CmTrVv995w
K+1w2FtOS7OH2q1ki4qiK/DCQu8+dfPppuHmAUyg3Id83jyvUnQcq8T96bls2eLFtXbsgE8/9fbN
netZb19+GV0hTZ/uVdT+PPjTLy72RhgGE1P3/ZxPP/XGEQueK+junjbNRHLNGu99IPe6pkyx5Q8+
iBai4mL7XVC4wayh77+37x9/jN43dapZeS+/HC1EjuONmOye02X9erPiXnnFfutnxgxLy+1V6OfZ
Z60BFBTKXbvsvr/vvtj0liyxnof33RcrvB98YG5a1yr2572gwBqg/oE+wf6T226Dv/89Nn9VQbLF
IakEu7FC+S2HoFvJXQ9aDWD+83/+MzoYXVuJ15MoLc0sjb/9LdqvHgqZpXDIIRbkditdsBiIG5DO
yTGrwZ0bY+hQ215UZCJ8/vm2fvrpZsUsXGgtcjfonplpbjKwB2H5ckuzXz/7ZGbabx57zCq5rl1N
tE47zX7z5pv22b0bjjrKtrdtaxXxzJmeoJxyihcL+eADz00CJnaHHWYP7YcfWuvvq6/s3ho92r5n
z7bKZNYs+27d2kvPtQg++MDuy6OOsjxs2OC9QOkec/TR9v3RR1aZbN9unQ7A4h7gVbI//WSVijsx
1aJFXkvW/b17706b5gmMW6k2aGDl4qa/a5dZX2BC+u233thhS5dGt/z9wjFjhtdK3r7dE6XgcV9+
6bnSdu2KHi5m+nRveckSr7ILCtHHH3uV52efRbux/Gn4l/3iuGGD170crBXviu2MGdHpFRZ6Zea3
Gh3HWy8qirZG1qzxGgD+Th/uuvselWs1u7z2mt0ba9Z4/wFYeU2ebMtTp0ZPLvbNN3b/7NxpguS3
El57zY5duDDW2qwKarU4JMNyiCcOUD+6Z8a7xkaNrGfSRRdFu+9CIWvxn3SS7fcHV/v0sbgHWKXr
utYaNfJcVWBi4/4P/fqZ5eKaz26Qt2FDExXwWp5nn23nP+44CywvW2YVSkqKuc5SUjzheOkla2E2
aWICd8AB1pFg0yb417/sOzfXAseulTJtmvndHcd6i3XubJW96xZyLYr+/c3yadDA8vbTT54bqX9/
uyaw3yxebPlo3NiEtHNnqxQ+/9yrsHr2hAsvtN98+qltc62GE04wlx1YhRYOewIyfLiVw6pV5oJb
t84q/fR06/QAnrXgVt65uWYFOo5XUbnpHX+8/Vc//GDuP8fxBODII730HMcE+Ouv7bnr3t0qdTcG
456rbVt7Rr/5xnOluem58T23og+HvfxkZloZuBbL2rVWzu688F9+GR2z2r7dqwv8wuFeV0qKHePm
b8cO7/9KSTFrxO1U8c03ZhG66U2Z4lXMrgsqNdUE0BWRXbs8yyQ11RpA7pzzCxZY3t303njDE6m3
3rL7PjXVyu+VV2x7SYndv27+/GOzLV5s1+g+k2+84Yl8VZHM3kpVS5zI7u67zTsVFIeLp3vHNv0j
4M4Gd3FB6fYoccjPp3cRZHwLuUsAt9VRUEBc4kWZ6+HxWQUFXHBB7PbQ7/K5ere1zJtOACZ46ffp
Y24Tx/F1a83PpyFw3SqrkLKy4ND/Bxxl+enb1/OtH3ggHPCg5ScduHqFZ77/dFMBrVvb8lFHmYle
VGT3Q+cu0Oga23fFOsvDMxHv5umnm9h062YV3DHj82EK9AjBkVuBj+HcLfBJkwKmTbNGSWamiWCD
BnD13HxWrYS1n8I5O6FZc+j8F2j7zwJefdXy98wzdu7jj4eGV+czao1VHo2+gvTdcPE2yPpdAR06
mEgsWGC++K++gmH/zeeoHVZxtv4CUj6CNa9CUVu73l69TCAnT7aK8JSJ+Vy03CzdnuMg5YtITOmC
gtKKMi/PKu3PPoO2d+Sz83XoNhO6hKH3NjhmBdzXw663Vy+rNHNyzJL89cP57JoOxd/BpiK4aCm0
bgM78wt45BGr+Pv39wTgytn5/PKLpbHpIshqD90/gxnHF3DlleZmWbDAxG39ejj1lXwaNYLOXWD+
95D5FTiHwfQBBaX/bXGxidKMGTDg5XyazIKLN0P3HrDoJwj/F9ZfWEB6urW8U1KsofLCC5D5h3yc
I+Dn1XDOD9Z4adwY7u9ZwPvvm0C7Ff7gwdD85nx2bIeib6FJJnT9HLo60PipAh5/3K7z1FNN6Ddu
hPyv8mnZ0irw7bPBOQS2zgEOLWDgQHNBLlxo93SfPtBubD4XO/Drg2DuPAhPh18+hJkjC1i71v6n
006zDhCvvAJHjctnw7dwUTF07AQ7d1jZPrtfAaNHV11Dts5bDv59ZVkO2dlwZG/onIuoAtJSoWlW
7PaUFHvf4vLLoy0RsIfgoIO8YUhc0tPtgc3NtXhJ1G/aQcNGntXgkprquarS0qLjQi1ber3B2rY1
d5KLaz2AtWpdiyiziQmTe8/l5XlWaYdI2q7bpWPkLfqGDT0BXLrU8njSSbbeqhWkN7CW9bZtdm+6
b9a7x0yZYoLQsqWllZFhFXQ4DAt/9PIRCtl5XNeXOwyMG0dp187WJ0601meTJlbBdutmnSx27bJW
bThsz0FGhvebTz/1Ksq+fe2a27a19RUrfOdqZ27GnByzXKZONUsqI8Ou1U1v9Sr7TThs/3OnTpYX
MIvBFZR27aBVS/vvN2+Gjb4OBn37msXm/mZTsR2Tng7t2kbeTXLMKvj4Y/vPDjnEyio7G7ZthQ2/
wErfKMvuyAczZljlvWCB5b1vX+//XLoMViwHJ2znOOIIS3fnTmv9u1ZD586WXnq6WaYLF9p3ZqZ1
BnHdru++GxkRIWxCnpNj5QH2/7qdKM47zyzYnj3tOufMMXFs2NDqq27d7B7/7jvrvFBV1BZniePE
CcmvXGnd+9q3t2AOmDn98MPeMY895lU0X39t3QsB/vSn+F1JRe3jl1/MRRCMCZWUmF92v/28itfl
yy+tJfbb30bvC4ftnnK7iPrfUXHvrfR0uOee6O7PDz9s+9u0sd+799z69RY0DIfNJXP55d5vXn/d
qwDOPdcTpnAYbrnFe+/mxhu9WJD//m7Y0OJErtA9/rjnC+/WDW66yZa3bLFltxvsgAFeBTV9umfV
gLkI3fK4917PKktLs5ccs7Ks8r/1Vu83nTrBn/9s1/zWW+ZrD4XMOjz5ZKvcHMfKZdUqK79du7xz
LVtmgdpGjex/TE31zvXyyyY0zZvb/9yliz274bCds6jIxGr1amsMnHOO5fnee80iSE21crz2WhP3
KVMsiJyTY7/NzrbuvqmpFlf87jvLx/btXjnt2GH/x+bNJvDhsP2nHTuadXDPPfHL4r33PLcQmOXi
dsp49FEvFpWebj26srNNaG6/3fvve/WC3//ellessHJyY61XXGECBSaETz1l1zx2rNeoCdmNWKl6
vk5bDg0aRLdAy7IcRO2lefP4nQXS0qzSDQoD2EP18MOx+1JSrAvlzTdHCwNYS/ecc+xlvayAVTR4
sLV2zz03+p5r2dIC0GlpVtn4OfFEqxgaNYqeVjYlxWsZ5+ZG5+Ogg7y39vv0iX4fxvfuU6n1AXav
9+5ty6GQtYZdjj7aey5atLCeeS7+4444wrvmVq2ie+651gt4w7S4bTk3jVDIu6Zdu6xyds/VqZN1
Mti+3X7nP5f7drwb5HXTSEnx9q1eHZ1+t27Wct+0ySrZNm0s1gRmYaWne7GPvDyv/nDF2Y1duDGj
hg295XDYKmy3W3uXLtEjBZx5plcWfft6L1tmZ0eX55AhnuXcv78366R/2P/UVLufXDp08P7XX/3K
OmW4HHec9cTbtCl+V97KUOfFwY/EQZSH5s3jW5WhkLVO/Q+lS24ujBljFUeQSy6xlqw7zLv/PDfe
aK364NvS/fubm2zEiGixCYXgggusQnKD7i777Wfn79YtNo/9+lmleOSR0W/9N2zoCdNJJ0W7+g4/
3Kuk/cIDXkWXkeEJD1ingkMPteUDD4wW7WOO8Z7JE06IPpe/4vQvt25tFSFYGfnP5R8v7KCDvOsK
CuCJJ3plmJnppZGeHj2cywEHeO6l3r29Ctu9frfnY7DcBw2ya+naNfr/T0+3yj011awG/9vtbdua
CBxySGx6vXvbvlGjYhs955xj98Rvfxt7XwwbZi/euiK5t9SegHQcKisOKSmxbyALkSxSUxM3RnIT
xLgaNLBuvvH49a+jW6suoZDnggjSqZM39lWQc86xSs3tYeaSnm7deIuKYq2oXr2s9duhQ+wLoIMH
m3UQzH/jxtaynj07tgI74gjzwWdnx55rwADr9dOvX/Qz3ayZVaSffho9VAqYReR2He3TJza92bNN
QPxd2kMh65U3dWps3ps0sbLYtCl2GJWuXa1hkJUVGwzu3Tta0Pycckp0jMufDzdeFiQtLfZ6XNq1
82I7VUGtjjksWGAvnPTsaUNFgPWRv/NOW27Xzv40ly1b7Ljmze1BEULUDrZutQZdsPLdtcvEK55b
ce1ac1PVhfeTKsvexBzqnOXgN92ClkOTJmaqNWuW/LwJIaqOoNvNJThSsh+3W7OoHHVOHPxupaC5
C4lNPCGEEB51LiDtXw5aDkIIIcpHnRAHf6+HstxKQgghykedEIeKuJWEEELsmVotDnsalVWWgxBC
VI5aLQ7xLIeUFK+7mywHIYSoHHVOHEIhz3qQ5SCEEJWjzokDSByEEGJvqdPiILeSEEJUjjohDsF5
AWQ5CCHE3lEnxEGWgxBCVC21WhzidWUFWQ5CCLG31GpxUEBaCCGSQ7LFoTkwEZgHzAWOiXNMHjAL
+BYorEjiicTBP/uSEEKIipPsUVkfAt4Czo2cKzjlSXPgEeBUYDnQkgqQSByGD7d5bjVkrxBCVI5k
ikMz4ATg0sh6CbAxcMxFwMuYMACsr8gJEolD06b2EUIIUTmS6VbqCqwDxgNfAf8GglN27AfkAB8C
XwCXVOQEicRBCCHE3pFMyyENOBy4Cvgc+AdwM3C775j0yDEnY8LxCfAp8EMwsTG++T7z8vLIy8uT
OAghhI/CwkIKCwurJK1kziHdFqvsu0bWj8fEYZDvmJuADGBMZP3/AVOwILafuHNIT5gAn3wCI0Yk
nnRbCCHqK3szh3Qy3UqrgWVAz8h6f+C7wDGTMNFIxSyHo7FeTeVCloMQQiSHZPdWGg08AzQAFgIj
gfzIvgLge8xS+BoIY3EJiYMQQuxjki0Oc4DegW0FgfX7Ip8Kk2hsJSGEEHtHra5WZTkIIURykDgI
IYSIoVaLQ6KB94QQQuwdtVocZDkIIURykDgIIYSIQeIghBAiBomDEEKIGCQOQgghYqgT4qCX4IQQ
omqp1dWqurIKIURyqNXiILeSEEIkB4mDEEKIGCQOQgghYpA4CCGEiEHiIIQQIgaJgxBCiBhqrTg4
jteVNZTMmbCFEKIeUmvFwW81SByEEKJqqRPiIIQQomqROAghhIhB4iCEECIGiYMQQogYJA5CCCFi
SLY4NAcmAvOAucAxCY7rDZQA55Q3YY3IKoQQySMtyek/BLwFnBs5V5M4x6QCfwOmAOXulCrLQQgh
kkcyLYdmwAnAfyLrJcDGOMeNxqyLdRVJXOIghBDJI5ni0BWr8McDXwH/BhoHjukADAYejaw75U1c
4iCEEMkjmW6lNOBw4Crgc+AfwM3A7b5j3G0O5lJK6FYaM2ZM6XJeXh6dO+cBEgchhHApLCyksLCw
StJK5sATbYFPMAsC4HhMCAb5jvnJl4eWwFbgcuD1QFqO40QbFT/+CH//O/ToAX/8YxXnXAgh6gAh
G1uoUvV8Mi2H1cAyoCewAOgPfBc4pptveTwwmVhhiIvrVkqptZ1xhRCi5pLs3kqjgWeABsBCYCSQ
H9lXsDcJqyurEEIkj2SLwxzsHQY/iUThsookrIC0EEIkj1rrlJE4CCFE8pA4CCGEiEHiIIQQIgaJ
gxBCiBhqvTioK6sQQlQ9tbZqleUghBDJQ+IghBAiBomDEEKIGCQOQgghYpA4CCGEiKHWikPnznDS
SdCt256PFUIIUTGSOWR3VRIzZLcQQoiy2Zshu2ut5SCEECJ5SByEEELEIHEQQggRg8RBCCFEDBIH
IYQQMUgchBBCxCBxEEIIEYPEQQghRAwSByGEEDFIHIQQQsRQHeLQHJgIzAPmAscE9l8MzAG+Bj4G
elVDnoQQQpRBdYjDQ8BbwIFYxT8vsP8n4MTIvjuBx6shT7WWwsLCfZ2FGoPKwkNl4aGyqBqSLQ7N
gBOA/0TWS4CNgWM+8W37DOiY5DzVanTje6gsPFQWHiqLqiHZ4tAVWAeMB74C/g00LuP4UZiVIYQQ
Yh+SbHFIAw4H/i/yvQW4OcGxJwEjgZuSnCchhBD7mLbAIt/68cAbcY7rBfwI9EiQzo+Ao48++uij
T4U+P1KDmQ70jCyPAf4W2J+LXUCwF5MQQog6zCHA51h31Vewrq35kQ/A/wN+BmZFPjP3QR6FEEII
IYQQtZnTgO+BH6h/gepOwIfAd8C3wNWR7TnAu8ACYCpmidUXUjHrcnJkvb6WRfDF0qOpv2XxJ+wZ
+QZ4FmhI/SmL/wBrsGt3Keva/4TVpd8DA6opj0khFYtFdAHSgdnYi3T1hbbAoZHlTGA+dv33AjdG
tt8E/LX6s7bPuB54Bng9sl5fy+IJrGcfWI/AZtTPsuiCvUTbMLL+AnAp9acsTgAOI1ocEl37r7A6
NB0rtx+pxcMn9QGm+NZvJnE32PrAa0B/TPXbRLa1jazXBzoC72Fdnl3LoT6WRTOsQgxSH8siB2s0
ZWMiORk4hfpVFl2IFodE1/4nor0vU9hDJ6CarBwdgGW+9eWRbfWRLlgL4TPsj18T2b4G70ao6zwI
/BEI+7bVx7KI92JpE+pnWRQB9wNLgZXAL5hLpT6WhUuia2+P1aEue6xPa7I4OPs6AzWETOBl4Bqg
OLDP7ctc1xkErMXiDaEEx9SXsijPi6X1pSy6A9dijaf22LMyLHBMfSmLeOzp2sssl5osDiuwoKxL
J6KVrz6QjgnDU5hbCaw10Day3A6rNOs6xwJnYS9UPgf0w8qkPpbF8sjn88j6REwkVlP/yuJIYAbW
Fb4E6yrfh/pZFi6Jnolgfdoxsi0hNVkcvgD2w1oFDYDz8QKR9YEQMA7rjfIP3/bXsaAbke/XqPvc
gt3YXYELgA+AS6ifZbEac7e6L5b2x3rrTKb+lcX3mN88A3te+mPPS30sC5dEz8Tr2LPTAHuO9qOW
v1N2OhZw+hELqNQnjsf867PxXhA8DQvCvUfd76aXiL54jYT6WhbBF0ubUX/L4ka8rqxPYNZ2fSmL
57BYy06swXAZZV/7LVhd+j1warXmVAghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIURl+TM2RPoc
7N2So7ChSzL2ZaaEEELsO/pgwzGkR9ZzsDF7FgEt9lWmhNgX1OThM4SobtoC64FdkfUi4FxMID4E
3o9sH4CJyJfAi9ioqACLsTnSv8ZG0O0e2f4b7A3e2cC0ZF6AEEKIqqcJ5kqaDzwCnBjZvgizIgBa
YhW862a6CbjNd5w7zMslePNOfI0NggbQNBkZF0IIkVxSsPGbxgCrgBFEi8MgbD4Fd7yr77A5FYgc
1yWynI5ZIQCPYuPc/NaXjhBCiFrKUKz1HxSHZxMcHxSHdb59RwFjA2kJUWNRzEEIj57YUMYuh2Fx
hGI8d9BnwHF48YQmgd+c7/ueEVnujg2PfAcmGB2rON9CVDlp+zoDQtQgMoGHsWGOS4AfgCuAi7A5
d1cAJ2OupufwJrb/c+RYsPmM5wDbgQsj2+7FBCSEDaf8dXIvQwghRE1CLiNRZ5BbSYiqo77OVSyE
EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBVxf8HS2Sg2lqUPnoAAAAASUVORK5CYII=
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;This post shows how to price European Options using the theoretical and binomial-tree methods in
QuantLib Python. You can download the &lt;a href="/extra/notebooks/european-option-models.ipynb"&gt;ipython notebook on European option pricing with QuantLib&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Fri, 08 May 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-05-08:blog/european-option-binomial-tree-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category><category>option models</category></item><item><title>Hull White Term Structure Simulations with QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/hull-white-simulation-quantlib-python.html</link><description>&lt;p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The Hull-White Short Rate Model is defined as:&lt;/p&gt;
&lt;p&gt;$$ dr_t = (\theta(t) - a r_t)dt + \sigma dW_t $$&lt;/p&gt;
&lt;p&gt;where $a$ and $ \sigma $ are constants, and $\theta(t)$ is
chosen in order to fit the input term structure of interest rates.
Here we use QuantLib to show how to simulate the Hull-White model
and investigate some of the properties.&lt;/p&gt;
&lt;p&gt;We import the libraries and set things up as shown below:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The constants that we use for this example is all defined as shown below.
Variables &lt;code&gt;sigma&lt;/code&gt; and &lt;code&gt;a&lt;/code&gt; are the constants that define the Hull-White
model. In the simulation, we discretize the time span of &lt;code&gt;length&lt;/code&gt; 30 years
into 360 intervals (one per month) as defined by the &lt;code&gt;timestep&lt;/code&gt; variable.
For simplicity we will use a constant forward rate term structure as an
input. It is straight forward to swap with another term structure here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="n"&gt;timestep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;
&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="c1"&gt;# in years&lt;/span&gt;
&lt;span class="n"&gt;forward_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;todays_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;todays_date&lt;/span&gt;

&lt;span class="n"&gt;spot_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlatForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todays_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward_rate&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;hw_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HullWhiteProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spot_curve_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianRandomSequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniformRandomSequenceGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UniformRandomGenerator&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GaussianPathGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hw_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The Hull-White process is constructed by passing the term-structure, &lt;code&gt;a&lt;/code&gt; and
&lt;code&gt;sigma&lt;/code&gt;. To create the path generator, one has to provide a random sequence generator
along with other simulation inputs such as &lt;code&gt;timestep&lt;/code&gt; and `length.&lt;/p&gt;
&lt;p&gt;A function to generate paths can be written as shown below:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;sample_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sample_path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
        &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The simulation of the short rates look as shown below:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hull-White Short Rate Simulation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The short rate $r(t)$ is given a distribution with the properties:&lt;/p&gt;
&lt;p&gt;$$ E\{r(t) | F_s\} = r(s)e^{-a(t-s)}  + \alpha(t) - \alpha(s)e^{-a(t-s)} $$
   $$ Var\{ r(t) | F_s \} = \frac{\sigma^2}{2a} [1 - e^{-2a(t-s)}] $$
   where 
   $$ \alpha(t) = f^M(0, t) + \frac{\sigma^2} {2a^2}(1-e^{-at})^2$$&lt;/p&gt;
&lt;p&gt;as shown in Brigo &amp;amp; Mercurio&amp;#39;s book on Interest Rate Models.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_paths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The mean and variance compared between the simulation (red dotted line) and theory (blue line).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;r-.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b-&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Variance of Short Rates&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[8]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.text.Text at 0x7f555d561ad0&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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
rkJggg==
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[9]:&lt;/div&gt;

&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight-ipynb"&gt;&lt;pre class="ipynb"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;forward&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestep&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;r-.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forward_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b-&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mean of Short Rates&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[9]:&lt;/div&gt;


&lt;pre class="ipynb"&gt;&amp;lt;matplotlib.text.Text at 0x7f555d6a9e10&amp;gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXUAAAEKCAYAAADticXcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
AAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VFWe9/FPZSMJSSAhECALYQn7jmyKEAEVWgdo252x
xYV263b6mZ7R1p4eaaeftnu652mn2xY3XBAVd0VREdEoKrvsGEiAEBI2E0JWIKnUff44FaiEQCpQ
SVXdfN+vV72ou1TV7+bqr079zrnngoiIiIiIiIiIiIiIiIiIiIiIiIiIiPjIJUAOUA7MaOZr5wAr
fR2QiD+E+DsACVh5wEmgU4P1GwEXkNbaATXhUeBvQCywpJHtE4BvgWNAMfA1cFELxTIPeLmJffKA
KsyX0CH3/nFevv8c9CUkZ6GkLmdjAXuAmzzWDQGi3NsCTRqw4yzb4oAPgf8F4oFk4HeYLy1fC/Ny
Pwu4GvMlNAzzt/2PFohHRASAvcBvgLUe6/4CPEz9lno79/p9mBbnfCDSva0jJpkeAY4CH2ASap0s
TAv7a6AMWMaZvww8zcWUWIqB94Fu7vW7gVpMy7cMCG/wuouAknO87xxMy/fP7jj3ANM8tnfHtP6L
3Z9/p8e2ecBbmJZ2KXAf5suiGtMK33iWz9wLTPZY/m9gqcfyr4Fc9/FsB2a51w8AjgNO9/sfda8/
13lIxJyHEvcxfAU4zhKXiNjUXmAKkA30B0KB/Zhk7pnU/wq8h0ngMZjk9wf3tgTgx5jkEgO8Abzr
8RlZmCTZx73PF8BjZ4lnMvADMByIwJRavmwQ7+RGXgemNVwEvIhJ1vENts/BJOE7MMnubqDQY/tX
wBPuzx2G+ZK6zL1tnvu1dXX8SOARYOFZYvGMd4r7eQqwBfhPj+3XAl3dz68HKoAk9/KtnFl+Odd5
eAyT5EPdj0uaiE1EbKgu6fwGkxymYVrSoZxO6g5Msunl8brxmJZuY4ZzumUJJok/7LF8D/DxWV67
APijx3J7TDKt+3I5V1IH88X0AuaLqQbT0u/i3jYH8+VSJxpzjF2AVEyruL3H9j+43wtMUs9q8Fnz
8K6mXo5pibswX3bnKodu5PQXxxzqJ/WmzsPvMAm/dxMxiQ2opi7nYmGS02xM63Ah9X+2d8YkwA2Y
n/YlmKSc6N4eDTyNSWClmJZ1hwbvccjj+XFMK7Mx3TClhTqVmFJCcuO7nyEbuA2TpAdjSiqPnyWO
Kve/Me79jro/r05+g88t8DIGTxYwE1Pvz8R8IXl23P4Uk8jr/q6DOXtpqqnz8GdMKedTTKnqwfOI
V4KEkro0JR/T4psOvNNgWxEmEQ/ElDTiMT//60Zx/AroC4zBJPNJmIR+PvXcA0C6x3J7TJIrbHTv
c9sJvIRJlN58bgL1v2zSqJ/IG3Ycu5oZz1fA34E/uZd7AM9g6vMJmL/rNk7/3Rp+XlPnoQL4N0xL
fQbwr5z7V40EMSV18cYdmCRwvMF6F/AspsXb2b0uGbjC/TzG/ZpSTHJ6pJH39jbBv4ZpaQ/DdAr+
AViN+dJpSj9MIqtrXadiRvWs8uK1+zFDIR9zf+5Q4HZg0TlecxjzBdScL6/HMV9+YzFfWBYmWYdg
jtvzC+gwpg5f1yHc1Hm4CtNv4cCUe2rdD7EhJXXxxh7gO49lz5big5if9qsxyXs5pnUOJslEYZLT
t5iSQMNWptXg+dmGS64Afgu8jWk99wRu9DL+ckyyXINpta7CdEz+6hyf67l8EyZJH8D8WvlP4PNz
vPZN97/FwHovYyzC/Hp4EDM083/ccR7CJPSvPfZdgRkRcwjTaQvnPg8Z7uVyzHn4B/U7maWNmYap
R+Zw9lpcJqb+t40zO41ERCRAhGK+/dMxP/U2YcbJeuqIaTWkuJcTERERv2iq/DIGk9TzMMPAFmN6
7D3djPlJXNdxVOTD+EREpBmaSurJmI6iOgWcOYQsA9MJ9gWmfniLz6ITEZFmaWqeCm/m+AgHRmIu
VInGdO6spv7FHCIi0gqaSuqFmOFfdVI580KL/ZweJ3scM+Z2GA2Seu/eva3du3dfULAiIm3QbsyQ
VK80VX5ZjymvpGPmvbiBM6c1fR8zrWkopqU+lkZmy9u9ezeWZdn28cgjj/g9Bh2fjk3HZ78HzZze
oamWuhP4Oafn/FgAfA/c5d7+NGa44yeYcb91F0GcbQpUERFpQd7M/fwxZ06y9HSD5b+4HyIi4ke6
otRHMjMz/R1Ci7Lz8dn52EDH19a05kT5lrs+JCIiXnI4HNCMXK2WuoiIjSipi4jYiJK6iIiNKKmL
iNiIkrqIiI0oqYuI2IiSuoiIjSipi4jYiJK6iIiNKKmLiNiIkrqIiI0oqYuI2IiSuoiIjSipi4jY
iJK6iIiNKKmLiNiIkrqIiI0oqYuI2IiSuoiIjSipi4jYiJK6iIiNKKmLiNiIkrqIiI0oqYuI2IiS
uoiIjSipi4jYiDdJfRqQDeQADzayPRMoBTa6H//hq+BERKR5wprYHgo8AUwFCoF1wBLg+wb7fQnM
8Hl0IiJtVW0thIY2+2VNtdTHALlAHlADLAZmNrKfo9mfLCIiZyovh3ffhQULzuvlTbXUk4H9HssF
wNgG+1jAxcBmTGv+34Ad5xWNiEgbVnX0BId+8d8crIjloKM7B082/z2aSuqWF+/xHZAKVAHTgfeA
vs0PRUTEZjZsgOho6NcPQk4XRqqqoDC/loMHLA7+EMbBg3DwIBw7Fgm7r4XSUrNj+4pmf2RTSb0Q
k7DrpGJa657KPZ5/DDwJJABHG77ZvHnzTj3PzMwkMzPT+0hFRIKM670lHM6roiC8F4WXz6GgOIrC
QjhabMHmrdA1Cbp2O7V/RARUddxG0bEPie0cSUz08mZ/ZlO18DBgJzAFOACsBW6ifkdpEnAE06of
A7wBpDfyXpZledPwFxHxkxMnYN8+SE01Lew6lgWffQYbN0J8PMydW/91RUWU//5/KbjmfgqrO1NQ
AIWFcPDNr6k56YLwcBg//tTuERHQ/cQeujn30+3GSXTrBt27Q6dO4GiQlR1mhdf9lk211J3Az4Fl
mJEwCzAJ/S739qeBa4F73PtWATd6++EiIgFlwwZYuBBuuAEmTz693rJgxQooKYEOHTh2DPLzTf7P
z4d9W8IoXT8DqhLrp9+EJBIr8kjpVkXyVZCSAsnJ0LkzhLjS4JlP4MpJPj2E1hy1opa6iASO8nKI
ja2/zrLgxRfh6quhc2csy5S3963IJf/ZZewrTyC/IoHSkZeZ5nad4mIireMkj00hJeV08k5Ohsjj
JZCbC6NHnxmDZZ3ZNG+guS11JXURaXs++QQ+/BBmz65XFqmqtNi7roi95Ynk7XOwbx+UlWG+ACor
IDISoqKJ6tiOtDRIS4MePSAtxUWXRBeO8KaKH83n6/KLiEhwsiwoKDD18YbWrMFV7eTAMx+x51Bf
9pZ1Ys8eOHTIAXSut2t0NKT1jyUtLdYk8DRTPqnfwA4hUGZdUVIXEXtyOuGvf4Xf/hbi4ykvhz17
YM+GEvZ+MpC88ks5GREL1REQY14SHm6Sdq9ekJ5uWuGJiU1WSAKKyi8iEryOHIHdu2HnTpg1Czp2
PLWpuBhynlhGbnkSOe2Hc+iQe8PJk3D4EISH03lQEj37hNKrF/TsaWrhYQHW1FX5RUTsZ8UKSEqC
wYPrr9+yBd58E8uCQ64kcvpMJzcXcnLg6FGg4mIoOQappl+zZ0/o1asdvXr1oGfPM/tJ7UBJXUQC
X3ExZGefSuqWBQcOQHZuD3btmEhuaRcqVsfA2FoIMZNgRUdDxrBY+vSJJSPDlFXOY36soKPyi4gE
vpoaih75O9mZd5OdH83One5RKVVVZrB4dDQdenQg46KOZGRARoa5mCeYauFnoyGNIhKcSkvhmWdM
q3zkSMqnX092NqceRYUnTU+mew6Vjh2hf3/o29c8gq1D01uqqYtIYLMsqKg4o6DtrKpmz/oytpWk
sz27FwUr6r8sOr4d/fqZRN6/vymx2zGJXygldRFpXdXVMH8+PPAAJSWwbZt5ZK+EE1suN/skRBKe
YsoodUk8NbXeRIdyFkrqIuJ7Lhds3gzvvAPXXQdDhwJm6Hju3nZsX9mFbUfKOVDu0Vp3hdN9TDKD
Lu3E4NFR9BkUeMMLg4H+ZCLie3/5ixk/DlRWOdi62uT4HTvMRIgcvQj2niAyJZb+/c2glkGDOpKQ
0PHc7ytNUkepiFwYp/OMJvUPK7PZ/MeP2Xw0hdyuE3B1OT1neHIyDBpkEnnv3mqNN0UdpSLSevLz
YeFCrF8/RN7+UDZvNi3yA4X94EglAKEdOzJwoKnADBsGCQl+jtnm1FIXEe+5XKd6Ky0LcnMsvnts
Gd9V9uNYfM9Tu0VFwZDBFkOHORg82CzL+VFLXUR8b/dueOcdXBn92D1oBhs2wHffQWmpA1yT4PA+
EnpZDBvuYNgwM2olLEzjDf1BLXUROSdXfgG5DzzDhh/S2FiRQemwiacGiCcmwsiRMGqUmdFQ48Z9
Ty11ETk/lgVvvw3XXIPlCGHfPli7FtavS6Y0+yozu2GIg8SIMkZN7sCoUWY+FSXywKKkLtLWlJWZ
BB4XVz8jOxwcKaxh7WNbWXtyGIcPn9pA5z5xjErIY9R940gd2kGJPICp/CLSlpSXw4MPQm0txMfD
o49SdiKC9etNq3zvxmNmMPnYMcTFhzF6NIwZAz3SLBwhyuT+oAm9ROTcXn6Zmq++ZXNxKquG3c2O
Qwm4XGZTZDuLERnljJkSR//+uiw/EKimLtIWlZWZOVUSE0+vO3LETGXovuu9ZcH+/fBN+dWsW9ON
ypoIqK0mNNmMHx8zBoYOdRAREeengxBfUEtdJJg5nfC3v5nbuSUlwaOP1t/+wQdUjL+ctVsi+fZb
k9TrXpcWXcTFmRGMvjKBmJhWj1y8pJa6iJ0dPmySd53QUMjLM89TU0+tdrlgx7L9fPvnUjZFFVKb
3huAmBgYOxYuvjiMlJSurRi4tBYldZFgsXs3bNwI1157el1VlRlqCJCURFkZfP01rFwJR/M6QIfL
COnahcGD4ZJLzKX6mmvF3nR6RQJNcTHs2gXjx9dfv2yZuVTTU20t1sRJ7IoYzJeHhrLp12ZgC0Dn
3nFMmBDHuHGmtC5tg5K6SKCwLHjvPfjkE7Pcr9/p2a9cLnMn5a6nSyZVVbB6fRxf7rqZQ4fMupAQ
GDECJk0yN5bQePK2R0ldJFA4HGYES5116+DKK83zkBCYMwcw91n+8kuzuW73jh1hwgS49FK1yts6
JXURf7AsKCiAyEjo3Pn0+m7ueccHDjQTj7u5XLBpE6xYAbm5p3cfOBAmTjS18tDQVopdApo3P86m
AY8DocBzwJ/Ost9oYBVwPfBOI9s1pFGkzoED8LvfwV13mRmx6hw+DEVF5i4SmBLLN9/A55/D0aNm
l6go0yqfOBG6dPFD7NKqfD2kMRR4ApgKFALrgCXA943s9yfgk+Z8uEib1b07DB9ev5UOZrhiUhKH
D5tEvmpVvcEtTJ5s+k/btWv9kCU4NJXUxwC5QJ57eTEwkzOT+i+AtzCtdRHxZFlw/Ljp6PQ0c2a9
mollQU4OfPopbN16ercBA2DKFHP7N3V8SlOaSurJwH6P5QJgbCP7zAQmY5K6aiwiYGonK1bAmjXm
qp8HHqg/mUr37oCpl2/ebEYs7t1rNoWHm4uEpkw5tZuIV5pK6t4k6MeBX7v3dXCO8su8efNOPc/M
zCQzM9OLtxcJUoWF8PHHZuD4Dz+YK4ImTTq12emE1atNy7xumtuYGLjsMrNbbKyf4ha/ysrKIisr
67xf39SPuXHAPExnKcBDgIv6naV7PN4nEagC5mJq757UUSptz6pV8OKLpuk9dSrMmsXx4/DVV6YR
X1pqduvUCS6/HC6+WPVyqc/XU++GATuBKcABYC1wE2fW1Ou8AHyARr9IW1RTY5J3Q3v2QFoaFSfC
+OwzyMoyJXaAlBQzFH3UKA1JlMb5evSLE/g5sAwzwmUBJqHf5d7+dPNDFLGhvXtNi/y++84YZ1je
uRfLl5hkXjeSpW9fk8wHDVLnp/iWpt4V8ZWvvoIPPoD774fUVMrKTL38yy9PX/k5eDBcdRX06uXf
UCV46M5HIq0hP98Uvz2nwQXIyeFYbCrLvoxk5UpTkQFzE4of/QjS01s9UglySuoiLamoyEy6tW4d
/PjHMG3aqU2lpfDRR+YK0LpkPny4aZmnpfkpXgl6ukmGSEv67DOT0MHM3QJUVpqJFbOyTpdZRo0y
LfOUFP+EKW2XkrpIc1x1lRmmeOIEJ8JiWPGhxfLPHKdGs4wYATNm6IIh8R+VX0SaqebbdWTlJPPJ
lu5UVJh1Aweaq/5VMxdfU01dxFeKi2HJErjtNsBcGPrNN7B0KRw7Znbp3RtmzTJDFEVagmrqIr6S
kAB792Jl72TziX68887py/lTU00y1zhzCTRK6iJg6uRJSfUHkDsc7O2RyVu/LSXXfVe5Ll1MMh85
UslcApPKLyIffQTvv2/muP3lLwEzcvHdd2H9Whc4HMTEOrj6anO7uDA1haQVqfwi0hw7d5qEDvD9
91RuzuWjXX344gtTQw9vF8KUKWY4elSUf0MV8YZa6tK2WRa8/z61Sz/hi7DLWRo2k6rqMBwOM5/5
zJmmtC7iL2qpizSHw8H2PjN5wzWKQzXdwRXKgAHwk5+YzlCRYKOWurQtOTnQpw84HBw5Am+9Ze46
BKaf9NprYcgQdYJK4FBLXeRsamrgjTc42bUHH3W4ic++CMXphMhIc6Ho5MnqBJXgp5a6tBmWBWu/
rubtR7dTGhoPPdIZP97My9Whg7+jE2mcrigVqVNcbHo5HQ7274fXXoPduwHLomdaLTfMDqNnT38H
KXJuKr+IlJTAokWwbRsnrpjBktqr+OILcLkgLg6uucbBuHFhqpuLLSmpi/1kZ2Nt3cbG4lRe/68w
jvU4REj3rkyZYmZQjIz0d4AiLUdJXWznhz7jWXwynG07qiAulp4Do5h9r4YoStugmroEt+pqKCuD
xEScTli2DD7+GGpOuoh2lfPjWzswYQKEhPg7UJHzo5q6tC0bN8KyZey69mEWLQ47NYviuItD+MlP
OhAX59/wRFqbWuoS1KoqLd65bwUrD2VAjx507QqzZ2t+c7EPtdSlzdi0CV591UFpyCRC2xdz1Qy4
8kpdQCRtm1rqEhwsC5Yvh5ISyqbfwOLFsGGD2dS7N9xyC3Tr5t8QRVqCWupiPxUV8I9/YO3ew+oj
vXjzvYNUxnWjXTtzNeikSeoIFamjpC6Br6yMoqMhvLJtMjtKukF8EYNv7MrNsx106uTv4EQCi8ov
EtAsC1auhLfedHFydyHtw05y/QPpjL1EV4RK26C5X8Q2Skpg4ULYscMsX3QR3HgjxMb6Ny6R1tQS
NfVpwONAKPAc8KcG22cCjwIu9+Pfgc+9DUCkIausnG9f3MWbe0Zx/DjExMDNN8OoUf6OTCTwNZX9
Q4GdwFSgEFgH3AR877FPe6DS/XwI8C7Qp5H3UktdmlRaCi+/UMPWhZugZ0+GT01k9mx0EZG0Wb5u
qY8BcoE89/JiTMvcM6lXejyPAYq8/XCROpYF69bB4sVQWRlO9PC+3Fi9kDG334WjXYS/wxMJGk0l
9WRgv8dyATC2kf1mAY8B3YArfBOatAlVVVSs2c4ru0bz3Xdm1eDBcMstHeho/TMooYs0S1NJ3dt6
yXvux6XAy0C/xnaaN2/eqeeZmZlkZmZ6+fZiS0VFbP/tYl76NoPSXoeJTEviuuvgkkvq7hEa7+8I
RVpdVlYWWVlZ5/36puo044B5mM5SgIcwnaENO0s97caUbYobrFdNXU6pqYF3fv45n39l2hUZCcXc
tvAyOvXu6OfIRAKLr2vq64EMIB04ANyA6Sj11BvYg2nVj3Sva5jQRU4pKIDnn4dC50RCYzYyo+ta
rviPMYQooYtcsKaSuhP4ObAMMxJmAaaT9C739qeBnwA/BWqACuDGFolUgp5lwYoV8O674HRCUnIY
d/yiDz1iE8wELiJywXTxkbSKY8fgpedr2bEzFIBLL4XrroN27fwcmEiA04ReEnA2boSXF1pUbs0j
plcXfnpfLMOG+TsqEXtSUpcWU1MDr79u5m4BB4NGR3PrkUfoUHMzcJGfoxOxJyV18b19+zj47V6e
zcmksBDCw+Gaa+CyzK443h4P/fv7O0IR21JNXXzK2rqNVb/7lNeyR1A9bDRJvWOYOxdSU/0dmUhw
0iyN4jcnKmt59aYPWJOTAMC4ESe5+YXL1RkqcgHUUSp+sX8/PPtsKIc7XklE1AZuHryV8X++BpTQ
RVqVWupyQSwLvvwS3nzTjD1PToa5Vx2gW+9o6KiLiUQulMov0mqqqmDh/Eo27moPwMSJcP31pmNU
RHxD5RdpFfv2wTP/r4Kiz7cQNXYot9wTo5tYiAQAJXVpFsuCr7828547nTH0uCSFue2foPOA+4Fo
f4cn0uYpqYvXqqvh1Vdh1SqzPGkSXH99GmHbp0NoqH+DExFANXXx0pHDFk//Jp+CmiQi4iKZPRvG
jfN3VCL2p45S8bmNq07w0iN7OL6/iKRe0dz1zEUkJ/s7KpG2QR2l4jO1tWaa3OUfOqCwmJGJ+dza
dRWR5TGALvUXCURK6tKo0lJ49lnIyYGQqHb8ZHolU8pW4hg3VnOfiwQwlV+kvooKdu0O5dlFUZSV
QYcOMHcuZEQXwpEjMHx43Q1ERaQVqKYu582yYMUL+bz9dBGuwUPoNyicO++EuDh/RybSdqmmLuel
uhoWLYI1a9Ig+gRXnvyAWffPIiQsxN+hiUgzKKkLxcXw1FOQnw8RETDn96mM6lANSugiQUfll7bK
smDLFrJf38yzVTdTcTyMzp3hnnvQcEWRAKLyizTN6cR64h+sWO7i7b0jcfU8yKArU7nzTojWlf4i
QU1JvQ2qrqhm0YahrNljLu2fHpXFjHtnq34uYgMqv7QxxcUwfz7sz7dod/Qgc4ZvYuT9EzTERSRA
aUijnFV2trmgqKICOneGe++F7t39HZWInItq6nIGy4IVbx7l7S8ScLlg8GC44w7Vz0XsSEnd5mpq
4JWFTlY9kQupKUy/vTszZkCIyucitqSkbmNlZaZ+vmdPGBGjhnBb7XOMTBkPIRf5OzQRaSGqqdtU
fj48+SSUlEBCgqmfp0YVQVQUtG/v7/BExEvNral7+yN8GpAN5AAPNrJ9NrAZ2AJ8Awz1NgDxvQ3r
Lf78x1pKSqBPH3j4YUhNBRITldBFbM6b7B8K7ASmAoXAOuAm4HuPfcYDO4BSzBfAPKDhfXHUUm9h
lgUfvFHF0sdzoaaGS+7oz81z2xOmIptI0GqJlvoYIBfIA2qAxcDMBvuswiR0gDVAircBiG+cPAnP
PG2x9PEcQkpLuL7rV9yy7/eEHSvyd2gi0oq8acMlA/s9lguAsefY/w7gowsJSpqnuNjUzwsKHET1
6s5cljIoZh8MnWQmRBeRNsObpN6cmsllwO3AJY1tnDdv3qnnmZmZZGZmNuOtpTG7d5sRLuXlkJQE
9z3amSTnrbB3L0yY4O/wRKSZsrKyyMrKOu/Xe1OnGYepkU9zLz8EuIA/NdhvKPCOe7/cRt5HNXUf
++Zri1cWuai1Qhk40NyhSBcUidhLS1xRuh7IANKBA8ANmI5ST2mYhP7PNJ7QxYdcLnjrLVjxVgns
zWPKff259qfRuqBIRLxK6k7g58AyzEiYBZiRL3e5tz8N/CcQD8x3r6vBdLCKj1VVwXPPwfbtENop
nptH72RCzv+FY78yA9JFpE3TxUdB5PBh0yF66BDExMDdd0NGBrB1KwwYgMYuitiPZmm0qR3L9vPs
Y0VU9RlCcloY990HnTr5OyoRaWlK6jZjWfDFE9t586liXC4YPiqU25+7mHaRrXnqRMRfNPWujTid
8Npr8PVHMeAq5qq0rfxTYi6OqgEQqfq5iJxJLfUAVVEBTz8Nu3ZBeDjc2vMrRh//ytwZWnUXkTZD
5Zdgd/gwB8pj+ccL0RQVmQtC770X0ntYZnL0iAh/RygirUjllyC3Zel+FrwcwYmMIaT3dHDPPdCx
I4BDCV1EmqTLVQKEZcHy5fDkmlGcKK/hotid/OpXdQldRMQ7aqkHAKcTFi2CVasAHMy4uzs/usKJ
Qw1zEWkm1dT9qayM8tXbmb9xHLv3OIiIgNtug5Ej/R2YiAQK1dSDRU4OBX99k3+sGsHR+FziL+rN
fb8IMXcoEhE5T0rqfrLp9Z08/9U4TtaG0atqG/fcHEpcai9/hyUiQU5JvZVZFnzyCbyXfxV0yWFs
+EZu+a++hA9XQheRC6eaemuxLGqcDhYuhLVrweGAH8+yuGJcGY6OujuRiDROFx8FotWrKd2cx/yj
N7A3z0G7dnDHHTBsmL8DE5FAp47SAJTfaQRPvmpRErWPTiPTufdeSNGtuUWkBail7mtOJ9TWQrt2
AKxbBwsXQnVlNX1ObOfu+cOI7aBrvkTEOyq/+JPTCX//O7Rvj+uOubz7noNPPzWbJkyAm27SfSxE
pHlUfvGn116D7GyqnOE8uzmHHc6+hIbCDTfAxImmc1REpCUpqftKdTUcOMCByg48uSOTH5LaETsI
fvYz6NvX38GJSFuh8osPbdpQywu/28eJshrSpvblnnsduhe0iFwQ1dRbU0UFxMRgWfDhh+YBMGa0
xS0/dWimXBG5YKqpt5bly2HdOk78n4d4/gUHmzdDSAhccw1MnepQ/VxE/EJJ/XwNGMChZZt56t+K
OOjsTHQ03HknDBrk78BEpC1TUj9PGw6nsPDELzlx8Cjdh1rcc6+DLl38HZWItHWqqTdTbS288w58
9plZHj0abrnl1LVGIiI+pZp6S9m8mWNHqnl202hycyE0FK67DjIzNf5cRAKHknpTXC5YtIhdS3N4
NieTsiHHie8Wxdy50Lu3v4MTEalPSb0J1g9FLH+/ine/n4rLctDv+Gbm/mYcsbH+jkxE5Ezeziw1
DcgGcoAHG9neH1gFnAB+5ZvQ/K+yEua/3YW3o/4ZV3g7pk+p5pcLhiihi0jA8qYaHArsBKYChcA6
4Cbge4/9ubv3AAAHtklEQVR9OgM9gFlACfA/jbxPcHSUrl0Lw4aRk9+OBQugpASiouC2a8sZdkmM
Cugi0qpaoqN0DJAL5LmXFwMzqZ/Uf3A/rvL2gwOVKySMj259g6WhM3DFdKB3b3NDi06d1DwXkcDn
TVJPBvZ7LBcAY1smHP8qKYHnvxzJruIOOGoOMv1f4vinGQ5CQ/0dmYiId7xJ6kFQMzkPTie8/jpc
eSUkJrJlC7z0kpnOpcPwXtx+O/QfoFKLiAQXb5J6IZDqsZyKaa0327x58049z8zMJDMz83ze5sKd
PAlPPQU7dnBiyy7e6vUAK79rD8DgwTBnjkOdoSLiF1lZWWRlZZ33671pioZhOkqnAAeAtZzZUVpn
HlBOoHeU5uXBX/5CTlE8L+4cT1H3oYSlpzBrFkydqr5QEQkcLTX17nTgccxImAXAY8Bd7m1PA10x
o2LiABcmsQ8EKjzeI2CSek0NvP/3fD5bsA8rLY20S9K47XYH3bv7OzIRkfo0n3pjTp6EgwchPZ28
PHjxRbMYcrKK6ddE86Mf6d6hIhKYNPdLQy4X/OEPnOycwpKkuXz+uVnVtSvcdls06en+DlBExHfs
n9RDQtg24hZefaqM4h7mRhaXXw4zZqA7E4mI7di6/HLsGLz1FqxbB1RWktYzlFvmRpKW1qphiIic
t7ZdU7csWLOGmn6DWbEmho8+MuX0iAjTMp8yxbTURUSCRdutqTudWK++xpYlebx58Dg/9BwD7dsz
fLiZ9zwx0d8Bioi0PNsk9bwtZby7IJbsI5MA6B63lesfHsuAgRp0LiJtR3CWX2pqoKwMOnWisBCW
LIFNm4CSEtrv3MA/TXMy6dEphLQL983niYj4SduoqRcUkD9/KcvS72LDBlNKj4iAyZPhigH7ad8v
RZeFiogt2LqmblmQnQ3LPknm+w+GwtBKQuPaM2kSTJ8OcXFQf5oaEZG2JbCT+rFj8O23VEyYxuq1
IaxcCYcOATiITO3MpaOOMmVOe+Lj/R2oiEhgCNjyS/WqDWx/fDnrDyazKWIMzl59weGgQwe47DKY
NAmio1swWhGRABCc5ReXC4CS0hB27oQtW2Drex2p3nsxAA7HIQaPj2fitV0YMkRjzUVEzqZ1W+qv
vAK7duG8/Wcci+5OUREU7Kkm/8kPyet5GYer4z33pufxHYxwruOie0bTaeKgVgxVRCQwBPTol4eH
L6U6oj3lwydieX709zsgPp7I9G5kZMCAATBiBCTEW+aS0MjIVgxTRCRwBHT5pehEDCR0J8QBHTtC
p06QnAwpUxJIO7KetHuvblBacSihi4g0Q6u21I+88ikRGT2IGZFBaFiDj3Y6Nam5iEgDAV1+CZQ7
H4mIBIvmJnWNIxERsREldRERG1FSFxGxESV1EREbUVIXEbERJXURERtRUhcRsREldRERG1FSFxGx
ESV1EREbUVIXEbERb5L6NCAbyAEePMs+f3Nv3wyM8E1oIiLSXE0l9VDgCUxiHwjcBAxosM+PgD5A
BvAzYL6PYwwKWVlZ/g6hRdn5+Ox8bKDja2uaSupjgFwgD6gBFgMzG+wzA3jJ/XwN0BFI8l2IwcHu
/2HZ+fjsfGyg42trmkrqycB+j+UC97qm9km58NBERKS5mkrq3k6A3nCuX02cLiLiB01NvD4OmIep
qQM8BLiAP3ns8xSQhSnNgOlUnQQcbvBeuUDv8w9VRKRN2o3pt/SJMPcbpgMRwCYa7yj9yP18HLDa
Vx8uIiK+Nx3YiWlpP+Red5f7UecJ9/bNwMhWjU5ERERERM6PNxcvBbM8YAuwEVjr31B84nlMf8hW
j3UJwHJgF/ApZthqsGrs+OZhRm1tdD+mnfmyoJEKfAFsB7YB97vX2+Ecnu3Y5mGP8xeJGRa+CdgB
POZeH1DnLhRTlkkHwmm8Jh/s9mL+6HZxKeaqYM+k99/AA+7nDwJ/bO2gfKix43sE+Ff/hONzXYHh
7ucxmNLpAOxxDs92bHY6f9Huf8Mw/ZMTaOa5a+m5X7y5eMkOmhpFFExWAiUN1nleYPYSMKtVI/Kt
xo4P7HMOD2EaTwAVwPeYa0nscA7Pdmxgn/NX5f43AtMoLqGZ566lk7o3Fy8FOwv4DFgPzPVzLC0l
idNDVA9jzyuGf4Hp6F9AcJYmGpOO+VWyBvudw3TMsdWNtrPL+QvBfHEd5nSpqVnnrqWTelu4COkS
zH9c04H7MD/v7czCfud1PtAT89P+IPA//g3HJ2KAt4F/AcobbAv2cxgDvIU5tgrsdf5cmONIASYC
lzXY3uS5a+mkXojp3KiTimmt28lB978/AO9iSk52cxhTzwToBhzxYywt4Qin/2d5juA/h+GYhP4y
8J57nV3OYd2xLeL0sdnt/AGUAkuBUTTz3LV0Ul+Pmb0xHVMjugFY0sKf2ZqigVj38/bAFdTvgLOL
JcCt7ue3cvp/Jrvo5vH8xwT3OXRgShA7gMc91tvhHJ7t2Oxy/hI5XTqKAi7HjOYJuHPX2MVLdtET
U//ahBliZYfjew04AFRj+kNuw4zu+YwAGVJ1gRoe3+3AQsyw1M2Y/2GCud48AfMTfhP1h/jZ4Rw2
dmzTsc/5GwJ8hzm+LcC/u9fb4dyJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiL/9fzxe29jm0lNO
AAAAAElFTkSuQmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;This post shows how to simulate Hull-White short rate model using QuantLib Python. You can
download the &lt;a href="/extra/notebooks/hull_white_simulations.ipynb"&gt;ipython notebook on Hull-White simulations&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Fri, 01 May 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-05-01:blog/hull-white-simulation-quantlib-python.html</guid><category>quantlib</category><category>python</category><category>finance</category></item><item><title>An Introduction to Interest Rate Term Structure in QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/quantlib-term-structure-bootstrap-yield-curve.html</link><description>&lt;p&gt;Term structure is pivotal to pricing securities. One would need a &lt;tt class="docutils literal"&gt;YieldTermStructure&lt;/tt&gt; object
created in &lt;tt class="docutils literal"&gt;QuantLib&lt;/tt&gt; to use with pricing engines. In an earlier post on
&lt;a class="reference external" href="/blog/quantlib-bond-modeling.html"&gt;modeling bonds using QuantLib&lt;/a&gt; we discussed how to use
spot rates directly with bond pricing engine. Here in this post we will show how to
bootstrap yield curve using &lt;tt class="docutils literal"&gt;QuantLib&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;As usual lets import &lt;tt class="docutils literal"&gt;QuantLib&lt;/tt&gt; and do some initialization.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_curve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ylist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;
    Method to print curve in a nice format
    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;----------------------&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Maturities&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;Curve&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;----------------------&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ylist&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\t\t&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;----------------------&amp;quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The deposit rates and fixed rate bond rates are provided below. This example is based on
Exhibit 5-5 given in Frank Fabozzi's Bond Markets, Analysis and Strategies, Sixth Edition.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# Deposit rates&lt;/span&gt;
&lt;span class="n"&gt;depo_maturities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;depo_rates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;5.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Bond rates&lt;/span&gt;
&lt;span class="n"&gt;bond_maturities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;bond_rates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;5.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="mf"&gt;7.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;print_curve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depo_maturities&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;bond_maturities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depo_rates&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;bond_rates&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Lets define some of the constants required for the rest of the objects
needed below.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# some constants and conventions&lt;/span&gt;
&lt;span class="c1"&gt;# here we just assume for the sake of example&lt;/span&gt;
&lt;span class="c1"&gt;# that some of the constants are the same for&lt;/span&gt;
&lt;span class="c1"&gt;# depo rates and bond rates&lt;/span&gt;

&lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt;

&lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bussiness_convention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unadjusted&lt;/span&gt;
&lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;end_of_month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;face_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;coupon_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;settlement_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The basic idea of bootstrapping using &lt;tt class="docutils literal"&gt;QuantLib&lt;/tt&gt; is to use the
deposit rates and bond rates to create individual helpers. Then
use the combination of the two helpers to construct the yield curve.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# create deposit rate helpers from depo_rates&lt;/span&gt;
&lt;span class="n"&gt;depo_helpers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DepositRateHelper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                                     &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="n"&gt;end_of_month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="n"&gt;day_count&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depo_rates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depo_maturities&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The rest of the points are coupon bonds. We assume that the YTM given
for the bonds are all par rates. So we have bonds with coupon rate same
as the YTM.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# create fixed rate bond helpers from fixed rate bonds&lt;/span&gt;
&lt;span class="n"&gt;bond_helpers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bond_rates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bond_maturities&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;termination_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc_date&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
    &lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;termination_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;coupon_frequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Backward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;end_of_month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FixedRateBondHelper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QuoteHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SimpleQuote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;face_amount&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                                        &lt;span class="n"&gt;settlement_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                        &lt;span class="n"&gt;face_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                        &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                                        &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                        &lt;span class="n"&gt;bussiness_convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bond_helpers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The yield curve is constructed by putting the two helpers together.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="n"&gt;rate_helpers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;depo_helpers&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bond_helpers&lt;/span&gt;
&lt;span class="n"&gt;yieldcurve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PiecewiseLogCubicDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;rate_helpers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The spot rates is obtined from &lt;tt class="docutils literal"&gt;yieldcurve&lt;/tt&gt; object using the &lt;tt class="docutils literal"&gt;zeroRate&lt;/tt&gt; method.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# get spot rates&lt;/span&gt;
&lt;span class="n"&gt;spots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;tenors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;yieldcurve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dates&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;yrs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yearFraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;compounding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;
    &lt;span class="n"&gt;freq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;
    &lt;span class="n"&gt;zero_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yieldcurve&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeroRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yrs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compounding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tenors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yrs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;eq_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zero_rate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;equivalentRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="n"&gt;compounding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="n"&gt;calc_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;spots&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;eq_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The bootstrap curve looks as shown below:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="44%" /&gt;
&lt;col width="56%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Maturity&lt;/th&gt;
&lt;th class="head"&gt;Spots&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;5.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;5.426&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;5.761&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;6.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;6.283&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;6.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;6.822&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;6.87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;7.095&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;7.205&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;7.257&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6.0&lt;/td&gt;
&lt;td&gt;7.31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;7.429&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;7.485&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;7.543&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;7.671&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8.5&lt;/td&gt;
&lt;td&gt;7.802&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9.0&lt;/td&gt;
&lt;td&gt;7.791&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9.5&lt;/td&gt;
&lt;td&gt;7.929&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;8.072&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Once we have the spots, the zero coupon curve can be directly constructed the next time as show in the
&lt;a class="reference external" href="quantlib-bond-modeling.html"&gt;bond pricing example&lt;/a&gt;. The &lt;tt class="docutils literal"&gt;yieldcurve.dates()&lt;/tt&gt; and
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;yieldcuve.zeroRate(...)&lt;/span&gt;&lt;/tt&gt; methods would provide for the necessary rates as shown above.&lt;/p&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post we showed how to bootstrap yield curve to get spot rates.&lt;/p&gt;
&lt;p&gt;Download the &lt;a class="reference external" href="/extra/notebooks/term-structures.ipynb"&gt;bootstrap yield curve ipython notebook&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Wed, 08 Apr 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-04-08:blog/quantlib-term-structure-bootstrap-yield-curve.html</guid><category>python</category><category>finance</category><category>quantlib</category></item><item><title>Modeling Fixed Rate Bonds in QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/quantlib-bond-modeling.html</link><description>&lt;p&gt;Let's consider a hypothetical bond with a par value of 100, that pays 6% coupon
semi-annually issued on January 15th, 2015 and set to mature on January 15th, 2016.
The bond will pay a coupon on July 15th, 2015 and January 15th, 2016. The par
amount of 100 will also be paid on the January 15th, 2016.&lt;/p&gt;
&lt;p&gt;To make things simpler, lets assume that we know the spot rates of the treasury as
of January 15th, 2015. The annualized spot rates are 0.5% for 6 months
and 0.7% for 1 year point. Lets calculate the fair value of this bond.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;0.007&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;105.27653992490681&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Lets calculate the same thing using QuantLib.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;todaysDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluationDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;todaysDate&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spotDates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spotRates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.007&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dayCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;interpolation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;compounding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;compoundingFrequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Annual&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spotCurve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZeroCurve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spotDates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spotRates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dayCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interpolation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;compounding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compoundingFrequency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spotCurveHandle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YieldTermStructureHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spotCurve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;So far we have created the term structure and the variables are rather self explanatory.
Now lets construct the fixed rate bond.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;issueDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;maturityDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;bussinessConvention&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unadjusted&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dateGeneration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Backward&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issueDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maturityDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bussinessConvention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="n"&gt;bussinessConvention&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dateGeneration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;monthEnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;


&lt;span class="c1"&gt;# Now lets build the coupon&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dayCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thirty360&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;couponRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mo"&gt;06&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;coupons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;couponRate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Now lets construct the FixedRateBond&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;settlementDays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;faceValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fixedRateBond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FixedRateBond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settlementDays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;faceValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;coupons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dayCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# create a bond engine with the term structure as input;&lt;/span&gt;
&lt;span class="c1"&gt;# set the bond to use this bond engine&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;bondEngine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DiscountingBondEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spotCurveHandle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fixedRateBond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPricingEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bondEngine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Finally the price&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fixedRateBond&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NPV&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mf"&gt;105.27653992490683&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Voila!&lt;/p&gt;
&lt;p&gt;Download the &lt;a class="reference external" href="/extra/notebooks/modeling-bonds.ipynb"&gt;modeling bonds ipython notebook&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Mon, 30 Mar 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-03-30:blog/quantlib-bond-modeling.html</guid><category>python</category><category>finance</category><category>quantlib</category></item><item><title>Introduction to QuantLib Python</title><link>http://gouthamanbalaraman.com/blog/quantlib-basics.html</link><description>&lt;p&gt;I installed the latest version of QuantLib (V1.5) and the python wrapper to QuantLib.
My experiments lately have been to get a feel for the QuantLib API. The library itself
is so extensive, that it is rather hard for a new comer to get going. In this post
we will look into some of the basic classes and functionality in QuantLib.&lt;/p&gt;
&lt;p&gt;Let us import QuantLib as:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;QuantLib&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ql&lt;/span&gt;
&lt;/pre&gt;
&lt;div class="section" id="time-submodule"&gt;
&lt;h2&gt;Time SubModule&lt;/h2&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;ql/time&lt;/tt&gt; sub-folder implements various time related classes. Lets take a look
at the &lt;tt class="docutils literal"&gt;Date&lt;/tt&gt; object which can be constructed as &lt;tt class="docutils literal"&gt;Date(date, month, year)&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 31 March, 2015&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;
&lt;span class="n"&gt;March&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dayOfMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mi"&gt;31&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mi"&gt;2015&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tuesday&lt;/span&gt;
&lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# arithmetic with dates&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# add a day&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# subtract a day&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Months&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Weeks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Years&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# logical operations&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;Schedule&lt;/tt&gt; object can be used to construct a list of dates such as coupon payments.
Lets look at some examples.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tenor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Monthly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnitedStates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tenor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Following&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Following&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Forward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Here we have generated a &lt;tt class="docutils literal"&gt;Schedule&lt;/tt&gt; object that will contain dates between &lt;tt class="docutils literal"&gt;date1&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;date2&lt;/tt&gt; with the
&lt;tt class="docutils literal"&gt;tenor&lt;/tt&gt; specifying the &lt;tt class="docutils literal"&gt;Period&lt;/tt&gt; to be every Month. The &lt;tt class="docutils literal"&gt;calendar&lt;/tt&gt; object is used for determining holidays.
The two arguments following the &lt;tt class="docutils literal"&gt;calendar&lt;/tt&gt; in the &lt;tt class="docutils literal"&gt;Schedule&lt;/tt&gt; constructor are the &lt;tt class="docutils literal"&gt;BussinessDayConvention&lt;/tt&gt;.
Here we chose the convention to be the day following holidays. That is why we see that holidays are excluded
in the list of dates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="interest-rate"&gt;
&lt;h2&gt;Interest Rate&lt;/h2&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;InterestRate&lt;/tt&gt; class can be used to store the interest rate with the compounding type, day count and
the frequency of compounding. Below we show how to create an interest rate of 5.0% compounded annually,
using Actual/Actual day count convention.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;annualRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dayCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActualActual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;compoundType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Compounded&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Annual&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;interestRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InterestRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;annualRate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dayCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compoundType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Lets say if you invest a dollar at the interest rate described by &lt;tt class="docutils literal"&gt;interestRate&lt;/tt&gt;, the
&lt;tt class="docutils literal"&gt;compoundFactor&lt;/tt&gt; method gives you how much your investment will be worth after &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; years.
Below we show that the value returned by &lt;tt class="docutils literal"&gt;compoundFactor&lt;/tt&gt; for 2 years agrees with
the expected compounding formula.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;interestRate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compoundFactor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;1.1025&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;annualRate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;annualRate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Check the above calculation&lt;/span&gt;
&lt;span class="mf"&gt;1.1025&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;discountFactor&lt;/tt&gt; method returns the reciprocal of the &lt;tt class="docutils literal"&gt;compoundFactor&lt;/tt&gt; method.
The discount factor is useful while calculating the present value of future cashflows.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;interestRate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discountFactor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;0.9070294784580498&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;interestRate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compoundFactor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;0.9070294784580498&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;A given interest rate can be converted into other types using the &lt;tt class="docutils literal"&gt;equivalentRate&lt;/tt&gt; method as :&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;newFrequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Semiannual&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;effectiveRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interestRate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;equivalentRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compoundType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newFrequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;effectiveRate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mf"&gt;0.04939015319191986&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;InterestRate&lt;/tt&gt; class also has an &lt;tt class="docutils literal"&gt;impliedRate&lt;/tt&gt; method. The &lt;tt class="docutils literal"&gt;impliedRate&lt;/tt&gt; method
takes compound factor to return the implied rate. The &lt;tt class="docutils literal"&gt;impliedRate&lt;/tt&gt; method
is a static method in the &lt;tt class="docutils literal"&gt;InterestRate&lt;/tt&gt; class and can be used without an
instance of &lt;tt class="docutils literal"&gt;InterestRate&lt;/tt&gt;. Internally the &lt;tt class="docutils literal"&gt;equivalentRate&lt;/tt&gt; method invokes
the &lt;tt class="docutils literal"&gt;impliedRate&lt;/tt&gt; method in its calculations.&lt;/p&gt;
&lt;p&gt;Here we have converted into a semi-annual compounding type. A 4.939% of semi-annual compounding
is equivalent to 5.0% annual compounding. This should mean, that both should give identical
discount factors. Lets check that:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;interestRate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discountFactor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;0.9523809523809523&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;effectiveRate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;discountFactor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;0.9523809523809521&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;So this means that pricing bonds using either interest rate convention should give the same
net present value (barring some precision).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post we looked at the basics of QuantLib:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;We learnt how to use &lt;tt class="docutils literal"&gt;Date&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Schedule&lt;/tt&gt; classes from the &lt;tt class="docutils literal"&gt;time&lt;/tt&gt; sub-module&lt;/li&gt;
&lt;li&gt;we learnt how to use the &lt;tt class="docutils literal"&gt;InterestRate&lt;/tt&gt; class&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Tue, 24 Mar 2015 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-03-24:blog/quantlib-basics.html</guid><category>python</category><category>finance</category><category>quantlib</category></item><item><title>Using SQLAlchemy in Luigi Workflow Pipeline</title><link>http://gouthamanbalaraman.com/blog/sqlalchemy-luigi-workflow-pipeline.html</link><description>&lt;p&gt;The &lt;tt class="docutils literal"&gt;luigi.contrib.sqla&lt;/tt&gt; provides support for SQLAlchmey through the &lt;tt class="docutils literal"&gt;SQLAlchemyTarget&lt;/tt&gt;
for storing in databases supported by SQLAlchemy. The user would be responsible for
installing the required database driver to connect using &lt;tt class="docutils literal"&gt;SQLAlchemy&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Minimal example of a job to copy data to database using &lt;tt class="docutils literal"&gt;SQLAlchemy&lt;/tt&gt; is as shown
below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;luigi&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;luigi.contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqla&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SQLATask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CopyToTable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# columns defines the table schema, with each element corresponding&lt;/span&gt;
    &lt;span class="c1"&gt;# to a column in the format (args, kwargs) which will be sent to&lt;/span&gt;
    &lt;span class="c1"&gt;# the sqlalchemy.Column(*args, **kwargs)&lt;/span&gt;
    &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;primary_key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;connection_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sqlite://&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# in memory SQLite database&lt;/span&gt;
    &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;item_property&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# name of the table to store data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item1&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;property1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;property2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)]:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SQLATask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;luigi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;local_scheduler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the target table where the data needs to be copied already exists, then
the column schema definition can be skipped and instead the reflect flag
can be set as True. Here is a modified version of the above example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;luigi&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;luigi.contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqla&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SQLATask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CopyToTable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# If database table is already created, then the schema can be loaded&lt;/span&gt;
    &lt;span class="c1"&gt;# by setting the reflect flag to True&lt;/span&gt;
    &lt;span class="n"&gt;reflect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;connection_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sqlite://&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# in memory SQLite database&lt;/span&gt;
    &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;item_property&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# name of the table to store data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item1&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;property1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;property2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)]:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SQLATask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;luigi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;local_scheduler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the above examples, the data that needs to be copied was directly provided by
overriding the rows method. Alternately, if the data comes from another task, the
modified example would look as shown below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;luigi&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;luigi.contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqla&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;luigi.mock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MockFile&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;luigi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MockFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BaseTask&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;TASK_LIST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;property&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;TASK_LIST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SQLATask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CopyToTable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# columns defines the table schema, with each element corresponding&lt;/span&gt;
    &lt;span class="c1"&gt;# to a column in the format (args, kwargs) which will be sent to&lt;/span&gt;
    &lt;span class="c1"&gt;# the sqlalchemy.Column(*args, **kwargs)&lt;/span&gt;
    &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;primary_key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;property&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;connection_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sqlite://&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# in memory SQLite database&lt;/span&gt;
    &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;item_property&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# name of the table to store data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;requires&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;BaseTask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SQLATask&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;BaseTask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;luigi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;local_scheduler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the above example, the output from &lt;cite&gt;BaseTask&lt;/cite&gt; is copied into the
database. Here we did not have to implement the &lt;cite&gt;rows&lt;/cite&gt; method because
by default &lt;cite&gt;rows&lt;/cite&gt; implementation assumes every line is a row with
column values separated by a tab. One can define &lt;cite&gt;column_separator&lt;/cite&gt;
option for the task if the values are say comma separated instead of
tab separated.&lt;/p&gt;
&lt;p&gt;The other option to &lt;cite&gt;sqla.CopyToTable&lt;/cite&gt; that can be of help with performance aspect is the
&lt;cite&gt;chunk_size&lt;/cite&gt;. The default is 5000. This is the number of rows that will be inserted in
a transaction at a time. Depending on the size of the inserts, this value can be tuned
for performance.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Thu, 05 Feb 2015 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2015-02-05:blog/sqlalchemy-luigi-workflow-pipeline.html</guid><category>Programming</category><category>Python</category><category>Luigi</category><category>SQLAlchemy</category></item><item><title>Building Task Pipelines Using Luigi</title><link>http://gouthamanbalaraman.com/blog/building-luigi-task-pipeline.html</link><description>&lt;p&gt;It is incredibly easy to write a script to process some data in python. But if you
have a lot of tasks that depend on each other, and you need to create a robust work
flow, then thinking in terms of a data pipeline is useful.&lt;/p&gt;
&lt;p&gt;Luigi is a framework for building data pipelines, and managing workflows. The onus of
setting up each unit of work is on you as the developer. Luigi taks care of resolving dependencies,
manages the overall workflow, and most importantly handles failures. As a bonus Luigi provides
a rather nice visualization tool and a command line interface.&lt;/p&gt;
&lt;div class="section" id="luigi-basics"&gt;
&lt;h2&gt;Luigi Basics&lt;/h2&gt;
&lt;p&gt;In Luigi, a data pipeline is built by defining &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt; instances. For every &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;, you can define
its dependency by specifying the &lt;tt class="docutils literal"&gt;requires&lt;/tt&gt; method for the &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;. Every &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt; can define
an &lt;tt class="docutils literal"&gt;output&lt;/tt&gt; method to specify the &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; where the results of the &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt; should go. Lets look at a
simple example to get our feet wet, and gradually build complex cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="hello-world"&gt;
&lt;h2&gt;Hello World!&lt;/h2&gt;
&lt;script src="https://gist.github.com/gouthambs/873ebce21062914f038d.js"&gt;&lt;/script&gt;&lt;p&gt;This example is rather self-explanatory. I use the &lt;tt class="docutils literal"&gt;MockFile&lt;/tt&gt; class as
the &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; just so that I can print to console. One can instead use &lt;tt class="docutils literal"&gt;luigi.LocalFileTarget(filename)&lt;/tt&gt;
to use the file system as the target. The &lt;tt class="docutils literal"&gt;main_task_cls&lt;/tt&gt; specifies &lt;tt class="docutils literal"&gt;SimpleTask&lt;/tt&gt; as the task
to run. The actual processing part of the task is encapsulated in the &lt;tt class="docutils literal"&gt;run&lt;/tt&gt; method of the &lt;tt class="docutils literal"&gt;SimpleTask&lt;/tt&gt;
class.&lt;/p&gt;
&lt;p&gt;When the script is executed, you should see an output that looks like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
DEBUG: Checking if SimpleTask() is complete
INFO: Scheduled SimpleTask() (PENDING)
INFO: Done scheduling tasks
INFO: Running Worker with 1 processes
DEBUG: Asking scheduler for work...
DEBUG: Pending tasks: 1
INFO: [pid 30338] Worker Worker(salt=329921834, host=G-ubuntu, username=myuser, pid=30338) running   SimpleTask()
SimpleTask: Hello World!
INFO: [pid 30338] Worker Worker(salt=329921834, host=G-ubuntu, username=myuser, pid=30338) done      SimpleTask()
DEBUG: 1 running tasks, waiting for next task to finish
DEBUG: Asking scheduler for work...
INFO: Done
INFO: There are no more tasks to run at this time
INFO: Worker Worker(salt=329921834, host=G-ubuntu, username=myuser, pid=30338) was stopped. Shutting down Keep-Alive thread
&lt;/pre&gt;
&lt;p&gt;There you go! You have learnt a basic example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="linked-task-example"&gt;
&lt;h2&gt;Linked Task Example&lt;/h2&gt;
&lt;p&gt;The above example was a good starter example. Though we did not really do much in terms of building a pipeline.
Lets modify the above code a little bit, so we can build a pipeline.&lt;/p&gt;
&lt;script src="https://gist.github.com/gouthambs/8740bf4ff5e8269fd56a.js"&gt;&lt;/script&gt;&lt;p&gt;This example is built on top of the &amp;quot;Hello World&amp;quot; example from above. The &lt;tt class="docutils literal"&gt;SimpleTask&lt;/tt&gt; outputs
the text &amp;quot;Hello World!&amp;quot;. The &lt;tt class="docutils literal"&gt;DecoratedTask&lt;/tt&gt; takes this output from &lt;tt class="docutils literal"&gt;SimpleTask&lt;/tt&gt; and prefixes
with the word &amp;quot;Decorated&amp;quot;.&lt;/p&gt;
&lt;p&gt;I use the &lt;tt class="docutils literal"&gt;MockFile&lt;/tt&gt; here just as a way to see the results on the console. This is
usually a good testing tool, though I am not sure if it is production ready approach.&lt;/p&gt;
&lt;p&gt;The output for the above example would look like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
DEBUG: Checking if DecoratedTask() is complete
INFO: Scheduled DecoratedTask() (PENDING)
DEBUG: Checking if SimpleTask() is complete
INFO: Scheduled SimpleTask() (PENDING)
INFO: Done scheduling tasks
INFO: Running Worker with 1 processes
DEBUG: Asking scheduler for work...
DEBUG: Pending tasks: 2
INFO: [pid 30648] Worker Worker(salt=907129510, host=G-ubuntu, username=myuser, pid=30648) running   SimpleTask()
SimpleTask: Hello World!
INFO: [pid 30648] Worker Worker(salt=907129510, host=G-ubuntu, username=v, pid=30648) done      SimpleTask()
DEBUG: 1 running tasks, waiting for next task to finish
DEBUG: Asking scheduler for work...
DEBUG: Pending tasks: 1
INFO: [pid 30648] Worker Worker(salt=907129510, host=G-ubuntu, username=myuser, pid=30648) running   DecoratedTask()
DecoratedTask: Decorated Hello World!

INFO: [pid 30648] Worker Worker(salt=907129510, host=G-ubuntu, username=myuser, pid=30648) done      DecoratedTask()
DEBUG: 1 running tasks, waiting for next task to finish
DEBUG: Asking scheduler for work...
INFO: Done
INFO: There are no more tasks to run at this time
INFO: Worker Worker(salt=907129510, host=G-ubuntu, username=myuser, pid=30648) was stopped. Shutting down Keep-Alive thread
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Here we learnt a really basic example that should give you some sense of building Luigi based task pipelines.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Wed, 31 Dec 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-12-31:blog/building-luigi-task-pipeline.html</guid><category>Programming</category><category>Python</category><category>Luigi</category></item><item><title>Flask App Directory Structure</title><link>http://gouthamanbalaraman.com/blog/flask-app-directory-structure.html</link><description>&lt;p&gt;This post is a summary of what I learnt perusing a lot of websites. My goal here is to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;summarize the directory structure for a flask app&lt;/li&gt;
&lt;li&gt;setup SQLAlchemy with migrations&lt;/li&gt;
&lt;li&gt;outline the setup for transition to production&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="directory-structure"&gt;
&lt;h2&gt;Directory Structure&lt;/h2&gt;
&lt;p&gt;If you want to build a website based on the Flask framework for python. I recommend you organize you &lt;tt class="docutils literal"&gt;app&lt;/tt&gt; as:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
~/AppHome
        |-- run.py
        |-- config.py
        |__ /myapp
                |-- __init__.py
                |__ /subapp1
                        |-- __init__.py
                        |-- models.py
                        |-- views.py
                        |-- viewmodel.py
                |__ /templates
                        |-- base.html
                        |-- index.html
                        |__ /subapp1
                                |-- subapp1_index.html
                                |-- otherpage.html
                |__ /static
                        |__ /js
                        |__ /css
        |-- setup.py
        |-- MANIFEST.in
        |-- Requirements.txt
        |__ /env
        |
        |-- manage.py
        |__ /migrations
                |__ ...
        |__ /etl
                |__ ...
        |
        |-- fabfile.py
&lt;/pre&gt;
&lt;p&gt;What I have shown above is the overall structure of a Flask application that will transition
over to production smoothly. Let me explain the structure briefly before we dive into any code.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;run.py&lt;/tt&gt; is the actual python code that will import the app and execute&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;config.py&lt;/tt&gt; is the file for storing configurations for the app&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;myapp&lt;/tt&gt; is the folder containing the python code and its dependencies such as &lt;tt class="docutils literal"&gt;templates&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;static&lt;/tt&gt; files&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;myapp/__init__.py&lt;/tt&gt; is typically where I create the Flask &lt;tt class="docutils literal"&gt;app&lt;/tt&gt; instance and do all the configuration&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;myapp/subapp1&lt;/tt&gt; is a sub-package under the &lt;tt class="docutils literal"&gt;myapp&lt;/tt&gt; packages. I recommend using sub-packages to organize
your web application with the help of &lt;tt class="docutils literal"&gt;Blueprints&lt;/tt&gt;.&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;myapp/subapp1/__init__.py&lt;/tt&gt; is the place to create the &lt;tt class="docutils literal"&gt;Blueprint&lt;/tt&gt; definition and other initializations
corresponding to your sub-package.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;myapp/subapp1/models.py&lt;/tt&gt; is the place to define the SQLAlchemy models.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;myapp/subapp1/views.py&lt;/tt&gt; is the place to define the routes that the submodule will provide&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;myapp/subapp1/viewmodel.py&lt;/tt&gt; is the bridge between model and view. Use this file to create functions
to wrap your database queries using models defined in &lt;tt class="docutils literal"&gt;models.py that ``views.py&lt;/tt&gt; can call.
In the future, should you want to add caching support, you can directly add here and have the benefit of
caching.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;templates&lt;/tt&gt; folder with its sub structure contains the Flask &lt;tt class="docutils literal"&gt;html&lt;/tt&gt; templates. By mirroring the template
sub-folders similar to the app sub-modules, it would be easier to maintain.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;static&lt;/tt&gt; folder contains all the static resources. By isolating this folder, we could use other servers
such as &lt;tt class="docutils literal"&gt;nginx&lt;/tt&gt; to serve static content.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;setup.py&lt;/tt&gt; script can contain the setup script to bundle your app.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;MANIFEST.in&lt;/tt&gt; typically contains resources about your package, other resources that you wish to
package.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Requirements.txt&lt;/tt&gt; is the place to put all your package dependencies. You can easily install all dependencies
using &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;env&lt;/tt&gt; can contain your virtual environment for development.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;manage.py&lt;/tt&gt; is the place to put any kinds of &lt;tt class="docutils literal"&gt;Flask&lt;/tt&gt; related scripts, such as database migrations.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;migrations&lt;/tt&gt; folder containing  configuration and scripts associated with database migration.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;etl&lt;/tt&gt; is a folder to put scripts related to ETL tasks. This is something that you could move to a
different location. Though sometimes it is convenient to group them if you do need to share code with your app.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;fabfile.py&lt;/tt&gt; to automate local and server side tasks that need to be run often.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... to be continued.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Mon, 29 Dec 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-12-29:blog/flask-app-directory-structure.html</guid><category>programming</category><category>flask</category><category>python</category></item><item><title>MySQL Cheat Sheet</title><link>http://gouthamanbalaraman.com/blog/mysql-cheatsheet.html</link><description>&lt;p&gt;Here are some notes and commands on MySQL administration&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Create a database:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
CREATE DATABASE mydatabase;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Creating a user for the database:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
CREATE USER 'testuser'&amp;#64;localhost IDENTIFIED BY 'password';
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Granting &lt;tt class="docutils literal"&gt;testuser&lt;/tt&gt; all privileges on a table:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
GRANT ALL PRIVILEGES ON mydatabase.* TO 'testuser'&amp;#64;localhost;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Show a list of databases:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SHOW DATABASES;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Pick a database to use:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
USE mydatabase;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Show a list of tables after selecting a database:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SHOW TABLES;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Updating a column with a constant value:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
UPDATE table1 SET column_a='value_a', column_b='value_b' WHERE query_id='1';
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Deleting rows that satisfy a criterion:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
DELETE FROM table1 WHERE query_id='1';
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Resetting the primary key value after any deletes that were performed:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
ALTER TABLE table1 AUTO_INCREMENT=1;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Disabling safe update mode, and turning back on:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SET SQL_SAFE_UPDATES = 0;
DELETE FROM table1 WHERE query_id='1';
SET SQL_SAFE_UPDATES = 1;
&lt;/pre&gt;
&lt;p&gt;Use the above with caution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Counting duplicates in a column:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SELECT query_id, COUNT(*) c FROM table1 GROUP BY query_id HAVING c &amp;gt; 1;
&lt;/pre&gt;
&lt;p&gt;This would count all duplicates in query_id and list the count for each. You can drop the &lt;tt class="docutils literal"&gt;HAVING c &amp;gt; 1&lt;/tt&gt; part
if you just want to get a count on a certain column.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Getting size occupied by a database named &lt;tt class="docutils literal"&gt;mydatabase&lt;/tt&gt; listed for each table:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
SELECT table_name AS &amp;quot;Tables&amp;quot;,
round(((data_length + index_length) / 1024 / 1024), 2) &amp;quot;Size in MB&amp;quot;
FROM information_schema.TABLES
WHERE table_schema = &amp;quot;mydatabase&amp;quot;
ORDER BY (data_length + index_length) DESC;
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Tue, 09 Dec 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-12-09:blog/mysql-cheatsheet.html</guid><category>programming</category><category>linux</category><category>database</category><category>mysql</category></item><item><title>Securing Authentication Tokens</title><link>http://gouthamanbalaraman.com/blog/securing-authentication-tokens.html</link><description>&lt;p&gt;The article &lt;a class="reference external" href="/blog/minimal-flask-login-example.html"&gt;Minimal Flask Login Example&lt;/a&gt; provided an introduction to token
based authentication using the Flask-Login extension for the Flask web framework. The focus of that article was to
highlight the crux of authentication logic. One glaring omission was that the token itself was nothing but
the username and password passed as clear text. This clearly will not work!&lt;/p&gt;
&lt;p&gt;The high level control flow involving token based authentication is as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;client (browser) makes a &lt;em&gt;request&lt;/em&gt; for the web token in exchange for authentication credential&lt;/li&gt;
&lt;li&gt;the authentication credentials are serialized to create a token, and server &lt;em&gt;responds&lt;/em&gt; with this token&lt;/li&gt;
&lt;li&gt;every time the client needs to &lt;em&gt;request&lt;/em&gt; a secured page, the client would provide the authentication token to the server
part of the request&lt;/li&gt;
&lt;li&gt;the server deserializes the token, fetches the authentication credentials and validates the token&lt;/li&gt;
&lt;li&gt;if the token is valid, then the server responds with an access to the secured page; should the token be invalid, then
the access to secured page is denied.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the &lt;a class="reference external" href="/blog/minimal-flask-login-example.html"&gt;Minimal Flask Login Example&lt;/a&gt;, we skipped the serialization part
for simplicity. A more rigorous way of doing this would be to use &lt;tt class="docutils literal"&gt;JSONWebSignatureSerializer&lt;/tt&gt; in the
&lt;tt class="docutils literal"&gt;itsdangerous&lt;/tt&gt; package to serialize the authentication credentials.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;itsdangerous&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;JSONWebSignatureSerializer&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JSONWebSignatureSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'secret-key'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JaneDoe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'secret'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;token&lt;/tt&gt; in the above code can be used to pass from the server side. Validating a token is
simple as well.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;itsdangerous&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;JSONWebSignatureSerializer&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JSONWebSignatureSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'secret-key'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;credential&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The above code will get the &lt;tt class="docutils literal"&gt;credential&lt;/tt&gt; corresponding to the user which can then be checked against what is
stored in the database.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Tue, 02 Dec 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-12-02:blog/securing-authentication-tokens.html</guid><category>Programming</category><category>Python</category><category>Flask</category><category>Authentication</category></item><item><title>Multi-Processing With Pandas</title><link>http://gouthamanbalaraman.com/blog/distributed-processing-pandas.html</link><description>&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: &lt;em&gt;There are better ways to do distributed processing with pandas now (2017).&lt;/em&gt; Please refer to an &lt;a class="reference external" href="http://gouthamanbalaraman.com/blog/distributed-processing-pandas-dask.html"&gt;updated post using dask&lt;/a&gt;.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you have used &lt;tt class="docutils literal"&gt;pandas&lt;/tt&gt;, you must be familiar with the awesome functionality and tools that
it brings to data processing. I have used &lt;tt class="docutils literal"&gt;pandas&lt;/tt&gt; as a tool to read data files and transform
them into various summaries of interest. My usual process pipeline would start with
a text file with data in a CSV format. I would read data into a &lt;tt class="docutils literal"&gt;pandas&lt;/tt&gt; &lt;tt class="docutils literal"&gt;DataFrame&lt;/tt&gt;
and run various transformations of interest.&lt;/p&gt;
&lt;p&gt;Recently I stumbled into a problem with this approach. My file was big, in the 100's of MBs. I was
running a 32-bit version of python, and I started getting &lt;tt class="docutils literal"&gt;MemoryError&lt;/tt&gt;. This happens because
&lt;tt class="docutils literal"&gt;pandas&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;numpy&lt;/tt&gt; would need to allocate contiguous memory blocks, and 32-bit system
would have a cap at 2GB. Additionally processing a huge file took some time (more than my impatience
could tolerate). The approach I took to solve this problem is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Read the large input file in smaller chunks so it wouldn't run into &lt;tt class="docutils literal"&gt;MemoryError&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Use multi-processing to process the input file in parallel to speed up processing&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="sample-code"&gt;
&lt;h2&gt;Sample Code&lt;/h2&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Pandas&lt;/tt&gt; &lt;tt class="docutils literal"&gt;read_table&lt;/tt&gt; method can take &lt;tt class="docutils literal"&gt;chunksize&lt;/tt&gt; as an argument and return an &lt;tt class="docutils literal"&gt;iterator&lt;/tt&gt;
while reading a file. This means that you can process individual &lt;tt class="docutils literal"&gt;DataFrames&lt;/tt&gt; consisting of
&lt;tt class="docutils literal"&gt;chunksize&lt;/tt&gt; rows at a time. You can then put the individual results together.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;LARGE_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;my_large_file.txt&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;CHUNKSIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt; &lt;span class="c1"&gt;# processing 100,000 rows at a time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# process data frame&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'__main__'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LARGE_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunksize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CHUNKSIZE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# process each data frame&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;process_frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;There are &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; rows of data&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The code chunk above shows you how to read file in smaller chunks and process
each chunk at a time. You can also add a &lt;tt class="docutils literal"&gt;multiprocessing&lt;/tt&gt; twist to it
to get performance boost. Here is a &lt;tt class="docutils literal"&gt;multiprocessing&lt;/tt&gt; version of the same
snippet from above.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;multiprocessing&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;mp&lt;/span&gt;

&lt;span class="n"&gt;LARGE_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;my_large_file.txt&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;CHUNKSIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt; &lt;span class="c1"&gt;# processing 100,000 rows at a time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# process data frame&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'__main__'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LARGE_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunksize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CHUNKSIZE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# use 4 processes&lt;/span&gt;

        &lt;span class="n"&gt;funclist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# process each data frame&lt;/span&gt;
                &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apply_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process_frame&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;funclist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;funclist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# timeout in 10 seconds&lt;/span&gt;

        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;There are &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; rows of data&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The code snippet above should be fairly self explanatory. The idea here is to
&lt;em&gt;asynchronously&lt;/em&gt; process chunk of data by pushing it into a multiprocessing pool queue.
Each process in pool will work on the task, and return the result.&lt;/p&gt;
&lt;p&gt;Note, it is important to create the &lt;tt class="docutils literal"&gt;Pool&lt;/tt&gt; inside the &lt;tt class="docutils literal"&gt;__main__&lt;/tt&gt; block. That is
because, only one main process should create the pool and distribute asynchronously
amongst different processes.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Wed, 19 Nov 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-11-19:blog/distributed-processing-pandas.html</guid><category>python</category><category>programming</category><category>pandas</category></item><item><title>Setting Up Linode For The Impatient</title><link>http://gouthamanbalaraman.com/blog/setting-up-linode.html</link><description>&lt;p&gt;When you get a linode instance, you really get a barren (sort of) linux machine on the cloud. That means
you have to take care of customizing the server based on your needs. Here are some notes based on what I
wanted to setup.&lt;/p&gt;
&lt;p&gt;My requirements were the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python Setup: Setup python to perform installations using &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Secure Server: Enable firewall etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="linode-basics"&gt;
&lt;h2&gt;Linode Basics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Once I setup the linode account, I used the ssh instructions on the &amp;quot;Remote Access&amp;quot; in the linode
dashboard to get the IP as:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
ssh root&amp;#64;&amp;lt;ip-address&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Setup hostname:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
echo &amp;quot;ServerName&amp;quot; &amp;gt; /etc/hostname
hostname -F /etc/hostname
&lt;/pre&gt;
&lt;p&gt;Try &lt;tt class="docutils literal"&gt;hostname&lt;/tt&gt; on the command line to see the hostname printed correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Add to /etc/hosts. In your &lt;em&gt;desktop&lt;/em&gt;, associate the linode IP with a custom servername of
your liking. Edit /etc/hosts to look like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
127.0.0.1   localhost
127.0.1.1   G-ubuntu
111.11.11.1 ServerName
&lt;/pre&gt;
&lt;p&gt;Also on you linode add an entry to associate &lt;tt class="docutils literal"&gt;127.0.0.1&lt;/tt&gt; with the server hostname. If not you will
a error message that the &amp;lt;ServerName is not recognized when you &lt;tt class="docutils literal"&gt;sudo&lt;/tt&gt;. Add the following to /etc/hostname
in your linode:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
127.0.0.1  ServerName
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="securing-linode"&gt;
&lt;h2&gt;Securing Linode&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Setting up firewall: When I type &lt;tt class="docutils literal"&gt;sudo iptables &lt;span class="pre"&gt;-L&lt;/span&gt;&lt;/tt&gt; I get:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
&lt;/pre&gt;
&lt;p&gt;Now create a file to store the firewall rules using &lt;tt class="docutils literal"&gt;sudo nano /etc/iptables.firewall.rules&lt;/tt&gt; and
paste the following:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix &amp;quot;iptables denied: &amp;quot; --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT
&lt;/pre&gt;
&lt;p&gt;Now the firewall rules can be activated using:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo iptables-restore &amp;lt; /etc/iptables.firewall.rules
&lt;/pre&gt;
&lt;p&gt;Now when you type &lt;tt class="docutils literal"&gt;sudo iptables &lt;span class="pre"&gt;-L&lt;/span&gt;&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             127.0.0.0/8          reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix &amp;quot;iptables denied: &amp;quot;
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
&lt;/pre&gt;
&lt;p&gt;Now to ensure that the firewall is going to be up and running every time you reboot your
Linode, edit &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/network/if-pre-up.d/firewall&lt;/span&gt;&lt;/tt&gt; as &lt;tt class="docutils literal"&gt;sudo&lt;/tt&gt; to add:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
#!/bin/sh
/sbin/iptables-restore &amp;lt; /etc/iptables.firewall.rules
&lt;/pre&gt;
&lt;p&gt;Once you have saved these edits, make this file executable using:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo chmod +x /etc/network/if-pre-up.d/firewall
&lt;/pre&gt;
&lt;p&gt;This should secure your server. If you want to make sure your firewall is up and running,
reboot the server and check what you get when you type &lt;tt class="docutils literal"&gt;sudo iptables &lt;span class="pre"&gt;-L&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Installing and Configuring Fail2Ban: Fail2Ban is an application that prevents
dictionary attacks on your server. When Fail2Ban detects multiple failed login
attempts from the same IP address, it creates temporary firewall rules that block
traffic from the attacker’s IP address. Attempted logins can be monitored on a
variety of protocols, including SSH, HTTP, and SMTP. By default, Fail2Ban monitors SSH only.&lt;/p&gt;
&lt;p&gt;Here’s how to install and configure Fail2Ban:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Install Fail2Ban by entering the following command:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo apt-get install fail2ban
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Optionally, you can override the default Fail2Ban configuration by creating
a new &lt;tt class="docutils literal"&gt;jail.local&lt;/tt&gt; file. Enter the following command to create the file:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo nano /etc/fail2ban/jail.local
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;To learn more about Fail2Ban configuration options, see this article on the &lt;a class="reference external" href="http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Configuration"&gt;Fail2Ban&lt;/a&gt; website.
Fail2Ban is now installed and running on your Linode. It will monitor your log files for failed
login attempts. After an IP address has exceeded the maximum number of authentication attempts,
it will be blocked at the network level and the event will be logged in &lt;tt class="docutils literal"&gt;/var/log/fail2ban.log&lt;/tt&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="python-setup"&gt;
&lt;h2&gt;Python Setup&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Thu, 13 Nov 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-11-13:blog/setting-up-linode.html</guid><category>programming</category><category>linux</category></item><item><title>An Elegy</title><link>http://gouthamanbalaraman.com/blog/jayam-elegy.html</link><description>&lt;div class="line-block"&gt;
&lt;div class="line"&gt;On this day, we mourn the loss of Jayam&lt;/div&gt;
&lt;div class="line"&gt;Mother to our dads,&lt;/div&gt;
&lt;div class="line"&gt;Grandmother to us,&lt;/div&gt;
&lt;div class="line"&gt;Great grandmother to our offspring&lt;/div&gt;
&lt;div class="line"&gt;And an affectionate human being to all.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;May we also remember the spirit that represents the person she was&lt;/div&gt;
&lt;div class="line"&gt;And what she has left in us - in our little genes and in  our memories.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;Lets us remember how her partial blindness&lt;/div&gt;
&lt;div class="line"&gt;Did not impede her ability to fulfil her parental duties.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;Let us remember her love for music&lt;/div&gt;
&lt;div class="line"&gt;And how she strived to impart the same in us.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;Let us remember that in her own quiet ways -&lt;/div&gt;
&lt;div class="line"&gt;Folding clothes in a corner,&lt;/div&gt;
&lt;div class="line"&gt;Sipping &lt;em&gt;Narasus&lt;/em&gt; coffee,&lt;/div&gt;
&lt;div class="line"&gt;Telling bedtime stories,&lt;/div&gt;
&lt;div class="line"&gt;She made a resonant impact in all our lives.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;Perhaps this is the day for us to pause from all the rigmarole&lt;/div&gt;
&lt;div class="line"&gt;And &lt;em&gt;remember&lt;/em&gt; what it means to be &lt;em&gt;remembered&lt;/em&gt;.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;Perhaps this is the day for us to believe&lt;/div&gt;
&lt;div class="line"&gt;That in the face of &lt;em&gt;impossibilities&lt;/em&gt; it is &lt;em&gt;possible&lt;/em&gt; to carry on.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;Perhaps this day should be a reminder for us&lt;/div&gt;
&lt;div class="line"&gt;To &lt;em&gt;live&lt;/em&gt; the gift that is the joy of &lt;em&gt;living&lt;/em&gt;.&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;May her soul rest in peace!&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Sun, 26 Oct 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-10-26:blog/jayam-elegy.html</guid><category>personal</category></item><item><title>Understanding the Econometric Factor Model</title><link>http://gouthamanbalaraman.com/blog/understanding-econometric-factor-model.html</link><description>&lt;p&gt;The post explains the &lt;a class="reference external" href="/blog/econometric-factor-model.html"&gt;Econometric Factor Model&lt;/a&gt;
widget that I have built. The factors used in the econometric factor model are: &lt;em&gt;unemployment&lt;/em&gt;,
&lt;em&gt;consumer sentiment&lt;/em&gt;, &lt;em&gt;market&lt;/em&gt;, &lt;em&gt;size&lt;/em&gt; and &lt;em&gt;value/growth&lt;/em&gt;. A brief explanation of the factors are
as follows.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;em&gt;unemployment&lt;/em&gt; factor is a proxy for the state of economy, and exposure to this factor
measures the impact the economy can have on the performance of this stock.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;consumer sentiment&lt;/em&gt; is a voice of consumers behaviour and sentiment, and this factor
can help understand the impact of consumer confidence on the stock's performance.&lt;/li&gt;
&lt;li&gt;The exposure to &lt;em&gt;market&lt;/em&gt; factor captures how the stock's performance is correlated with
that of the market.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;size&lt;/em&gt; factor (or SML - Small Minus Large ) is a measure of the excess returns that
the small cap has over the large cap stocks. The exposure to this factor is meant to
capture the impact size has on the performance of this stock. Small (large) cap stock will
typically have positive (negative) exposures to this factor.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;value/growth&lt;/em&gt; (or HML - High book-to-value Minus Low) is meant to identify the
value or growth aspect of a stock.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a use case, let us try a few examples and see if it makes sense. The following
table is based on the factor model run using 5 years of historical returns as of
09-30-2014.&lt;/p&gt;
&lt;script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
    var myModule = angular.module('myApp', []);
    myModule.controller('MyCtrl', ['$scope', function($scope){
        $scope.mfData = [
            {Ticker:"X", Unemployment: -0.76, ConsumerSentiment: -0.035, Market: 1.685, Size: 0.3281, Value: 1.509},
            {Ticker:"DAL", Unemployment: -1.183, ConsumerSentiment: 0.309, Market: 0.456, Size: 1.581, Value: 0.038},
            {Ticker:"LH", Unemployment: 0.461, ConsumerSentiment: 0.02, Market: 0.606, Size: 0.081, Value: -0.185},
            {Ticker:"MCD", Unemployment: 0.951, ConsumerSentiment: -0.132, Market: 0.423, Size: -0.329, Value: -0.018},
            {Ticker:"MSFT", Unemployment: -0.248, ConsumerSentiment: -0.192, Market: 1.032, Size: -0.542, Value: -0.05}
         ];
    }]);
&lt;/script&gt;

&lt;div ng-app="myApp"&gt;
    &lt;div ng-controller="MyCtrl"&gt;
        &lt;div class="col-md-12"&gt;
            &lt;table class="table table-bordered col-md-12"&gt;
                &lt;thead&gt;
                    &lt;tr&gt;
                        &lt;th&gt; &lt;span class = "pull-right key"&gt;Ticker&lt;/span&gt;&lt;/td&gt;
                        &lt;th&gt; &lt;span class = "pull-right key"&gt;Unemployment&lt;/span&gt;&lt;/td&gt;
                        &lt;th&gt; &lt;span class = "pull-right key"&gt; Consumer Sentiment&lt;/span&gt;&lt;/td&gt;
                        &lt;th&gt; &lt;span class = "pull-right key"&gt; Market&lt;/span&gt;&lt;/td&gt;
                        &lt;th&gt; &lt;span class = "pull-right key"&gt; Size&lt;/span&gt;&lt;/td&gt;
                        &lt;th&gt; &lt;span class = "pull-right key"&gt; Value&lt;/span&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/thead&gt;
                &lt;tbody&gt;
                    &lt;tr ng-repeat="item in mfData"&gt;
                        &lt;td&gt; &lt;span class = "pull-right value"&gt;{{item.Ticker}}&lt;/span&gt;&lt;/td&gt;
                        &lt;td&gt; &lt;span class = "pull-right value"&gt; {{item.Unemployment}} &lt;/span&gt;&lt;/td&gt;
                        &lt;td&gt; &lt;span class = "pull-right value"&gt; {{item.ConsumerSentiment}} &lt;/span&gt;&lt;/td&gt;
                        &lt;td&gt; &lt;span class = "pull-right value"&gt;{{item.Market}}&lt;/span&gt;&lt;/td&gt;
                        &lt;td&gt; &lt;span class = "pull-right value"&gt;{{item.Size}}&lt;/span&gt;&lt;/td&gt;
                        &lt;td&gt; &lt;span class = "pull-right value"&gt;{{item.Value}}&lt;/span&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;
            &lt;/table&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;&lt;p&gt;United States Steel Corporation (X), Delta Airlines (DAL), and MicroSoft (MSFT) have negative exposure to
unemployment, meaning increase in unemployment (or a detiorating economy) hurts the returns of this
company. Mc Donalds (MCD) has a positive exposure to unemployment, in a hurting economy MCD has a better
business.&lt;/p&gt;
&lt;p&gt;Delta Airlines has the most significant exposure to the consumer sentiment factor. This makes
sense because travel industry benefits from a positive consumer sentiment.&lt;/p&gt;
&lt;p&gt;The companies on the higher end of the large cap spectrum have a negative exposure to the size factor.
The strong positive exposure of DAL to size is a little puzzling, and its history of mergers with
Northwest might explain. This is also highlights that factor models do need more than intuition sometimes to
make sense and make correct use of.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Sun, 26 Oct 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-10-26:blog/understanding-econometric-factor-model.html</guid><category>finance</category><category>investing</category><category>widget</category></item><item><title>Econometric Factor Model</title><link>http://gouthamanbalaraman.com/blog/econometric-factor-model.html</link><description>&lt;p&gt;Please refer to &lt;a class="reference external" href="/blog/understanding-econometric-factor-model.html"&gt;Understanding Econometric Factor Model&lt;/a&gt;
for details.&lt;/p&gt;
&lt;script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"&gt;&lt;/script&gt;
&lt;script src="http://d3js.org/d3.v3.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
    var myModule = angular.module('myApp', []);
        myModule
        .directive( 'barChart', function(){
            var directive = {
                restrict : 'E',
                replace : true,
                scope : {
                    dataset: '=' // bidirectional data binding
                    },
                template :  '&lt;svg ng-attr-width="{{graph.width}}" ng-attr-height="{{graph.height}}"&gt;&lt;/svg&gt;',
                link : function(scope, element, attrs){
                    scope.graph = {height: 200, width: 400};
                    scope.width = function(){
                        dataPoints = scope.dataset.length;
                        return scope.graph / dataPoints;
                     };
                     scope.height = function(data) {
                        max = Math.max.apply(null, scope.dataset);
                        return data / max * scope.graph.height;
                     };
                     scope.x = function(index) {
                        index * scope.width();
                     };
                     scope.y = function(index){
                        scope.graph.height - scope.height(data);
                     };
                }
            };
            return directive;
    });

    myModule.controller('mptCtrl', ['$scope','$http', function($scope, $http){
                    /* Initialization steps */
                    var url = "/extra/data/factormodels/fm_5y_latest.csv";
        $scope.factorItems = ["Unemployment","ConsumerSentiment","Market","Size","ValueGrowth"];
        $scope.riskItems = ["TotalRisk","DiversifiableRisk","NonDiversifiableRisk"];
        $scope.myData = [10,20,30,40,60, 80, 20, 50];
                    $http.get(url).success(function(respData, status, headers, config){
                            var data = d3.csv.parse( respData );
                            $scope.data = data;
            $scope.ticker = 'AAPL';
            $scope.fetchTickerData($scope.ticker);
                    });
                    $scope.fetchTickerData = function(ticker){
                            $scope.message = "";
                            ticker = ticker.toUpperCase();
                            for (var d = 0, len = $scope.data.length; d &lt; len; d += 1) {
                        if ($scope.data[d].Ticker == ticker) {
                                var data = $scope.data[d];
                    var factors = ["Alpha","Unemployment","ConsumerSentiment","Market","Size","ValueGrowth"];
                    var datalist = {};
                    for(var i = 0; i &lt; factors.length; i+=1){
                        datalist[factors[i]] = {exposure: data[factors[i]], std:data[factors[i]+"Std"]};
                    }
                    datalist.Ticker = data.Ticker;
                    datalist.Date = data.Date;
                    datalist.TotalRisk = data.TotalRisk;
                    datalist.DiversifiableRisk = data.DiversifiableRisk;
                    datalist.NonDiversifiableRisk = data.NonDiversifiableRisk;
                    $scope.tickerData = datalist;
                    return;
                        }
            }
            $scope.message = "Ticker not found";
            $scope.tickerData = null;
                    };
            }]);
&lt;/script&gt;
&lt;div ng-app="myApp"&gt;
    &lt;div ng-controller="mptCtrl"&gt;
        &lt;form class="form-inline" ng-submit="fetchTickerData(ticker)"&gt;
                            &lt;fieldset&gt;
                                    &lt;!-- Form Name --&gt;
                                    &lt;!-- Text input--&gt;
                                    &lt;div class="form-group col-md-2 "&gt;
                                      &lt;div class=""&gt;
                                            &lt;input id="ticker" name="ticker" type="text" placeholder="TICKER" class="form-control input-md" ng-model="ticker"&gt;
                                      &lt;/div&gt;
                                    &lt;/div&gt;

                                    &lt;!-- Button --&gt;
                                    &lt;div class="form-group col-md-2 col-md-offset-2"&gt;
                                      &lt;div class=""&gt;
                                            &lt;button id="submit" name="submit" class="btn btn-primary"&gt;Submit&lt;/button&gt;
                                      &lt;/div&gt;
                                    &lt;/div&gt;
                            &lt;/fieldset&gt;
                    &lt;/form&gt;
                    &lt;hr/&gt;

                    &lt;div style="height:800px; "&gt;
                            &lt;div id="results" ng-show="tickerData !=null"&gt;
                                    &lt;div class="col-md-12"&gt;
                    &lt;strong&gt;Factor Exposures - {{tickerData.Ticker}}&lt;/strong&gt;
                    &lt;br/&gt;
                                            &lt;table class="table table-bordered col-md-12"&gt;
                        &lt;thead&gt;
                                                            &lt;tr&gt;
                                                                    &lt;th&gt; &lt;span class = "pull-left key"&gt;Factor&lt;/span&gt;&lt;/td&gt;
                                                                    &lt;th&gt; &lt;span class = "pull-right key"&gt; Exposure &lt;/span&gt;&lt;/td&gt;
                                &lt;th&gt; &lt;span class = "pull-right key"&gt; Standard Deviation &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                    &lt;/thead&gt;
                                                    &lt;tbody&gt;
                                                            &lt;tr ng-repeat="item in factorItems"&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt;{{item}}&lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData[item].exposure}} &lt;/span&gt;&lt;/td&gt;
                                &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData[item].std}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;

                                                    &lt;/tbody&gt;
                                            &lt;/table&gt;
                    &lt;strong&gt;Risk - {{tickerData.Ticker}}&lt;/strong&gt;
                    &lt;br/&gt;
                                            &lt;table class="table table-bordered col-md-12"&gt;
                        &lt;thead&gt;
                                                            &lt;tr&gt;
                                                                    &lt;th&gt; &lt;span class = "pull-right key"&gt;Total Risk (%)&lt;/span&gt;&lt;/td&gt;
                                                                    &lt;th&gt; &lt;span class = "pull-right key"&gt;Diversifiable Risk (%)&lt;/span&gt;&lt;/td&gt;
                                &lt;th&gt; &lt;span class = "pull-right key"&gt; Non-Diversifiable Risk (%)&lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                    &lt;/thead&gt;
                                                    &lt;tbody&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt;{{tickerData.TotalRisk}}&lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.DiversifiableRisk}} &lt;/span&gt;&lt;/td&gt;
                                &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.NonDiversifiableRisk}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                    &lt;/tbody&gt;
                                            &lt;/table&gt;
                                    &lt;/div&gt; &lt;!-- column 1 div --&gt;
                                    &lt;small&gt;
                    &lt;span class="key"&gt;As of date: {{tickerData.Date}}&lt;/span&gt;
                &lt;/small&gt;
                            &lt;/div&gt;&lt;!-- results --&gt;
                            &lt;div id="error" ng-if="tickerData==null"&gt;
                                    {{message}}
                            &lt;/div&gt;
                    &lt;/div&gt;

    &lt;/div&gt; &lt;!-- controller --&gt;
&lt;/div&gt;&lt;!--app --&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Mon, 20 Oct 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-10-20:blog/econometric-factor-model.html</guid><category>finance</category><category>investing</category><category>widget</category></item><item><title>Option Model Handbook, Part II: Introduction to Binomial Trees</title><link>http://gouthamanbalaraman.com/blog/option-model-handbook-part-II-introduction-to-binomial-trees.html</link><description>&lt;p&gt;This is a series of articles pertaining to option model pricing. Here I will
explain the various concepts such as risk-neutral valuation, Black-Scholes formula,
and binomial tree option pricing models.&lt;/p&gt;
&lt;div class="section" id="introduction-to-binomial-trees"&gt;
&lt;h2&gt;Introduction to Binomial Trees&lt;/h2&gt;
&lt;img alt="BinomialTree" src="/images/binomialtree.png" /&gt;
&lt;p&gt;Let us construct a tree whose pricing is given as shown in the figure above, restricting to time
$t_0$ and $t_1$. Initial price of the stock is $S_0$ at $t_0$ and has the possibility of moving to
$S_0u$ or $S_0d$ at time $t_1$. Let $p$ be the probability of the price to rise from
$S_0$ to $S_0u$. Calculating the expected return from the stock at $t_1$
and making use of risk-neutral valuation&lt;/p&gt;
&lt;p&gt;$$ E(S_{t_1}) = pS_0u + (1-p)S_0d = S_0 e^{r(t_1-t_0)} $$&lt;/p&gt;
&lt;p&gt;we get,&lt;/p&gt;
&lt;p&gt;\begin{equation} \label{eq:btp} p = \frac{e^{r(t_1-t_0)} - d}{u - d} \end{equation}&lt;/p&gt;
&lt;p&gt;We need to chose appropriate values for the parameters $u$ and $d$
which can be obtained from equating the variance of the return to
$\sigma^2 \Delta t$. The variance of the stock price return on the
binomial tree is:&lt;/p&gt;
&lt;p&gt;$$ pu^2 + (1−p)d^2 − [ pu+ (1−p)d]^2 = \sigma^2 \Delta t $$&lt;/p&gt;
&lt;p&gt;On ignoring terms of order higher than $\Delta t^2$ and making use of
$ud = 1$, we get&lt;/p&gt;
&lt;p&gt;\begin{equation} u = e^{\sigma \sqrt{\Delta t}} \nonumber  \end{equation}
\begin{equation} d = e^{-\sigma\sqrt{\Delta t}} \end{equation}&lt;/p&gt;
&lt;p&gt;One can make use of the above construction to value an option. Let $f$
be the current value of an option on a stock. Let the payoff of the option
after one step (time T) on a binomial tree be $f_u$ and $f_d$
for up and down movement of the stock respectively. The value of
the option in this case is given as:&lt;/p&gt;
&lt;p&gt;$$ f = e^{−rT}[ pf_u + (1−p)f_d] $$.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Tue, 30 Sep 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-09-30:blog/option-model-handbook-part-II-introduction-to-binomial-trees.html</guid><category>finance</category><category>option models</category><category>binomial tree</category></item><item><title>Modern Portfolio Theory Statistics</title><link>http://gouthamanbalaraman.com/blog/modern-portfolio-theory-statistics.html</link><description>&lt;p&gt;This widget shows Modern Portfolio Theory (MPT) statistics for a selected list of stocks. The calculations were made
using &lt;a class="reference external" href="https://www.quandl.com/"&gt;Quandl&lt;/a&gt; data in the &lt;a class="reference external" href="https://www.quandl.com/WIKI"&gt;WIKI&lt;/a&gt; dataset. The ETF SPY was used as a benchmark using a 5-year time horizon. If the time
series is not long enough, then an N/A is shown. You can also download the &lt;a class="reference external" href="/extra/data/mptstats/mpt_5y_latest.csv"&gt;CSV_File&lt;/a&gt; containing all the metrics.&lt;/p&gt;
&lt;script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"&gt;&lt;/script&gt;
&lt;script src="http://d3js.org/d3.v3.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
    var myModule = angular.module('mptApp', []);
    myModule.controller('mptCtrl', ['$scope','$http', function($scope, $http){
                    /* Initialization steps */
                    var url = "/extra/data/mptstats/mpt_5y_latest.csv";
                    $http.get(url).success(function(respData, status, headers, config){
                            var data = d3.csv.parse( respData );
                            $scope.data = data;
            $scope.ticker = 'AAPL';
            $scope.fetchTickerData($scope.ticker);
                    });
                    $scope.fetchTickerData = function(ticker){
                            $scope.message = "";
                            ticker = ticker.toUpperCase();
                            for (var d = 0, len = $scope.data.length; d &lt; len; d += 1) {
                        if ($scope.data[d].Ticker == ticker) {
                                $scope.tickerData = $scope.data[d];
                            return;
                        }
            }
            $scope.message = "Ticker not found";
            $scope.tickerData = null;
                    };
            }]);
&lt;/script&gt;
&lt;div ng-app="mptApp"&gt;
    &lt;div ng-controller="mptCtrl"&gt;
        &lt;form class="form-inline" ng-submit="fetchTickerData(ticker)"&gt;
                            &lt;fieldset&gt;
                                    &lt;!-- Form Name --&gt;
                                    &lt;!-- Text input--&gt;
                                    &lt;div class="form-group col-md-2 "&gt;
                                      &lt;div class=""&gt;
                                            &lt;input id="ticker" name="ticker" type="text" placeholder="TICKER" class="form-control input-md" ng-model="ticker"&gt;
                                      &lt;/div&gt;
                                    &lt;/div&gt;

                                    &lt;!-- Button --&gt;
                                    &lt;div class="form-group col-md-2 col-md-offset-2"&gt;
                                      &lt;div class=""&gt;
                                            &lt;button id="submit" name="submit" class="btn btn-primary"&gt;Submit&lt;/button&gt;
                                      &lt;/div&gt;
                                    &lt;/div&gt;
                            &lt;/fieldset&gt;
                    &lt;/form&gt;
                    &lt;hr/&gt;
                    &lt;div style="height:800px; "&gt;
                            &lt;div id="results" ng-show="tickerData !=null"&gt;
                                    &lt;div class="col-md-6"&gt;
                                            &lt;table class="table table-striped col-md-6"&gt;
                                                    &lt;tbody&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Ticker&lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.Ticker}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Alpha (%) &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.Alpha}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Beta &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.Beta}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; R-Squared &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.RSquared}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Momentum (%) &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.Momentum}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Annualized Return (%) &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.AnnualizedReturn}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Standard Deviation (%) &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.StandardDeviation}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                    &lt;/tbody&gt;
                                            &lt;/table&gt;
                                    &lt;/div&gt; &lt;!-- column 1 div --&gt;
                                    &lt;div class="col-md-6"&gt;
                                            &lt;table class="table table-striped "&gt;
                                                    &lt;tbody&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Sharpe Ratio &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.SharpeRatio}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Sortino Ratio &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.SortinoRatio}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Information Ratio &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.InformationRatio}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Treynor Ratio &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.TreynorRatio}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;

                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Tracking Error (%) &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.TrackingError}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Upside Capture (%) &lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.UpsideCapture}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                            &lt;tr&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-left key"&gt; Downside Capture (%)&lt;/span&gt;&lt;/td&gt;
                                                                    &lt;td&gt; &lt;span class = "pull-right value"&gt; {{tickerData.DownsideCapture}} &lt;/span&gt;&lt;/td&gt;
                                                            &lt;/tr&gt;
                                                    &lt;/tbody&gt;
                                            &lt;/table&gt;
                                    &lt;/div&gt; &lt;!-- column 2 div--&gt;
                                    &lt;small&gt;&lt;span class="key"&gt;As of date: {{tickerData.Date}}&lt;/span&gt;&lt;/small&gt;
                            &lt;/div&gt;&lt;!-- results --&gt;
                            &lt;div id="error" ng-if="tickerData==null"&gt;
                                    {{message}}
                            &lt;/div&gt;
                    &lt;/div&gt;

    &lt;/div&gt; &lt;!-- controller --&gt;
&lt;/div&gt;&lt;!--app --&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Sun, 21 Sep 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-09-21:blog/modern-portfolio-theory-statistics.html</guid><category>finance</category><category>investing</category><category>widget</category></item><item><title>Option Model Handbook, Part I: Introduction to Option Models</title><link>http://gouthamanbalaraman.com/blog/option-model-handbook-part-I-introduction-to-option-models.html</link><description>&lt;p&gt;This is a series of articles pertaining to option model pricing. Here I will
explain the various concepts such as risk-neutral valuation, Black-Scholes formula,
and binomial tree option pricing models.&lt;/p&gt;
&lt;div class="section" id="introduction-to-option-models"&gt;
&lt;h2&gt;Introduction to Option Models&lt;/h2&gt;
&lt;p&gt;The bedrock of options pricing is the risk-neutral valuation principle, which relates the expected value of a
ﬁnancial product at a future time to its current price. This is consistent with no-arbitrage hypothesis.
Vanilla options have a theoretical price given by the Black-Scholes formula. In this article we will
briefly touch upon these two concepts.&lt;/p&gt;
&lt;div class="section" id="risk-neutral-valuation"&gt;
&lt;h3&gt;Risk-Neutral Valuation&lt;/h3&gt;
&lt;p&gt;An important general principle in options pricing is the risk-neutral valuation. According to this principle, the
expected return from a stock at time $T$, $E(S_T)$, is the risk free value of the current stock price:&lt;/p&gt;
&lt;p&gt;$$ E(S_T) = S_0 e^{rT} $$&lt;/p&gt;
&lt;p&gt;The continuous compounding risk-free rate is $r$ and the current stock price is $S_0$.
The principal of risk-neutral valuation can be used to create a binomial model for price movement,
and subsequently a method to value options.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="black-scholes-formula"&gt;
&lt;h3&gt;Black-Scholes Formula&lt;/h3&gt;
&lt;p&gt;Value of a vanilla European call option, struck at $K$ with time $T$
to maturity, can be derived using the above mentioned risk-neutral valuation principle.
The payoﬀ of the call at maturity on an underlying with price $V$ (at maturity)
is $max(V − K, 0)$. The expected value of this payoﬀ can be found, assuming
a geometric brownian motion price movement for the underlying as,&lt;/p&gt;
&lt;p&gt;\begin{equation} E[max(V-K,0)] = \int_K^\infty (V-K)g(V)dV \end{equation}&lt;/p&gt;
&lt;p&gt;where $g(V)$ is the probability density function of $V$
such that $log(V)$ is normally distributed with standard deviation $w$.
Thus the current value of the call is&lt;/p&gt;
&lt;p&gt;$$  C = e^{-rT} E[max(V-K,0)] $$&lt;/p&gt;
&lt;p&gt;which after a lengthy calculation comes out to be&lt;/p&gt;
&lt;p&gt;\begin{equation} \label{eq:bs} C = S_0 N(d_1) - K e^{-rT} N(d_2)   \end{equation}&lt;/p&gt;
&lt;p&gt;where $S_0$ is the current price of the underlying, the risk free rate $r$,
the volatility of the underlying is $\sigma$,&lt;/p&gt;
&lt;p&gt;$$ d_1 = \frac{ \ln(S_0/K) + (r+\sigma^2/2)T } { \sigma \sqrt{T} } $$&lt;/p&gt;
&lt;p&gt;$$ d_2 = \frac{ \ln(S_0/K) + (r-\sigma^2/2)T } { \sigma \sqrt{T} }  = d_1 - \sigma\sqrt{T}$$&lt;/p&gt;
&lt;p&gt;and $N(x)$ is the cumulative distribution function. The put-call parity relates the price of the
put and call prices, and is given as:&lt;/p&gt;
&lt;p&gt;$$ C - P = S_0 - e^{-rT}K $$&lt;/p&gt;
&lt;p&gt;Put-Call parity and Eq. $\ref{eq:bs}$ can be used to arrive at put prices.&lt;/p&gt;
&lt;p&gt;For the case where the underlying has a continuous payout (dividend), the
Black-Scholes formula can be extended to yield&lt;/p&gt;
&lt;p&gt;$$ C = S_0 e^{-qT} N(d_1^\prime) - K e^{-rT} N(d_2^\prime)  $$&lt;/p&gt;
&lt;p&gt;where&lt;/p&gt;
&lt;p&gt;$$ d_1^\prime  = \frac{ \ln(S_0/K) +  (r - q + \sigma^2/2)T} {\sigma\sqrt{T}} $$&lt;/p&gt;
&lt;p&gt;$$ d_2^\prime = d_1^\prime - \sigma\sqrt{T} $$&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;In this article I explained the fundamentals of option model pricing. We looked
at the risk neutral valuation, and how it can be used to derive the Black-Scholes
model.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Fri, 08 Aug 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-08-08:blog/option-model-handbook-part-I-introduction-to-option-models.html</guid><category>finance</category><category>option models</category><category>binomial tree</category></item><item><title>Minimal Example of Calling Lua Functions from C++</title><link>http://gouthamanbalaraman.com/blog/minimal-example-lua-function-cpp.html</link><description>&lt;p&gt;If you want to extend and customize the capabilities of a C++ application
without requiring a full recompilation, then using a embedded scripting language
is the way to go. Lua is one such embeddable scripting language, and is very popular
among game developers. The main advantage of Lua, in my opinion, is that the core API
is very minimal, has very small memory footprint. The availability of LuaJIT makes
it a very performant alternative as well.&lt;/p&gt;
&lt;p&gt;This article is a continuation of the earlier introductory article &lt;cite&gt;Minimal C++ Example &amp;lt;|filename|minimal-lua.rst&amp;gt;&lt;/cite&gt;.
In this article we will discuss how to call lua functions from C++.&lt;/p&gt;
&lt;div class="section" id="example-code"&gt;
&lt;h2&gt;Example Code&lt;/h2&gt;
&lt;pre class="code c++ literal-block"&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;quot;lua.h&amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;      &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;quot;lualib.h&amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;      &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;quot;lauxlib.h&amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// initialization
&lt;/span&gt;      &lt;span class="n"&gt;lua_State&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lua_open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;luaL_openlibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// execute script
&lt;/span&gt;      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;function sum(a, b) return a+b; end&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// a function that returns sum of two
&lt;/span&gt;      &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;load_stat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luaL_loadbuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;lua_pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// load the function from global
&lt;/span&gt;      &lt;span class="n"&gt;lua_getglobal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sum&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_isfunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// push function arguments into stack
&lt;/span&gt;        &lt;span class="n"&gt;lua_pushnumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;lua_pushnumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;lua_pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;sumval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;lua_isnil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;sumval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lua_tonumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
              &lt;span class="n"&gt;lua_pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sum=%lf&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;sumval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// cleanup
&lt;/span&gt;      &lt;span class="n"&gt;lua_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="code-explained"&gt;
&lt;h2&gt;Code Explained&lt;/h2&gt;
&lt;p&gt;The initial part of the code initialises the &lt;tt class="docutils literal"&gt;lua_State&lt;/tt&gt; loads and executes the script with &lt;tt class="docutils literal"&gt;lua_pcall(L,0,0,0)&lt;/tt&gt;.
Once the script is loaded, the functions are available in the global namespace. Here the script basically is a function
that takes two numbers and returns the sum of the two. Using the &lt;tt class="docutils literal"&gt;lua_getglobal(L, &amp;quot;sum&amp;quot;)&lt;/tt&gt; call,
we load the function into the stack. We can check if the function was loaded correctly using the &lt;tt class="docutils literal"&gt;lua_isfunction(L, &lt;span class="pre"&gt;-1)&lt;/span&gt;&lt;/tt&gt;.
Then we pass the two arguments of the function by pushing them into the stack. Then the &lt;tt class="docutils literal"&gt;lua_pcall&lt;/tt&gt; method executes the
function and loads the result onto the stack. The successful execution of the function can be checked by checking
that the stack is not &lt;tt class="docutils literal"&gt;nil&lt;/tt&gt; using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;!lua_isnil(L,-1)&lt;/span&gt;&lt;/tt&gt;. The returned value can then be accessed by casting the result
in the top of the stack using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;lua_tonumber(L,-1)&lt;/span&gt;&lt;/tt&gt;. We use &lt;tt class="docutils literal"&gt;lua_pop&lt;/tt&gt; to clear the result from the stack.&lt;/p&gt;
&lt;p&gt;Running this example should print:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sum=11.000000
&lt;/pre&gt;
&lt;p&gt;on the screen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This article gave a very minimal example explaining how to call a lua function from C++.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Tue, 05 Aug 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-08-05:blog/minimal-example-lua-function-cpp.html</guid><category>lua</category><category>programming</category><category>C++</category></item><item><title>Running ZEO as a Windows Service</title><link>http://gouthamanbalaraman.com/blog/zeo-as-a-windows-service.html</link><description>&lt;p&gt;The other day, I wanted to run ZEO as a Windows service. The &lt;tt class="docutils literal"&gt;runzeo.py&lt;/tt&gt; part of &lt;tt class="docutils literal"&gt;ZEO&lt;/tt&gt; will let you
run the client, but it doesn't work well for deployment on a windows machine. So I used &lt;tt class="docutils literal"&gt;pywin32&lt;/tt&gt; to wrap
the &lt;tt class="docutils literal"&gt;runzeo.py&lt;/tt&gt; into a Windows Service.&lt;/p&gt;
&lt;div class="section" id="code"&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;You can fetch the source from my github &lt;a class="reference external" href="https://github.com/gouthambs/ZEO-WinService"&gt;repo&lt;/a&gt;. This script requires &lt;tt class="docutils literal"&gt;pywin32&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ZEO&lt;/tt&gt; to run.
I do intend to put it on PyPi when I have the time&lt;/p&gt;
&lt;p&gt;You can run from &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; as Administrator:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt; python zeo_winservice.py
&lt;/pre&gt;
&lt;p&gt;you will be given the service options, as shown below:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Usage: 'zeo_winservice.py [options] install|update|remove|start [...]|stop|restart [...]|debug [...]'
Options for 'install' and 'update' commands only:
 --username domain\username : The Username the service is to run under
 --password password : The password for the username
 --startup [manual|auto|disabled|delayed] : How the service starts, default = manual
 --interactive : Allow the service to interact with the desktop.
 --perfmonini file: .ini file to use for registering performance monitor data
 --perfmondll file: .dll file to use when querying the service for
   performance data, default = perfmondata.dll
Options for 'start' and 'stop' commands only:
 --wait seconds: Wait for the service to actually start or stop.
                 If you specify --wait with the 'stop' option, the service
                 and all dependent services will be stopped, each waiting
                 the specified period.
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="installing-the-service"&gt;
&lt;h2&gt;Installing the Service&lt;/h2&gt;
&lt;p&gt;Before you try to install, make sure you are running &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; as Administrator.
I like to install such that it will start up automatically, as shown below:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;python zeo_winservice.py --startup=auto install
&lt;/pre&gt;
&lt;p&gt;which gives you the following screen with ZEO options:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Installing service ZEO WinService
Start the ZEO storage server.

Usage: %s [-C URL] [-a ADDRESS] [-f FILENAME] [-h]

Options:
-C/--configuration URL -- configuration file or URL
-a/--address ADDRESS -- server address of the form PORT, HOST:PORT, or PATH
                        (a PATH must contain at least one &amp;quot;/&amp;quot;)
-f/--filename FILENAME -- filename for FileStorage
-t/--timeout TIMEOUT -- transaction timeout in seconds (default no timeout)
-h/--help -- print this usage message and exit
-m/--monitor ADDRESS -- address of monitor server ([HOST:]PORT or PATH)
--pid-file PATH -- relative path to output file containing this process's pid;
                   default $(INSTANCE_HOME)/var/ZEO.pid but only if envar
                   INSTANCE_HOME is defined

Unless -C is specified, -a and -f are required.

Enter command line arguments for ZEO Service:
&lt;/pre&gt;
&lt;p&gt;Now you are prompted with the different configurations for the ZEO Service that you can pass. One thing to note here
is that the filename option has to absolute path, and not a relative path.&lt;/p&gt;
&lt;p&gt;An example command line argument is:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Enter command line arguments for ZEO Service: -f D:\path\to\data\file.fs -a localhost:9999
&lt;/pre&gt;
&lt;p&gt;Here I am specifying that ZEO be run with the &lt;tt class="docutils literal"&gt;file.fs&lt;/tt&gt; on &lt;tt class="docutils literal"&gt;localhost&lt;/tt&gt; port &lt;tt class="docutils literal"&gt;9999&lt;/tt&gt;. After installing the
script, you need to start it by:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;python zeo_winservice.py start
&lt;/pre&gt;
&lt;p&gt;You will also be able to access the service from &lt;tt class="docutils literal"&gt;task manager&lt;/tt&gt; or the &lt;tt class="docutils literal"&gt;Windows Services&lt;/tt&gt; app.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="logging"&gt;
&lt;h2&gt;Logging&lt;/h2&gt;
&lt;p&gt;The logs from the service are sent to the windows &lt;tt class="docutils literal"&gt;Event Log&lt;/tt&gt; which can be accessed by opening
the &lt;tt class="docutils literal"&gt;Event Viewer&lt;/tt&gt;. Once you open the &lt;tt class="docutils literal"&gt;Event Viewer&lt;/tt&gt;, the logs can be found under:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Event Viewer-&amp;gt;Windows Logs-&amp;gt;Application
&lt;/pre&gt;
&lt;p&gt;The logs from this script can be found under &lt;tt class="docutils literal"&gt;ZEO WinService&lt;/tt&gt; in the Source column.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Mon, 04 Aug 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-08-04:blog/zeo-as-a-windows-service.html</guid><category>Programming</category><category>Python</category><category>ZEO</category><category>ZODB</category></item><item><title>Minimal Flask-Login Example</title><link>http://gouthamanbalaraman.com/blog/minimal-flask-login-example.html</link><description>&lt;p&gt;The goal of this post is to give a very basic introduction to token based authentication using Flask-Login.
Usually the user credentials are stored in a database, with passwords hashed. However the authentication
mechanism can be understood without having to worry about database, and various token generation algorithms.
As a first step lets focus on just understanding the authentication mechanism. Then in a subsequent post
we will handle other important parts.&lt;/p&gt;
&lt;p&gt;To run this example, you will need &lt;cite&gt;flask&lt;/cite&gt; and &lt;cite&gt;flask-login&lt;/cite&gt; with their dependencies installed.
This can be done using &lt;cite&gt;pip&lt;/cite&gt; as shown below:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;pip install flask
&amp;gt;pip install flask-login
&lt;/pre&gt;
&lt;div class="section" id="example-code"&gt;
&lt;h2&gt;Example Code&lt;/h2&gt;
&lt;p&gt;Here is the full source code that we are about to discuss:&lt;/p&gt;
&lt;script src="https://gist.github.com/gouthambs/0a509faf231cff3cdec7.js"&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div class="section" id="code-explained"&gt;
&lt;h2&gt;Code Explained&lt;/h2&gt;
&lt;p&gt;Lets delve deeper into this example, and I will explain each part of the code in greater detail here.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask.ext.login&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LoginManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UserMixin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;login_required&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;login_manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoginManager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;login_manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init_app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The first five lines of the code import the required modules, and initializes the Flask &lt;tt class="docutils literal"&gt;app&lt;/tt&gt;. Then
the &lt;cite&gt;LoginManager&lt;/cite&gt; instance is created and then is configure for login. Now lets try to understand
the &lt;cite&gt;User&lt;/cite&gt; class.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UserMixin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# proxy for a database of users&lt;/span&gt;
    &lt;span class="n"&gt;user_database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;JohnDoe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;JohnDoe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="s2"&gt;&amp;quot;JaneDoe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;JaneDoe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Jane&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;

    &lt;span class="nd"&gt;&amp;#64;classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Here I have created the &lt;tt class="docutils literal"&gt;User&lt;/tt&gt; class by overloading the &lt;tt class="docutils literal"&gt;UserMixin&lt;/tt&gt; class. The &lt;tt class="docutils literal"&gt;UserMixin&lt;/tt&gt; class
implements some of the default methods, and hence is a convenient starting point. The &lt;tt class="docutils literal"&gt;dict&lt;/tt&gt; &lt;tt class="docutils literal"&gt;user_database&lt;/tt&gt;
is a proxy for all the database code one would need. I am abstracting this away as a &lt;tt class="docutils literal"&gt;dict&lt;/tt&gt; for simplicity.
The &lt;cite&gt;get&lt;/cite&gt; class method returns the user data from &lt;cite&gt;user_database&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;For the &lt;tt class="docutils literal"&gt;LoginManager&lt;/tt&gt; to handle authentication, we have to provide a method for it to load user.
Here I use the generic &lt;tt class="docutils literal"&gt;&amp;#64;login_manager.request_loader&lt;/tt&gt; decorator to decorate the &lt;tt class="docutils literal"&gt;load_user&lt;/tt&gt; function.
The expected behavior of a &lt;tt class="docutils literal"&gt;request_loader&lt;/tt&gt; is to return a &lt;tt class="docutils literal"&gt;User&lt;/tt&gt; instance if the provided credentials are
valid, and return &lt;cite&gt;None&lt;/cite&gt; otherwise.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="nd"&gt;&amp;#64;login_manager.request_loader&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Authorization'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'token'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# naive token&lt;/span&gt;
        &lt;span class="n"&gt;user_entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_entry&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;user_entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;load_user&lt;/tt&gt; looks for a token in &lt;tt class="docutils literal"&gt;Authorization&lt;/tt&gt; header, or the &lt;tt class="docutils literal"&gt;request&lt;/tt&gt; arguments. If a token
is provided, then I return an instance of &lt;tt class="docutils literal"&gt;User&lt;/tt&gt; if the token is valid, and return &lt;tt class="docutils literal"&gt;None&lt;/tt&gt; otherwise.
Here I assume that a valid token would be of the form &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;&lt;/span&gt;&lt;/tt&gt;. This is a naive token,
and should not be used in practice. Using serializers from &lt;tt class="docutils literal"&gt;itsdangerous&lt;/tt&gt; package can come handy. We
will touch upon these issues in another post.&lt;/p&gt;
&lt;p&gt;Once this setup is done, in order to require authentication for a route, use the &lt;tt class="docutils literal"&gt;&amp;#64;login_required&lt;/tt&gt;
decorator.&lt;/p&gt;
&lt;p&gt;Run the above script, and if you visit the &lt;a class="reference external" href="http://localhost:5000/protected/"&gt;LocalHostUnAuthenticated&lt;/a&gt; route without
a token you will get a &lt;tt class="docutils literal"&gt;401 Unauthorized&lt;/tt&gt; message. If you pass a token to
&lt;a class="reference external" href="http://localhost:5000/protected/?token=JohnDoe:John"&gt;LocalHostAuthenticated&lt;/a&gt;, then you will be allowed access to the protected page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This article explained how to write token based authentication using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Flask-Login&lt;/span&gt;&lt;/tt&gt; extension. The focus
of this article was explaining the basic workings of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;flask-login&lt;/span&gt;&lt;/tt&gt; without having to setup database or
even the token generation. Once the basic plumbing is setup, one can extend this example in two ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://gouthamanbalaraman.com/blog/securing-authentication-tokens.html"&gt;Securing Authentication Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;have a database to store and retrive user credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Thu, 24 Jul 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-07-24:blog/minimal-flask-login-example.html</guid><category>Programming</category><category>Python</category><category>Flask</category><category>Authentication</category></item><item><title>Minimal Lua C++ Example</title><link>http://gouthamanbalaraman.com/blog/minimal-lua-c-example.html</link><description>&lt;p&gt;If you want to extend and customize the capabilities of a C++ application
without requiring a full recompilation, then using a embedded scripting language
is the way to go. Lua is one such embeddable scripting language, and is very popular
among game developers. The main advantage of Lua, in my opinion, is that the core API
is very minimal, has very small memory footprint. The availability of LuaJIT makes
it a very performant alternative as well.&lt;/p&gt;
&lt;div class="section" id="example-code"&gt;
&lt;h2&gt;Example Code&lt;/h2&gt;
&lt;p&gt;Here is a minimal Lua(V5.1) - C++  example to get one started.&lt;/p&gt;
&lt;pre class="code c++ literal-block"&gt;
&lt;span class="c1"&gt;// luaexample.cpp
&lt;/span&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;quot;lua.h&amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;quot;lualib.h&amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;quot;lauxlib.h&amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// initialization
&lt;/span&gt;      &lt;span class="n"&gt;lua_State&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lua_open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;luaL_openlibs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// execute script
&lt;/span&gt;      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;print('Hello World!')&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;load_stat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luaL_loadbuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;lua_script&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;lua_pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// cleanup
&lt;/span&gt;      &lt;span class="n"&gt;lua_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="code-explained"&gt;
&lt;h2&gt;Code Explained&lt;/h2&gt;
&lt;p&gt;Here the &lt;tt class="docutils literal"&gt;lua_open&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;luaL_openlibs&lt;/tt&gt; are initialization step in order to prepare
the &lt;tt class="docutils literal"&gt;lua_State * L&lt;/tt&gt;. We store the script that we need to execute in the variable &lt;tt class="docutils literal"&gt;lua_script&lt;/tt&gt;.
The &lt;tt class="docutils literal"&gt;luaL_loadbuffer&lt;/tt&gt; is used to load the script. The loaded script can be executed by
calling &lt;tt class="docutils literal"&gt;lua_pcall(L, 0, 0, 0)&lt;/tt&gt;. The arguments passed to &lt;tt class="docutils literal"&gt;lua_pcall&lt;/tt&gt; are the &lt;tt class="docutils literal"&gt;lua_State&lt;/tt&gt; pointer,
number of arguments to the script (which is none here), number of values returned (which is none here). The
last argument to &lt;tt class="docutils literal"&gt;lua_pcall&lt;/tt&gt; is the error handler which we will not discuss here.&lt;/p&gt;
&lt;p&gt;This needs to be compiled using a C++ compiler and linked to Lua library. When you run the
executable, you should see &lt;tt class="docutils literal"&gt;Hello World!&lt;/tt&gt; printed on the screen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We looked at a rather simple introductory example of &lt;tt class="docutils literal"&gt;lua&lt;/tt&gt; interpreter embeded into &lt;tt class="docutils literal"&gt;C++&lt;/tt&gt; code.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 17 Jul 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-07-17:blog/minimal-lua-c-example.html</guid><category>lua</category><category>programming</category><category>C++</category></item><item><title>Flask Track Usage Primer</title><link>http://gouthamanbalaraman.com/blog/flask-track-usage.html</link><description>&lt;p&gt;Recently I had a requirement to add light weight tracking for a Flask app. Tools like Google analytics was not
an option because, I wanted raw number and data handy rather than just figures, this was a website page in the intranet, and
I also wanted to easily track all the REST apis. That is when I stumbled upon &lt;a class="reference external" href="http://www.stevemilner.org/"&gt;Steve Milner's&lt;/a&gt;
&lt;cite&gt;Flask-Track-Usage&lt;/cite&gt; package.&lt;/p&gt;
&lt;p&gt;The API and usage is incredibly simple, and as of version 0.0.7 supported Mongo DB storage. Since Mongo was not an
option for me, I added SQLAlchemy based storage, thus opening doors for a wide array of databases. These additions will
be released as part of version 1.0.0.&lt;/p&gt;
&lt;p&gt;Here is a quick-start version on using SQLStorage with Flask-Track-Usage:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# mainapp.py&lt;/span&gt;
&lt;span class="c1"&gt;# Create the Flask 'app'&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Set the configuration items manually for the example&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'TRACK_USAGE_USE_FREEGEOIP'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'TRACK_USAGE_INCLUDE_OR_EXCLUDE_VIEWS'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'include'&lt;/span&gt;

&lt;span class="c1"&gt;# We will just print out the data for the example&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask.ext.track_usage&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TrackUsage&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask.ext.track_usage.storage.sql&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SQLStorage&lt;/span&gt;

&lt;span class="c1"&gt;# Make an instance of the extension&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrackUsage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SQLStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn_str&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sqlite:///D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;usage_tracking.db&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Make an instance of the extension&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrackUsage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Include the view in the metrics&lt;/span&gt;
&lt;span class="nd"&gt;&amp;#64;t.include&lt;/span&gt;
&lt;span class="nd"&gt;&amp;#64;app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Run the application!&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;In the code above, the &lt;cite&gt;SQLStorage&lt;/cite&gt; object is created with a &lt;cite&gt;conn_str&lt;/cite&gt; argument which can be
any of the &lt;a class="reference external" href="http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html"&gt;engine configurations&lt;/a&gt;
supported by SQLAlchemy itself.&lt;/p&gt;
&lt;p&gt;You can use Flask-Track-Usage with blueprints as well. This is how you include blueprints views:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# Here app is the Flask app created in mainapp.py&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'TRACK_USAGE_INCLUDE_OR_EXCLUDE_VIEWS'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'include'&lt;/span&gt;

&lt;span class="c1"&gt;# Make an instance of the extension&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrackUsage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SQLStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn_str&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sqlite:///D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;usage_tracking.db&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# exclude just the a_blueprint out&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;my_blueprints&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;a_blueprint&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exclude_blueprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_blueprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;What we have done here is to include all views, except for the ones in the blueprint &lt;tt class="docutils literal"&gt;a_blueprint&lt;/tt&gt;.
You can instead exclude all by default, and include just the specific ones as shown below.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# Here app is the Flask app created in mainapp.py&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'TRACK_USAGE_INCLUDE_OR_EXCLUDE_VIEWS'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'exclude'&lt;/span&gt;

&lt;span class="c1"&gt;# Make an instance of the extension&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrackUsage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SQLStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn_str&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sqlite:///D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;usage_tracking.db&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;my_blueprints&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;a_blueprint&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;include_blueprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_blueprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once you have setup the extension to track usage, you can even use the &lt;tt class="docutils literal"&gt;_get_usage&lt;/tt&gt; method
part of the &lt;tt class="docutils literal"&gt;Storage&lt;/tt&gt; object to view the usage hits. This method returns a list of JSON
dict and has the following schema:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[
    {
            'url': str,
            'user_agent': {
                'browser': str,
                'language': str,
                'platform': str,
                'version': str,
            },
            'blueprint': str,
            'view_args': dict or None
            'status': int,
            'remote_addr': str,
            'authorization': bool,
            'ip_info': str or None,
            'path': str,
            'speed': float,
            'date': datetime,
    },
    {
        ....
    }
]
&lt;/pre&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Wed, 26 Mar 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-03-26:blog/flask-track-usage.html</guid><category>Programming</category><category>Python</category></item><item><title>Git For Dummies</title><link>http://gouthamanbalaraman.com/blog/git-for-dummies.html</link><description>&lt;p&gt;Git is a version control with a ton of powerful features. This article is intended to be
an introduction for dummies (like me). I have had to do a lot of googling lately to get familiar
with git. My understanding of git is a work in progress. Here I summarize some of the basic
commands and features that I learnt. I plan to keep this article updated as and when I learn
something new.&lt;/p&gt;
&lt;div class="section" id="git-basics"&gt;
&lt;h2&gt;Git Basics&lt;/h2&gt;
&lt;p&gt;One of the basic concepts in git is the notion of &lt;em&gt;upstream&lt;/em&gt; and &lt;em&gt;origin&lt;/em&gt;. The term &lt;em&gt;upstream&lt;/em&gt; refers to the main
repository lets say the pandas on github hosted at &lt;a class="reference external" href="https://github.com/pydata/pandas"&gt;https://github.com/pydata/pandas&lt;/a&gt;. However you have forked the
to work on an issue, then the &lt;em&gt;origin&lt;/em&gt; would refer to the user's fork of the &lt;em&gt;upstream&lt;/em&gt; repository.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Initialize repository&lt;/strong&gt;: in an empty folder:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git init
&lt;/pre&gt;
&lt;p&gt;You should see a message akin to:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Initialized empty Git repository in /home/username/test/.git/
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Add remote repository&lt;/strong&gt;:  To hook up to your local repository to a remote repository, such as the &lt;tt class="docutils literal"&gt;pandas&lt;/tt&gt; repository on
github:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git remote add upstream https://github.com/pydata/pandas.git
&lt;/pre&gt;
&lt;p&gt;Note that instead of adding upstream, I could have added my fork as origin as shown below:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git remote add origin https://github.com/gouthambs/pandas.git
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Remove remote repository&lt;/strong&gt;: You have made a mistake and added a wrong remote repository. To remove a remote repo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git remote remove upstream
&lt;/pre&gt;
&lt;p&gt;You can do the same to remove a remote origin:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git remote remove origin
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;View remote repositories&lt;/strong&gt;: Check what the remote repositories are attached to your local repo using:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git remote -v
&lt;/pre&gt;
&lt;p&gt;This after adding the above pandas repo would show something like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
upstream    https://github.com/pydata/pandas.git (fetch)
upstream    https://github.com/pydata/pandas.git (push)
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Fetching code from remote&lt;/strong&gt;: Now that you have hooked up to a remote repository, how do you fetch the code from
there? Lets say we have added remote upstream, and we want to fetch the code, then do the following:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git fetch upstream
&lt;/pre&gt;
&lt;p&gt;What this does is it fetches the whole repository, with all its branches and tags etc. Now to actually start using
a particular branch you have to checkout.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Checkout code&lt;/strong&gt;: To checkout the master try:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git checkout master
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Syncing origin with upstream&lt;/strong&gt;: If you have forked a project and have been working on your fork for a while,
what will happen is that the project that you originally forked from has advanced. Then you would need
to sync your fork with upstream to ensure that your changes are still valid. This can be done by:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git merge upstream/master
&lt;/pre&gt;
&lt;p&gt;Here I am syncing the &lt;tt class="docutils literal"&gt;upstream/master&lt;/tt&gt; with the local checked out project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="committing-code-changes"&gt;
&lt;h2&gt;Committing Code Changes&lt;/h2&gt;
&lt;p&gt;Now when you have checked out code and made some modifications. Now you want to share to the world. You have
to go through three steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Staging your changes&lt;/strong&gt;: This is a way to specify what you want to commit and what you want to ignore. You stage your commit by:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git add &amp;lt;filename&amp;gt;
&lt;/pre&gt;
&lt;p&gt;What this does is adds your file for commit. If you type &lt;tt class="docutils literal"&gt;git status&lt;/tt&gt; you will see that your new file has been
staged for commit. This step gives you control on what files you want to commit and what you don't want to commit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Commit your staged changes&lt;/strong&gt;: When you commit your changes, then your changes are registered in your local repository:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git commit -m &amp;lt;message&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This pushes your code changes to the local repository. Your changes will not be sent to the remote repository
such as github yet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Push your commits&lt;/strong&gt;: You have to push your changes to send it up to the remote repo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git push origin master
&lt;/pre&gt;
&lt;p&gt;Here we are assuming that you want to push your changes to the master.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="branching-and-merging"&gt;
&lt;h2&gt;Branching and Merging&lt;/h2&gt;
&lt;p&gt;Say you have checked out a repository, and you want to work on a feature. Its a good idea to create a feature
branch, to work on your modifications.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;To create a branch&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git checkout -b myAwesomeFeature
Switched to a new branch &amp;quot;myAwesomeFeature&amp;quot;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Deleting branches&lt;/strong&gt;: To delete a local branch:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git branch -d myAwesomeFeature
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;List branches&lt;/strong&gt;: To list local branches:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git branch
&lt;/pre&gt;
&lt;p&gt;To list remote branches only:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git branch -r
&lt;/pre&gt;
&lt;p&gt;To list all branches:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git branch -a
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="tagging"&gt;
&lt;h2&gt;Tagging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;List all the tags&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git tag
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Creating tags&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git tag -a v0.5.0 -m &amp;quot;Tagging version 0.5.0&amp;quot;
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Thu, 20 Mar 2014 00:00:00 -0700</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-03-20:blog/git-for-dummies.html</guid><category>git</category><category>programming</category><category>github</category></item><item><title>Asynchronous Python Logging Using MSMQ</title><link>http://gouthamanbalaraman.com/blog/asynchronous-python-logging-using-msmq.html</link><description>&lt;p&gt;If you have a web application running in Python, there can be a need for the logging to
not interfere with the performance. Default file based loggers can lead to a slow down
because of the constand disk writes. An alternate solution that can be quite handy is
logging into a message based logger, such as MSMQ. This post is built on my earlier post
&lt;a class="reference external" href="/blog/sending-msmq-messages-python.html"&gt;Sending MSMQ Messages Using Python&lt;/a&gt;, where
I discuss how to setup, send and receive messages using MSMQ.&lt;/p&gt;
&lt;p&gt;Here I will show how one can use the MSMQ to build a custom handler, that can be used
with the logging module in python. Here is the &lt;tt class="docutils literal"&gt;MSMQHandler&lt;/tt&gt; class:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
    &lt;span class="c1"&gt;# customhandler.py&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MSMQHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;label_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;dest_computer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;win32com.client&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queue_name&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;label_name&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;computer_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dest_computer&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;dest_computer&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;  &lt;span class="bp"&gt;None&lt;/span&gt;\
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'COMPUTERNAME'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;win32com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MSMQ.MSMQQueueInfo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FormatName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;direct=os:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;computer_name&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;\
            &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;PRIVATE$&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue_name&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;win32com.client&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;win32com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MSMQ.MSMQMessage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label_name&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once you have the handler in place, and setup a private MSMQ queue, say KaruthQueue, then
you can incorporate it into your workflow as shown below:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="c1"&gt;# example.py&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;customhandler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MSMQHandler&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;lgr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MSMQHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;KaruthQueue&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;QPyLog&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# here KaruthQueue is the private queue name&lt;/span&gt;
&lt;span class="n"&gt;lgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;lgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;lgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Test Message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;And that completes the MSMQ logger using python. Now all your logs will be pushed to the KaruthQueue
that we created. You can use the example shown &lt;a class="reference external" href="http://gouthamanbalaraman.com/blog/sending-msmq-messages-python.html"&gt;here&lt;/a&gt; to read the messages in a seperate application
and store any way you chose, files, database etc.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Fri, 21 Feb 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-02-21:blog/asynchronous-python-logging-using-msmq.html</guid><category>python</category><category>programming</category></item><item><title>Sending MSMQ Messages Using Python</title><link>http://gouthamanbalaraman.com/blog/sending-msmq-messages-python.html</link><description>&lt;p&gt;MSMQ is a message queue in the Windows environment, very much like
RabbitMQ. MSMQ can be used as a task queue or for communicating
between processes. One advantage of using MSMQ rather than inter-process communication (IPC)
is that messages have persistence. Here I show how to send and receive MSMQ messages using python.&lt;/p&gt;
&lt;div class="section" id="setting-up-msmq-on-windows-7"&gt;
&lt;h2&gt;Setting Up MSMQ on Windows 7&lt;/h2&gt;
&lt;p&gt;Before we can proceed with the code, here is a quick note on set-up.
To setup MSMQ (disabled by default) go to &lt;em&gt;Control Panel&lt;/em&gt; -&amp;gt; &lt;em&gt;Programs and Features&lt;/em&gt; -&amp;gt; &lt;em&gt;Turn Windows Features on or off&lt;/em&gt; (on the left panel). Now check &lt;em&gt;Microsoft Message Queue(MSMQ) Server&lt;/em&gt; if it is not checked. Hit OK. Now we have enabled MSMQ server.&lt;/p&gt;
&lt;p&gt;Now that we have the MSMQ server up and running, lets create a private queue so we can use in our script. To do that, go to &lt;em&gt;Control Panel&lt;/em&gt; -&amp;gt; &lt;em&gt;Administrative Tools&lt;/em&gt; -&amp;gt; &lt;em&gt;Computer Management&lt;/em&gt;. Expand &lt;em&gt;Services and Applications&lt;/em&gt; -&amp;gt; &lt;em&gt;Message Queuing&lt;/em&gt;. Select &lt;em&gt;Private Queues&lt;/em&gt; under &lt;em&gt;Message Queuing&lt;/em&gt; and right-click and click &lt;em&gt;New&lt;/em&gt;. Now in the dialog box put a &lt;em&gt;Queue Name&lt;/em&gt;, for this example purpose, say &lt;em&gt;KaruthQueue&lt;/em&gt; and click OK.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="installing-pywin32"&gt;
&lt;h2&gt;Installing PyWin32&lt;/h2&gt;
&lt;p&gt;To send and receive MSMQ messages you need the awesome Python for Windows Extension module, &lt;a class="reference external" href="http://sourceforge.net/projects/pywin32/"&gt;PyWin32&lt;/a&gt; by Mark Hammond. Once you have completed installation, you can check if your installation is fine by trying &lt;tt class="docutils literal"&gt;import win32com&lt;/tt&gt;. If you don't get any errors, then you are good to go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sending-msmq-messages"&gt;
&lt;h2&gt;Sending MSMQ Messages&lt;/h2&gt;
&lt;p&gt;Here is a small code snippet that shows you how to send messages using MSMQ.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;win32com.client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;win32com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MSMQ.MSMQQueueInfo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;computer_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'COMPUTERNAME'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FormatName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;direct=os:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;computer_name&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;PRIVATE$&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;KaruthQueue&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Open a ref to queue&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;win32com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MSMQ.MSMQMessage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TestMsg&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;The quick brown fox jumps over the lazy dog&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Voila! We have sent our message. You can check if the message was sent properly by checking under
&lt;em&gt;Control Panel&lt;/em&gt; -&amp;gt; &lt;em&gt;Administrative Tools&lt;/em&gt; -&amp;gt; &lt;em&gt;Computer Management&lt;/em&gt; -&amp;gt; &lt;em&gt;Services and Applications&lt;/em&gt; -&amp;gt; &lt;em&gt;Message Queuing&lt;/em&gt; -&amp;gt; &lt;em&gt;Private Queues&lt;/em&gt;
-&amp;gt; &lt;em&gt;KaruthQueue&lt;/em&gt; -&amp;gt; &lt;em&gt;Queue Messages&lt;/em&gt;. Right click and refresh after you have run the script, if you don't see any.
You should see an entry there that corresponds to the message that was sent&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="receiving-msmq-messages"&gt;
&lt;h2&gt;Receiving MSMQ Messages&lt;/h2&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;win32com.client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;win32com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MSMQ.MSMQQueueInfo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;computer_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'COMPUTERNAME'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FormatName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;direct=os:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;computer_name&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;PRIVATE$&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;KaruthQueue&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;qinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Open a ref to queue to read(1)&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Receive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Label:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Body :&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;
&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Run this code after you have sent the message using the above script. Now you should
see your earlier message printed out.&lt;/p&gt;
&lt;p&gt;Have fun messaging!&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Fri, 21 Feb 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-02-21:blog/sending-msmq-messages-python.html</guid><category>python</category><category>programming</category></item><item><title>A Short Story of Wall Street</title><link>http://gouthamanbalaraman.com/blog/a-short-story-of-wall-street.html</link><description>&lt;p&gt;In the last couple of decades, the US market has witnessed a
technology bubble, a housing bubble, recession, and market
crashes. I wanted to understand the human sentiment, the fear
when market crashes, the euphoria while riding the upside of the bubble.
Here I narrate the story of wall-street from the view of short-term volatility.&lt;/p&gt;
&lt;div class="section" id="volatility"&gt;
&lt;h2&gt;Volatility&lt;/h2&gt;
&lt;p&gt;Volatility is a finance jargon for quantifying uncertainty over a window of time.
If the window is small (like a week),
then one can get a view of the market's reaction to day-to-day occurrences. On the other hand
if we measure volatility using a larger window (such as a year), then a lot of the day-to-day
noise dies out, and you get a macroscopic view of the market.&lt;/p&gt;
&lt;p&gt;I wanted to understand how the market reacts to the crashes, and recessions.
Do these things just happen out of the blue? Is there a lot of uncertainty, fear or excitement
leading up to a market collapse? Is there a way to compare the latest market crash with those that
have come before?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-voice-of-uncertainty"&gt;
&lt;h2&gt;The Voice of Uncertainty&lt;/h2&gt;
&lt;img alt="SandPVolatility" src="/images/SandPVolatility.png" /&gt;
&lt;p&gt;The picture above shows the S&amp;amp;P 500 index at the top, and its short-term
volatility over the last 33 years. The last 33 years have gone through
4 recessions, the regions shaded in green. Here are some interesting
observations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The markets prior to 1995 were less volatile, by about 24%, than
post 1995. The average volatility was 14% for the time period of
1980 to 1995, in contrast with a 17.3% for the period 1995 to 2013.&lt;/li&gt;
&lt;li&gt;On pure percentage terms, the market crash on Black Monday (S&amp;amp;P 500 fell by 25.7% on Oct 19, 1987)
was larger than the market drop in 2008 (21% drop in the week ending October 10, 2008).
But the volatility paints a totally different picture. The uncertainty during
2008 market crash was roughly 20% more than that during the 1987 market crash.&lt;/li&gt;
&lt;li&gt;In August of 2011, the S&amp;amp;P downgraded US credit from AAA to AA+. This made
the market volatile, and that is the little blip you see in 2011. The irony is,
prior to 2008 crash, S&amp;amp;P had rated a some of the mortgage backed securities as
high quality debt, even though a lot of them defaulted.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="methodology"&gt;
&lt;h3&gt;Methodology&lt;/h3&gt;
&lt;p&gt;I use S&amp;amp;P 500 to be representative of the stock market. The short term volatility is
calculated by computing volatility using daily returns over a 45 day window.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Thu, 23 Jan 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-01-23:blog/a-short-story-of-wall-street.html</guid><category>finance</category><category>equity</category></item><item><title>Calculating Stock Beta, Volatility, and More</title><link>http://gouthamanbalaraman.com/blog/calculating-stock-beta.html</link><description>&lt;p&gt;Have you ever wondered how to calculate the Beta value that is shown in
&lt;a class="reference external" href="http://www.google.com/finance"&gt;GoogleFinance&lt;/a&gt; or &lt;a class="reference external" href="http://www.finance.yahoo.com/"&gt;YahooFinance&lt;/a&gt; and what does it mean from an investment perspective?
This article will give you an introduction to the concept and demonstrate how
you can calculate various time series measures for a stock using python. The
&lt;a class="reference external" href="http://gouthamanbalaraman.com/blog/modern-portfolio-theory-statistics.html"&gt;Modern Portfolio Theory Statistics&lt;/a&gt;
page shows calculated betas, alpha, etc for a few thousand stocks.&lt;/p&gt;
&lt;div class="section" id="beta-alpha-and-r-squared"&gt;
&lt;h2&gt;Beta, Alpha and R-squared&lt;/h2&gt;
&lt;p&gt;Beta of a stock is a measure of relative risk of the stock with respect to the market.
The convention (though not a rule) is to use S&amp;amp;P 500 index as the proxy for market.
A beta value of greater than 1 means that the stock returns amplify the market returns
on both the upside and downside. On the contrary, a beta value of less than 1 means
that the stock returns are subdued in comparison to the market returns.
It is very important to understand that beta is a relative measure of risk, and
not an absolute measure of risk. That means that we are only saying how risky the stock is
vis-a-vis the market. If the stock market itself is overheated and volatile, then
a beta of 1 means that the stock is equally volatile, and equally risky.&lt;/p&gt;
&lt;p&gt;The beta is calculated using regression analysis. In simple terms if you plot
the returns of stock as a function of the returns of the market benchmark (such as S&amp;amp;P 500)
and fit it with a straight line, then beta is nothing but the slope of the fitted line.
The regression equation is given as shown below.&lt;/p&gt;
&lt;p&gt;$$ R^{stock}_i = \alpha + \beta \times R^{market}_i + \epsilon_i  $$&lt;/p&gt;
&lt;p&gt;In Capital Asset Pricing Model, the returns of the stock $R^{stock}$
and that of the market $R^{market}$ are adjusted for the risk-free
rate. Here for simplicity I leave that out. Given the current low interest rate
environment, this adjustment will add little value.&lt;/p&gt;
&lt;p&gt;Alpha of a stock gives you a measure of the excess return with respect to the benchmark.
A positive alpha for a stock or portfolio gives you sense of how well your asset
outperformed a benchmark.&lt;/p&gt;
&lt;p&gt;The $R^2$ is a measure of how well the the returns of a stock is explained by the
returns of the benchmark. If your investment goal is to track a particular benchmark,
then you should chose stocks that show a high $R^2$ with respect to the benchmark.
The $R^2$ value of $1$ means that the benchmark completely explains the stock returns,
while a value of $0$ means that the benchmark does not explain the  stock
returns.&lt;/p&gt;
&lt;p&gt;R-squared is defined as:&lt;/p&gt;
&lt;p&gt;$$    R^2 = 1 - SS_{res}/SS_{tot} $$&lt;/p&gt;
&lt;p&gt;where&lt;/p&gt;
&lt;p&gt;$$    SS_{res} = \sum_i (R^{stock}_i - f^{stock}_i)^2 $$&lt;/p&gt;
&lt;p&gt;$$    SS_{tot} = \sum_i (R^{stock}_i - &amp;lt;R^{stock}&amp;gt;)^2 $$&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="volatility-and-momentum"&gt;
&lt;h2&gt;Volatility and Momentum&lt;/h2&gt;
&lt;p&gt;The measures discussed in the earlier section are what I would call &lt;em&gt;relative
measures&lt;/em&gt;, i.e., they are with respect to a proxy that is a representation of
market. Time series measures such as volatility and momentum are what I would
call &lt;em&gt;innate measures&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Volatility is nothing but the standard deviation of the returns of the stock.
It gives us a sense of how much the stock returns fluctuate and how risky it is.
High volatile stocks have high risk, and also have the potential to offer higher
returns. A 3-year history of 1-month returns can be a good sample to calculate
volatility.&lt;/p&gt;
&lt;p&gt;Momentum is a measure of the past returns over a certain period. The 1-year
momentum will be the 1-year return of the stock, where as a 3-year momentum
will be the 3-year return of the stock.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-code"&gt;
&lt;h2&gt;Python Code&lt;/h2&gt;
&lt;p&gt;One can use data from yahoo finance to calculate the stock beta as shown:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pandas.io.data&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DataReader&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;

&lt;span class="c1"&gt;# Grab time series data for 5-year history for the stock (here AAPL)&lt;/span&gt;
&lt;span class="c1"&gt;# and for S&amp;amp;P-500 Index&lt;/span&gt;
&lt;span class="n"&gt;sdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2008&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;edate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DataReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WFM'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'yahoo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;sdate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;edate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dfb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DataReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'^GSPC'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'yahoo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;sdate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;edate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# create a time-series of monthly data points&lt;/span&gt;
&lt;span class="n"&gt;rts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'M'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;how&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'last'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rbts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'M'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;how&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'last'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dfsm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;'s_adjclose'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Adj Close'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                        &lt;span class="s1"&gt;'b_adjclose'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rbts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Adj Close'&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
                        &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# compute returns&lt;/span&gt;
&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;'s_returns'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'b_returns'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;'s_adjclose'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'b_adjclose'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;\
    &lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;'s_adjclose'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'b_adjclose'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;dfsm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;covmat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cov&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s_returns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b_returns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# calculate measures now&lt;/span&gt;
&lt;span class="n"&gt;beta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;covmat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;covmat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s_returns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b_returns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# r_squared     = 1. - SS_res/SS_tot&lt;/span&gt;
&lt;span class="n"&gt;ypred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;beta&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b_returns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;SS_res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ypred&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s_returns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;SS_tot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;covmat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# SS_tot is sample_variance*(n-1)&lt;/span&gt;
&lt;span class="n"&gt;r_squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;SS_res&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;SS_tot&lt;/span&gt;
&lt;span class="c1"&gt;# 5- year volatiity and 1-year momentum&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;covmat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;momentum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dfsm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s_returns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# annualize the numbers&lt;/span&gt;
&lt;span class="n"&gt;prd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;12.&lt;/span&gt; &lt;span class="c1"&gt;# used monthly returns; 12 periods to annualize&lt;/span&gt;
&lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;prd&lt;/span&gt;
&lt;span class="n"&gt;volatility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r_squared&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;momentum&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Some caveats about the sample code. The returns are calculated using the
adjusted close from Yahoo finance data. This is because the adjusted close
accounts for dividends and splits etc. In my personal experience I have
found the returns calculated this way to be a reasonably close estimate
but not always accurate. The volatility is calculated here as a simple
standard deviation of the returns. From an option-pricing
model perspective volatility is calculated assuming a log-normal distribution
for the returns.&lt;/p&gt;
&lt;p&gt;The alpha shown above is annualized by scaling by a factor of 12, the periodicity
of returns. The same goes for volatility, which is scaled by $\sqrt{12}$
in order to annualize.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Gouthaman Balaraman</dc:creator><pubDate>Thu, 09 Jan 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-01-09:blog/calculating-stock-beta.html</guid><category>finance</category><category>investing</category></item><item><title>Python Multiprocessing as a Task Queue</title><link>http://gouthamanbalaraman.com/blog/python-multiprocessing-as-a-task-queue.html</link><description>&lt;p&gt;When you have computationally intensive tasks in your website (or scripts),
it is conventional to use a task queue such as &lt;a class="reference external" href="http://www.celeryproject.org/"&gt;Celery&lt;/a&gt;. Using Celery requires
some amount of setup and if you want to avoid, try using the following task
queue based on the multiprocessing.
Depending on the application at hand, Celery might be an overkill. An alternate approach
is to use multiprocessing as a task queue.&lt;/p&gt;
&lt;p&gt;Here is a simple introduction to multiprocessing:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multiprocessing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Pool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;expensive_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# do your expensive time consuming process&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'__main__'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# start 4 worker processes&lt;/span&gt;
        &lt;span class="n"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# evaluate &amp;quot;f(10)&amp;quot; asynchronously&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apply_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expensive_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The above snippet is copied from the multiprocessing documentation, and is fairly self
explanatory. In the main block we start a pool of 4 processes. Then we asynchronously
evaluate the &lt;tt class="docutils literal"&gt;expensive_function&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;One can use the same idea for a website as shown below in the Flask app example:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multiprocessing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Pool&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;_pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;expensive_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# import packages that is used in this function&lt;/span&gt;
        &lt;span class="c1"&gt;# do your expensive time consuming process&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="nd"&gt;&amp;#64;app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/expensive_calc/&amp;lt;int:x&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;route_expcalc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apply_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expensive_function&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Result is &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s1"&gt;'__main__'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;_pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# insert production server deployment code&lt;/span&gt;
                &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;_pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;_pool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Goutham Balaraman</dc:creator><pubDate>Tue, 07 Jan 2014 00:00:00 -0800</pubDate><guid isPermaLink="false">tag:gouthamanbalaraman.com,2014-01-07:blog/python-multiprocessing-as-a-task-queue.html</guid><category>python</category><category>programming</category></item></channel></rss>