<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Algorithm Zoo]]></title>
  <link href="http://algorithmzoo.com/atom.xml" rel="self"/>
  <link href="http://algorithmzoo.com/"/>
  <updated>2013-03-06T15:45:03-05:00</updated>
  <id>http://algorithmzoo.com/</id>
  <author>
    <name><![CDATA[Milktrader]]></name>
    <email><![CDATA[algorithmzoo@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Top ten March returns in SPX in less than six lines]]></title>
    <link href="http://algorithmzoo.com/blog/2013/03/06/top-5-march-returns-in-spx-in-less-than-6-lines/"/>
    <updated>2013-03-06T15:18:00-05:00</updated>
    <id>http://algorithmzoo.com/blog/2013/03/06/top-5-march-returns-in-spx-in-less-than-6-lines</id>
    <content type="html"><![CDATA[<p>Time to look into Julia for your financial datamining adventures. The following snippet uses Julia
release-0.1, and will not work the cutting-edge Julia.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>
</span><span class='line'>julia&gt; using TradingInstrument
</span><span class='line'>
</span><span class='line'>julia&gt; spx = yahoo("^GSPC", 1,1,1900, 3,5,2013, "m");
</span><span class='line'>
</span><span class='line'>julia&gt; sp = simple_return!(spx, "Close");
</span><span class='line'>
</span><span class='line'>julia&gt; s = indexmonth(sp, 3);
</span><span class='line'>
</span><span class='line'>julia&gt; sortby!(s, [(:Close_RET, Sort.Reverse)]);
</span><span class='line'>
</span><span class='line'>julia&gt; head( s[["Date", "Close_RET"]], 10)
</span><span class='line'>10x2 DataFrame:
</span><span class='line'>               Date Close_RET
</span><span class='line'>[1,]     2000-03-01 0.0967199
</span><span class='line'>[2,]     2009-03-02 0.0854045
</span><span class='line'>[3,]     1956-03-01 0.0692545
</span><span class='line'>[4,]     2010-03-01 0.0587964
</span><span class='line'>[5,]     1979-03-01 0.0551516
</span><span class='line'>[6,]     1986-03-03 0.0527939
</span><span class='line'>[7,]     1998-03-02 0.0499457
</span><span class='line'>[8,]     1952-03-03 0.0477214
</span><span class='line'>[9,]     1967-03-01   0.03941
</span><span class='line'>[10,]    1999-03-01 0.0387942
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Thyme for Julia]]></title>
    <link href="http://algorithmzoo.com/blog/2013/01/09/thyme-for-julia/"/>
    <updated>2013-01-09T08:29:00-05:00</updated>
    <id>http://algorithmzoo.com/blog/2013/01/09/thyme-for-julia</id>
    <content type="html"><![CDATA[<p>She&#8217;s still in chef school, but this Julia will graduate sooner than many are expecting. She&#8217;s at the head of her class,
has the basics down and is well on her way to making mouth-watering packages. A nice start for trader/hackers is the <code>Thyme</code>
package. It&#8217;s not the perfect omelette, but it&#8217;s a tasty start. You can get your favorite csv data into a DataFrame and
make some basic transformations to it, such as calculating returns, moving averages, equity curves and lag/lead observations.</p>

<p>There is already similar functionality in R and Python&#8217;s <code>pandas</code>, so we&#8217;ll take a look at all three at the end in a little
competition. Let&#8217;s use a common dataset for comparison, Yahoo&#8217;s GSPC time series from 1950 to 2012. This dataset is SPX
daily data and includes 15,851 rows.</p>

<p>To demonstrate our first <code>Thyme</code> function, let&#8217;s import that data into Julia.</p>

<figure class='code'><figcaption><span>Julia console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">require</span><span class="p">(</span><span class="s">&quot;Thyme&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">using</span> <span class="n">Thyme</span>
</span><span class='line'>
</span><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">spx</span> <span class="o">=</span> <span class="n">read_stock</span><span class="p">(</span><span class="s">&quot;GSPC.csv&quot;</span><span class="p">);</span> <span class="c"># no function to import over http yet </span>
</span><span class='line'>
</span><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">require</span><span class="p">(</span><span class="s">&quot;DataFrames&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">using</span> <span class="n">DataFrames</span>
</span><span class='line'>
</span><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">head</span><span class="p">(</span><span class="n">spx</span><span class="p">)</span>
</span><span class='line'><span class="mi">6</span><span class="n">x7</span> <span class="n">DataFrame</span><span class="p">:</span>
</span><span class='line'>              <span class="n">Date</span>  <span class="n">Open</span>  <span class="n">High</span>   <span class="n">Low</span> <span class="n">Close</span>  <span class="n">Volume</span> <span class="n">Adj</span> <span class="n">Close</span>
</span><span class='line'><span class="p">[</span><span class="mi">1</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">03</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mi">1260000</span>     <span class="mf">16.66</span>
</span><span class='line'><span class="p">[</span><span class="mi">2</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">04</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mi">1890000</span>     <span class="mf">16.85</span>
</span><span class='line'><span class="p">[</span><span class="mi">3</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">05</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mi">2550000</span>     <span class="mf">16.93</span>
</span><span class='line'><span class="p">[</span><span class="mi">4</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">06</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mi">2010000</span>     <span class="mf">16.98</span>
</span><span class='line'><span class="p">[</span><span class="mi">5</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mi">09</span> <span class="mf">17.08</span> <span class="mf">17.08</span> <span class="mf">17.08</span> <span class="mf">17.08</span> <span class="mi">2520000</span>     <span class="mf">17.08</span>
</span><span class='line'><span class="p">[</span><span class="mi">6</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mi">10</span> <span class="mf">17.03</span> <span class="mf">17.03</span> <span class="mf">17.03</span> <span class="mf">17.03</span> <span class="mi">2160000</span>     <span class="mf">17.03</span>
</span></code></pre></td></tr></table></div></figure>


<p>R&#8217;s <code>quantmod</code> and Python&#8217;s <code>pandas</code> have similar methods of getting this data into the proper structure. Here&#8217;s a hint on how that&#8217;s done.</p>

<figure class='code'><figcaption><span>ipython console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">ln</span> <span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="kn">from</span> <span class="nn">pandas</span> <span class="kn">import</span> <span class="o">*</span>
</span><span class='line'><span class="n">ln</span> <span class="p">[</span><span class="mi">2</span><span class="p">]:</span> <span class="kn">from</span> <span class="nn">pandas.io.data</span> <span class="kn">import</span> <span class="n">DataReader</span>
</span><span class='line'><span class="n">ln</span> <span class="p">[</span><span class="mi">3</span><span class="p">]:</span> <span class="n">spx</span> <span class="o">=</span> <span class="n">DataReader</span><span class="p">(</span><span class="s">&quot;^GSPC&quot;</span><span class="p">,</span> <span class="s">&quot;yahoo&quot;</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">1950</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2012</span><span class="p">,</span><span class="mi">12</span><span class="p">,</span><span class="mi">31</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>R console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">R</span><span class="o">&gt;</span> <span class="n">require</span><span class="p">(</span><span class="n">quantmod</span><span class="p">)</span>
</span><span class='line'><span class="n">R</span><span class="o">&gt;</span> <span class="n">getSymbols</span><span class="p">(</span><span class="s">&quot;^GSPC&quot;</span><span class="p">,</span> <span class="n">from</span><span class="o">=</span><span class="s">&quot;1950-01-01&quot;</span><span class="p">,</span> <span class="n">to</span><span class="o">=</span><span class="s">&quot;2012-12-31&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">R</span><span class="o">&gt;</span> <span class="n">spx</span> <span class="o">=</span> <span class="n">GSPC</span>
</span></code></pre></td></tr></table></div></figure>


<p>The basic transformations you can do with <code>quantmod</code> and <code>pandas</code> can be done with <code>Thyme</code>. Lagging and leading functions
are not in Julia base, but they are in <code>Thyme</code></p>

<figure class='code'><figcaption><span>Julia console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">lag</span><span class="p">(</span><span class="n">spx</span><span class="p">[</span><span class="s">&quot;Close&quot;</span><span class="p">],</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="mi">15851</span><span class="o">-</span><span class="n">element</span> <span class="n">Float64</span> <span class="n">DataArray</span>
</span><span class='line'> <span class="n">NA</span>
</span><span class='line'> <span class="n">NA</span>
</span><span class='line'> <span class="mf">16.66</span>
</span><span class='line'> <span class="err">⋮</span>
</span><span class='line'>
</span><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">lead</span><span class="p">(</span><span class="n">spx</span><span class="p">[</span><span class="s">&quot;Close&quot;</span><span class="p">],</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="mi">15851</span><span class="o">-</span><span class="n">element</span> <span class="n">Float64</span> <span class="n">DataArray</span>
</span><span class='line'> <span class="err">⋮</span>
</span><span class='line'> <span class="mf">1426.19</span>
</span><span class='line'> <span class="n">NA</span>
</span><span class='line'> <span class="n">NA</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>lag</code> and <code>lead</code> functions also have bang versions, <code>lag!</code> and <code>lead!</code>. These modify the DataFrame by adding a column.</p>

<figure class='code'><figcaption><span>Julia console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">lag</span><span class="err">!</span><span class="p">(</span><span class="n">spx</span><span class="p">,</span> <span class="s">&quot;Close&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="mi">15851</span><span class="n">x8</span> <span class="n">DataFrame</span><span class="p">:</span>
</span><span class='line'>              <span class="n">Date</span>  <span class="n">Open</span>  <span class="n">High</span>   <span class="n">Low</span> <span class="n">Close</span>  <span class="n">Volume</span> <span class="n">Adj</span> <span class="n">Close</span> <span class="n">Close_lag_2</span>
</span><span class='line'><span class="p">[</span><span class="mi">1</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">03</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mi">1260000</span>     <span class="mf">16.66</span>          <span class="n">NA</span>
</span><span class='line'><span class="p">[</span><span class="mi">2</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">04</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mi">1890000</span>     <span class="mf">16.85</span>          <span class="n">NA</span>
</span><span class='line'><span class="p">[</span><span class="mi">3</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">05</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mi">2550000</span>     <span class="mf">16.93</span>       <span class="mf">16.66</span>
</span><span class='line'><span class="p">[</span><span class="mi">4</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">06</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mi">2010000</span>     <span class="mf">16.98</span>       <span class="mf">16.85</span>
</span><span class='line'> <span class="err">⋮</span>
</span></code></pre></td></tr></table></div></figure>


<p>Every quant wants to know about returns. There are two that you&#8217;d expect, <code>log_return</code> and <code>simple_return</code>, and a speciality
function called <code>equity</code> that generates an equity curve. <code>log_return</code> and <code>simple_return</code> are padded with 0.0 instead of <code>NA</code>
while <code>equity</code> is padded with <code>NA</code>. All three of these functions also have bang versions, which we&#8217;ll use to continue to modify our
spx dataset.</p>

<figure class='code'><figcaption><span>Julia console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">log_return</span><span class="err">!</span><span class="p">(</span><span class="n">spx</span><span class="p">,</span> <span class="s">&quot;Close&quot;</span><span class="p">)</span>
</span><span class='line'><span class="mi">15851</span><span class="n">x8</span> <span class="n">DataFrame</span><span class="p">:</span>
</span><span class='line'>              <span class="n">Date</span>  <span class="n">Open</span>  <span class="n">High</span>   <span class="n">Low</span> <span class="n">Close</span>  <span class="n">Volume</span> <span class="n">Adj</span> <span class="n">Close</span> <span class="n">Close_lag_2</span>   <span class="n">Close_ret</span>
</span><span class='line'><span class="p">[</span><span class="mi">1</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">03</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mi">1260000</span>     <span class="mf">16.66</span>          <span class="n">NA</span>         <span class="mf">0.0</span>
</span><span class='line'><span class="p">[</span><span class="mi">2</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">04</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mi">1890000</span>     <span class="mf">16.85</span>          <span class="n">NA</span>     <span class="mf">0.01134</span>
</span><span class='line'><span class="p">[</span><span class="mi">3</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">05</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mi">2550000</span>     <span class="mf">16.93</span>       <span class="mf">16.66</span>  <span class="mf">0.00473654</span>
</span><span class='line'><span class="p">[</span><span class="mi">4</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">06</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mi">2010000</span>     <span class="mf">16.98</span>       <span class="mf">16.85</span>  <span class="mf">0.00294898</span>
</span><span class='line'> <span class="err">⋮</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">julia</span><span class="o">&gt;</span>  <span class="n">equity</span><span class="err">!</span><span class="p">(</span><span class="n">spx</span><span class="p">,</span> <span class="s">&quot;Close&quot;</span><span class="p">)</span>
</span><span class='line'><span class="mi">15851</span><span class="n">x8</span> <span class="n">DataFrame</span><span class="p">:</span>
</span><span class='line'>              <span class="n">Date</span>  <span class="n">Open</span>  <span class="n">High</span>   <span class="n">Low</span> <span class="n">Close</span>  <span class="n">Volume</span> <span class="n">Adj</span> <span class="n">Close</span> <span class="n">Close_lag_2</span>   <span class="n">Close_ret</span> <span class="n">Close_equity</span>
</span><span class='line'><span class="p">[</span><span class="mi">1</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">03</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mi">1260000</span>     <span class="mf">16.66</span>          <span class="n">NA</span>         <span class="mf">0.0</span>           <span class="n">NA</span>
</span><span class='line'><span class="p">[</span><span class="mi">2</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">04</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mi">1890000</span>     <span class="mf">16.85</span>          <span class="n">NA</span>     <span class="mf">0.01134</span>       <span class="mf">1.0114</span>
</span><span class='line'><span class="p">[</span><span class="mi">3</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">05</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mi">2550000</span>     <span class="mf">16.93</span>       <span class="mf">16.66</span>  <span class="mf">0.00473654</span>      <span class="mf">1.01621</span>
</span><span class='line'><span class="p">[</span><span class="mi">4</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">06</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mi">2010000</span>     <span class="mf">16.98</span>       <span class="mf">16.85</span>  <span class="mf">0.00294898</span>      <span class="mf">1.01921</span>
</span><span class='line'> <span class="err">⋮</span>
</span></code></pre></td></tr></table></div></figure>


<p>Moving averages are another staple in the quant cookbook. Instead of creating a special function called <code>sma</code>, <code>Thyme</code>
generalizes the function in <code>moving</code> and allows the passing of any valid function. To create a simple moving average,
pass in <code>mean</code>. You can also pass in <code>max</code>, <code>min</code>, <code>var</code>, <code>kurtosis</code>, <code>skewness</code>, etc. Let&#8217;s use the bang version on our
<code>spx</code> object.</p>

<figure class='code'><figcaption><span>Julia console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="n">moving</span><span class="err">!</span><span class="p">(</span><span class="n">spx</span><span class="p">,</span> <span class="s">&quot;Adj Close&quot;</span><span class="p">,</span> <span class="n">mean</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="mi">15851</span><span class="n">x8</span> <span class="n">DataFrame</span><span class="p">:</span>
</span><span class='line'>             <span class="n">Date</span>  <span class="n">Open</span>  <span class="n">High</span>   <span class="n">Low</span> <span class="n">Close</span>  <span class="n">Volume</span> <span class="n">Adj</span> <span class="n">Close</span> <span class="n">Close_lag_2</span>   <span class="n">Close_ret</span> <span class="n">Close_equity</span> <span class="n">mean_2</span>
</span><span class='line'><span class="p">[</span><span class="mi">1</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">03</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mf">16.66</span> <span class="mi">1260000</span>     <span class="mf">16.66</span>          <span class="n">NA</span>         <span class="mf">0.0</span>           <span class="n">NA</span>     <span class="n">NA</span>
</span><span class='line'><span class="p">[</span><span class="mi">2</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">04</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mf">16.85</span> <span class="mi">1890000</span>     <span class="mf">16.85</span>          <span class="n">NA</span>     <span class="mf">0.01134</span>       <span class="mf">1.0114</span> <span class="mf">16.755</span>
</span><span class='line'><span class="p">[</span><span class="mi">3</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">05</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mf">16.93</span> <span class="mi">2550000</span>     <span class="mf">16.93</span>       <span class="mf">16.66</span>  <span class="mf">0.00473654</span>      <span class="mf">1.01621</span>  <span class="mf">16.89</span>
</span><span class='line'><span class="p">[</span><span class="mi">4</span><span class="p">,]</span>    <span class="mi">1950</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">06</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mf">16.98</span> <span class="mi">2010000</span>     <span class="mf">16.98</span>       <span class="mf">16.85</span>  <span class="mf">0.00294898</span>      <span class="mf">1.01921</span> <span class="mf">16.955</span>
</span><span class='line'> <span class="err">⋮</span>
</span></code></pre></td></tr></table></div></figure>


<p>Time for some speed trials. Let&#8217;s take the original dataset for the challenge. <code>Thyme</code> will use the <code>moving</code> function and pass
in the base Julian <code>skewness</code>. For R we&#8217;ll use <code>zoo::rollapply</code> and pass in the <code>PerformanceAnalytics::skewness</code> function. <code>pandas</code>
has a dedicated function for this called <code>rolling_skew</code>. Let the Iron Programming Languages begin!</p>

<figure class='code'><figcaption><span>Julia console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">julia</span><span class="o">&gt;</span> <span class="nd">@elapsed</span> <span class="n">moving</span><span class="err">!</span><span class="p">(</span><span class="n">spx</span><span class="p">,</span> <span class="s">&quot;Close&quot;</span><span class="p">,</span> <span class="n">skewness</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="mf">0.5475790500640869</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>R console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">R</span><span class="o">&gt;</span> <span class="n">system</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="n">rollapply</span><span class="p">(</span><span class="n">Cl</span><span class="p">(</span><span class="n">GSPC</span><span class="p">),</span> <span class="n">FUN</span><span class="o">=</span><span class="n">kurtosis</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">100</span><span class="p">))</span>
</span><span class='line'>   <span class="n">user</span>  <span class="n">system</span> <span class="n">elapsed</span>
</span><span class='line'> <span class="mf">21.879</span>   <span class="mf">0.150</span>  <span class="mf">22.306</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>ipython console  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">In</span> <span class="p">[</span><span class="mi">5</span><span class="p">]:</span> <span class="o">%</span><span class="n">timeit</span> <span class="n">rolling_skew</span><span class="p">(</span><span class="n">spx</span><span class="p">[</span><span class="s">&quot;Close&quot;</span><span class="p">],</span> <span class="mi">100</span><span class="p">)</span>
</span><span class='line'><span class="mi">1000</span> <span class="n">loops</span><span class="p">,</span> <span class="n">best</span> <span class="n">of</span> <span class="mi">3</span><span class="p">:</span> <span class="mf">1.31</span> <span class="n">ms</span> <span class="n">per</span> <span class="n">loop</span>
</span></code></pre></td></tr></table></div></figure>


<p>R is a bit slow. Mainly because <code>rollapply</code> uses an R loop so this really isn&#8217;t fair.
Python is so fast that you need to use <code>timeit</code>. I&#8217;m sure it&#8217;s a Cython loop and not a Python loop.
Julia&#8217;s <code>Thyme</code> package did okay. Not even close to <code>pandas</code> but over 40 times faster than the
R method.</p>

<p>The nice thing about <code>moving!</code> is that, apart from some housekeeping code, it&#8217;s a fairly simple function. It&#8217;s a
loop defined in a nice single line of code. The entire code below shows <code>moving!</code> calling <code>mvg</code>. This was done for
DRY reasons since the <code>mvg</code> code is also in <code>moving</code>. But aside from some (admittedly) bizarre and expensive <code>NA</code>
padding, it&#8217;s fairly straight-forward.</p>

<figure class='code'><figcaption><span>moving! function  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">function</span> <span class="n">mvg</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">f</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
</span><span class='line'>  <span class="n">foo</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)])</span> <span class="k">for</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">:</span><span class="n">length</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">-</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span>
</span><span class='line'>  <span class="n">bar</span> <span class="o">=</span> <span class="p">[</span><span class="n">nas</span><span class="p">(</span><span class="n">DataVector</span><span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">n</span><span class="p">)],</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">;</span> <span class="nb">float</span><span class="p">(</span><span class="n">foo</span><span class="p">)]</span>
</span><span class='line'><span class="n">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">function</span> <span class="n">moving</span><span class="err">!</span><span class="p">(</span><span class="n">df</span><span class="p">::</span><span class="n">DataFrame</span><span class="p">,</span> <span class="n">col</span><span class="p">::</span><span class="n">ASCIIString</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">n</span><span class="p">::</span><span class="n">Int64</span><span class="p">)</span>
</span><span class='line'>  <span class="n">new_col</span> <span class="o">=</span> <span class="n">strcat</span><span class="p">(</span><span class="n">string</span><span class="p">(</span><span class="n">f</span><span class="p">),</span> <span class="s">&quot;_&quot;</span><span class="p">,</span> <span class="n">string</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
</span><span class='line'>  <span class="n">within</span><span class="err">!</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">quote</span>
</span><span class='line'>         <span class="err">$</span><span class="n">new_col</span> <span class="o">=</span> <span class="err">$</span><span class="n">mvg</span><span class="p">(</span><span class="err">$</span><span class="n">df</span><span class="p">[</span><span class="err">$</span><span class="n">col</span><span class="p">],</span> <span class="err">$</span><span class="n">f</span><span class="p">,</span> <span class="err">$</span><span class="n">n</span><span class="p">)</span>
</span><span class='line'>         <span class="n">end</span><span class="p">);</span>
</span><span class='line'><span class="n">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Julia is the new kid in the kitchen. Time to start paying attention. She may cook your bacon when you&#8217;re not looking.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[803c7418df]]></title>
    <link href="http://algorithmzoo.com/blog/2012/11/27/803c7418df/"/>
    <updated>2012-11-27T09:41:00-05:00</updated>
    <id>http://algorithmzoo.com/blog/2012/11/27/803c7418df</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/803c7418df.png"></p>

<p>RUT monthly returns for December.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[d3b1bc40bf]]></title>
    <link href="http://algorithmzoo.com/blog/2012/11/27/d3b1bc40bf/"/>
    <updated>2012-11-27T09:29:00-05:00</updated>
    <id>http://algorithmzoo.com/blog/2012/11/27/d3b1bc40bf</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/d3b1bc40bf.png"></p>

<p>NDX monthly returns for December.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[f68325c3b7]]></title>
    <link href="http://algorithmzoo.com/blog/2012/11/26/f68325c3b7/"/>
    <updated>2012-11-26T10:27:00-05:00</updated>
    <id>http://algorithmzoo.com/blog/2012/11/26/f68325c3b7</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/f68325c3b7.png"></p>

<p>SPX monthly returns for December.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[74fbb7dd41]]></title>
    <link href="http://algorithmzoo.com/blog/2012/09/12/74fbb7dd41/"/>
    <updated>2012-09-12T11:07:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/09/12/74fbb7dd41</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/74fbb7dd41.png"></p>

<p>SPX monthly returns for September</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[44144fb41b]]></title>
    <link href="http://algorithmzoo.com/blog/2012/09/07/44144fb41b/"/>
    <updated>2012-09-07T06:12:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/09/07/44144fb41b</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/44144fb41b.png"></p>

<p>SPX returns the day after a 2% rally in September.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[6411b4467f]]></title>
    <link href="http://algorithmzoo.com/blog/2012/09/03/6411b4467f/"/>
    <updated>2012-09-03T09:20:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/09/03/6411b4467f</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/6411b4467f.png"></p>

<p>SPX returns for the first day in September.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[4216dd32a0]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/31/4216dd32a0/"/>
    <updated>2012-08-31T09:15:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/31/4216dd32a0</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/4216dd32a0.png"></p>

<p>SPX returns for the last day in August.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[d5bc902694]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/31/d5bc902694/"/>
    <updated>2012-08-31T08:44:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/31/d5bc902694</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/d5bc902694.png"></p>

<p>NDX returns for the last day in August.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[45b21ab951]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/29/45b21ab951/"/>
    <updated>2012-08-29T12:17:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/29/45b21ab951</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/45b21ab951.png"></p>

<p>SPX September returns during a presidential election year.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[beaf8443f3]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/24/beaf8443f3/"/>
    <updated>2012-08-24T17:02:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/24/beaf8443f3</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/beaf8443f3.png"></p>

<p>NDX monthly returns in August.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[64deb0239b]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/24/64deb0239b/"/>
    <updated>2012-08-24T10:11:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/24/64deb0239b</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/intraday/64deb0239b.png"></p>

<p>NDX components&#8217; last price relative to their 50-day moving average (as a percentage).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[54c0531b48]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/23/54c0531b48/"/>
    <updated>2012-08-23T11:24:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/23/54c0531b48</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/54c0531b48.png"></p>

<p>SPX frequency of 1% selloffs in August by year.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[fce8d7bb23]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/23/fce8d7bb23/"/>
    <updated>2012-08-23T09:56:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/23/fce8d7bb23</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/intraday/fce8d7bb23.png"></p>

<p>NDX intraday returns for the components.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[6339aa324b]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/22/6339aa324b/"/>
    <updated>2012-08-22T17:10:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/22/6339aa324b</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/intraday/6339aa324b.png"></p>

<p>NDX components and their daily return (percent gain/loss) at the end of the trading day.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[bde6894ad6]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/20/bde6894ad6/"/>
    <updated>2012-08-20T16:46:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/20/bde6894ad6</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/bde6894ad6.png"></p>

<p>RUT 12-day returns after a 12-day return in excess of 6.5% registers in August.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[1d070f11b5]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/20/1d070f11b5/"/>
    <updated>2012-08-20T16:34:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/20/1d070f11b5</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/1d070f11b5.png"></p>

<p>SPX 12-day cumulative returns after a 12-day rally of 3.5% registers in August.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[e63eac213e]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/20/e63eac213e/"/>
    <updated>2012-08-20T16:22:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/20/e63eac213e</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/e63eac213e.png"></p>

<p>NDX cumulative 12-day return after a 12-day rally in excess of 6% registers in August.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[5683591922]]></title>
    <link href="http://algorithmzoo.com/blog/2012/08/18/5683591922/"/>
    <updated>2012-08-18T20:27:00-04:00</updated>
    <id>http://algorithmzoo.com/blog/2012/08/18/5683591922</id>
    <content type="html"><![CDATA[<p><img src="http://algorithmzoo.com/images/PRE/5683591922yellow.png"></p>

<p>How far Nasdaq 100 components are above/below their 50-day moving average.</p>
]]></content>
  </entry>
  
</feed>
