mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-10 21:08:14 +08:00
MAINT: removing many warnings from building docs
This commit is contained in:
+197
-194
@@ -32,6 +32,9 @@
|
||||
|
||||
|
||||
|
||||
<link rel="index" title="Index"
|
||||
href="genindex.html"/>
|
||||
<link rel="search" title="Search" href="search.html"/>
|
||||
<link rel="top" title="Catalyst 0.4 documentation" href="index.html"/>
|
||||
<link rel="next" title="Live Trading" href="live-trading.html"/>
|
||||
<link rel="prev" title="Install" href="install.html"/>
|
||||
@@ -85,7 +88,7 @@
|
||||
|
||||
<ul class="current">
|
||||
<li class="toctree-l1"><a class="reference internal" href="install.html">Install</a></li>
|
||||
<li class="toctree-l1 current"><a class="current reference internal" href="">Catalyst Beginner Tutorial</a><ul>
|
||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Catalyst Beginner Tutorial</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#basics">Basics</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#my-first-algorithm">My first algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#ingesting-data">Ingesting data</a></li>
|
||||
@@ -163,7 +166,7 @@
|
||||
<li class="wy-breadcrumbs-aside">
|
||||
|
||||
|
||||
<a href="_sources/beginner-tutorial.txt" rel="nofollow"> View page source</a>
|
||||
<a href="_sources/beginner-tutorial.rst.txt" rel="nofollow"> View page source</a>
|
||||
|
||||
|
||||
</li>
|
||||
@@ -199,7 +202,7 @@ marketplace, Catalyst empowers users to share and curate data and
|
||||
build profitable, data-driven investment strategies.</li>
|
||||
</ul>
|
||||
<p>This tutorial assumes that you have Catalyst correctly installed, see the
|
||||
<a class="reference internal" href="install.html"><em>Install</em></a> section if you haven’t set up Catalyst yet.</p>
|
||||
<a class="reference internal" href="install.html"><span class="doc">Install</span></a> section if you haven’t set up Catalyst yet.</p>
|
||||
<p>Every <code class="docutils literal"><span class="pre">catalyst</span></code> algorithm consists of at least two functions you have to
|
||||
define:</p>
|
||||
<ul class="simple">
|
||||
@@ -211,7 +214,7 @@ define:</p>
|
||||
<code class="docutils literal"><span class="pre">context</span></code> is a persistent namespace for you to store variables you
|
||||
need to access from one algorithm iteration to the next.</p>
|
||||
<p>After the algorithm has been initialized, <code class="docutils literal"><span class="pre">catalyst</span></code> calls the
|
||||
<code class="docutils literal"><span class="pre">handle_data()</span></code> function on each iteration, that’s one per day (daily) or
|
||||
<code class="docutils literal"><span class="pre">handle_data()</span></code> function on each iteration, that’s one per day (daily) or
|
||||
once every minute (minute), depending on the frequency we choose to run our
|
||||
simulation. On every iteration, <code class="docutils literal"><span class="pre">handle_data()</span></code> passes the same <code class="docutils literal"><span class="pre">context</span></code>
|
||||
variable and an event-frame called <code class="docutils literal"><span class="pre">data</span></code> containing the current trading bar
|
||||
@@ -261,7 +264,7 @@ Marketplace), and stores it locally to make it available at runtime.</p>
|
||||
</div>
|
||||
<p>This instructs Catalyst to download pricing data from the <code class="docutils literal"><span class="pre">Bitfinex</span></code> exchange
|
||||
for the <code class="docutils literal"><span class="pre">btc_usd</span></code> currency pair (this follows from the simple algorithm
|
||||
presented above where we want to trade <code class="docutils literal"><span class="pre">btc_usd</span></code>), and we’re choosing to test
|
||||
presented above where we want to trade <code class="docutils literal"><span class="pre">btc_usd</span></code>), and we’re choosing to test
|
||||
our algorithm using historical pricing data from the Bitfinex exchange. By
|
||||
default, Catalyst assumes that you want data with <code class="docutils literal"><span class="pre">daily</span></code> frequency (one candle
|
||||
bar per day). If you want instead <code class="docutils literal"><span class="pre">minute</span></code> frequency (one candle bar for every
|
||||
@@ -269,15 +272,15 @@ minute), you would need to specify it as follows:</p>
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span>catalyst ingest-exchange -x bitfinex -i btc_usd -f minute
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>Ingesting exchange bundle bitfinex...
|
||||
[====================================] Ingesting daily price data on bitfinex: 100%
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">Ingesting</span> <span class="n">exchange</span> <span class="n">bundle</span> <span class="n">bitfinex</span><span class="o">...</span>
|
||||
<span class="p">[</span><span class="o">====================================</span><span class="p">]</span> <span class="n">Ingesting</span> <span class="n">daily</span> <span class="n">price</span> <span class="n">data</span> <span class="n">on</span> <span class="n">bitfinex</span><span class="p">:</span> <span class="mi">100</span><span class="o">%</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>We believe it is important for you to have a high-level understanding of how
|
||||
data is managed, hence the following overview:</p>
|
||||
<ul class="simple">
|
||||
<li>Pricing data is split and packaged into <code class="docutils literal"><span class="pre">bundles</span></code>: chunks of data organized
|
||||
as time series that are kept up to date daily on Enigma’s servers. Catalyst
|
||||
as time series that are kept up to date daily on Enigma’s servers. Catalyst
|
||||
downloads the requested bundles and reconstructs the full dataset in your
|
||||
hard drive.</li>
|
||||
<li>Pricing data is provided in <code class="docutils literal"><span class="pre">daily</span></code> and <code class="docutils literal"><span class="pre">minute</span></code> resolution. Those are
|
||||
@@ -302,7 +305,7 @@ following from the command line:</p>
|
||||
</div>
|
||||
<div class="section" id="running-the-algorithm">
|
||||
<h2>Running the algorithm<a class="headerlink" href="#running-the-algorithm" title="Permalink to this headline">¶</a></h2>
|
||||
<p>You can now test your algorithm using cryptoassets’ historical pricing data,
|
||||
<p>You can now test your algorithm using cryptoassets’ historical pricing data,
|
||||
<code class="docutils literal"><span class="pre">catalyst</span></code> provides three interfaces:</p>
|
||||
<ul class="simple">
|
||||
<li>A command-line interface (CLI),</li>
|
||||
@@ -310,11 +313,11 @@ following from the command line:</p>
|
||||
Python scripts,</li>
|
||||
<li>and the <code class="docutils literal"><span class="pre">Jupyter</span> <span class="pre">Notebook</span></code> magic.</li>
|
||||
</ul>
|
||||
<p>We’ll start with the CLI, and introduce the <code class="docutils literal"><span class="pre">run_algorithm()</span></code> in the last
|
||||
example of this tutorial. Some of the <a class="reference internal" href="example-algos.html"><em>example algorithms</em></a>
|
||||
<p>We’ll start with the CLI, and introduce the <code class="docutils literal"><span class="pre">run_algorithm()</span></code> in the last
|
||||
example of this tutorial. Some of the <a class="reference internal" href="example-algos.html"><span class="doc">example algorithms</span></a>
|
||||
provide instructions on how to run them both from the CLI, and using the
|
||||
<a class="reference internal" href="appendix.html#catalyst.run_algorithm" title="catalyst.run_algorithm"><code class="xref py py-func docutils literal"><span class="pre">run_algorithm()</span></code></a> function. For the third method, refer to the
|
||||
corresponding section on <code class="xref doc docutils literal"><span class="pre">Catalyst</span> <span class="pre">&</span> <span class="pre">Jupyter</span> <span class="pre">Notebook</span></code> after you
|
||||
corresponding section on <a class="reference internal" href="#jupyter"><span class="std std-ref">Catalyst & Jupyter Notebook</span></a> after you
|
||||
have assimilated the contents of this tutorial.</p>
|
||||
<div class="section" id="command-line-interface">
|
||||
<h3>Command line interface<a class="headerlink" href="#command-line-interface" title="Permalink to this headline">¶</a></h3>
|
||||
@@ -325,18 +328,18 @@ or the Terminal application on MacOS).</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This is the resulting output, simplified for eductional purposes:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>Usage: catalyst [OPTIONS] COMMAND [ARGS]...
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">Usage</span><span class="p">:</span> <span class="n">catalyst</span> <span class="p">[</span><span class="n">OPTIONS</span><span class="p">]</span> <span class="n">COMMAND</span> <span class="p">[</span><span class="n">ARGS</span><span class="p">]</span><span class="o">...</span>
|
||||
|
||||
Top level catalyst entry point.
|
||||
<span class="n">Top</span> <span class="n">level</span> <span class="n">catalyst</span> <span class="n">entry</span> <span class="n">point</span><span class="o">.</span>
|
||||
|
||||
Options:
|
||||
--version Show the version and exit.
|
||||
--help Show this message and exit.
|
||||
<span class="n">Options</span><span class="p">:</span>
|
||||
<span class="o">--</span><span class="n">version</span> <span class="n">Show</span> <span class="n">the</span> <span class="n">version</span> <span class="ow">and</span> <span class="nb">exit</span><span class="o">.</span>
|
||||
<span class="o">--</span><span class="n">help</span> <span class="n">Show</span> <span class="n">this</span> <span class="n">message</span> <span class="ow">and</span> <span class="nb">exit</span><span class="o">.</span>
|
||||
|
||||
Commands:
|
||||
ingest-exchange Ingest data for the given exchange.
|
||||
live Trade live with the given algorithm.
|
||||
run Run a backtest for the given algorithm.
|
||||
<span class="n">Commands</span><span class="p">:</span>
|
||||
<span class="n">ingest</span><span class="o">-</span><span class="n">exchange</span> <span class="n">Ingest</span> <span class="n">data</span> <span class="k">for</span> <span class="n">the</span> <span class="n">given</span> <span class="n">exchange</span><span class="o">.</span>
|
||||
<span class="n">live</span> <span class="n">Trade</span> <span class="n">live</span> <span class="k">with</span> <span class="n">the</span> <span class="n">given</span> <span class="n">algorithm</span><span class="o">.</span>
|
||||
<span class="n">run</span> <span class="n">Run</span> <span class="n">a</span> <span class="n">backtest</span> <span class="k">for</span> <span class="n">the</span> <span class="n">given</span> <span class="n">algorithm</span><span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>There are three main modes you can run on Catalyst. The first being
|
||||
@@ -344,46 +347,46 @@ Commands:
|
||||
section. The second is <code class="docutils literal"><span class="pre">live</span></code> to use your algorithm to trade live against a
|
||||
given exchange, and the third mode <code class="docutils literal"><span class="pre">run</span></code> is to backtest your algorithm before
|
||||
trading live with it.</p>
|
||||
<p>Let’s start with backtesting, so run this other command to learn more about
|
||||
<p>Let’s start with backtesting, so run this other command to learn more about
|
||||
the available options:</p>
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ catalyst run --help
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>Usage: catalyst run [OPTIONS]
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">Usage</span><span class="p">:</span> <span class="n">catalyst</span> <span class="n">run</span> <span class="p">[</span><span class="n">OPTIONS</span><span class="p">]</span>
|
||||
|
||||
Run a backtest for the given algorithm.
|
||||
<span class="n">Run</span> <span class="n">a</span> <span class="n">backtest</span> <span class="k">for</span> <span class="n">the</span> <span class="n">given</span> <span class="n">algorithm</span><span class="o">.</span>
|
||||
|
||||
Options:
|
||||
-f, --algofile FILENAME The file that contains the algorithm to run.
|
||||
-t, --algotext TEXT The algorithm script to run.
|
||||
-D, --define TEXT Define a name to be bound in the namespace
|
||||
before executing the algotext. For example
|
||||
'-Dname=value'. The value may be any python
|
||||
expression. These are evaluated in order so
|
||||
they may refer to previously defined names.
|
||||
--data-frequency [daily|minute]
|
||||
The data frequency of the simulation.
|
||||
[default: daily]
|
||||
--capital-base FLOAT The starting capital for the simulation.
|
||||
[default: 10000000.0]
|
||||
-b, --bundle BUNDLE-NAME The data bundle to use for the simulation.
|
||||
[default: poloniex]
|
||||
--bundle-timestamp TIMESTAMP The date to lookup data on or before.
|
||||
[default: <current-time>]
|
||||
-s, --start DATE The start date of the simulation.
|
||||
-e, --end DATE The end date of the simulation.
|
||||
-o, --output FILENAME The location to write the perf data. If this
|
||||
is '-' the perf will be written to stdout.
|
||||
[default: -]
|
||||
--print-algo / --no-print-algo Print the algorithm to stdout.
|
||||
-x, --exchange-name [poloniex|bitfinex|bittrex]
|
||||
The name of the targeted exchange
|
||||
(supported: bitfinex, bittrex, poloniex).
|
||||
-n, --algo-namespace TEXT A label assigned to the algorithm for data
|
||||
storage purposes.
|
||||
-c, --base-currency TEXT The base currency used to calculate
|
||||
statistics (e.g. usd, btc, eth).
|
||||
--help Show this message and exit.
|
||||
<span class="n">Options</span><span class="p">:</span>
|
||||
<span class="o">-</span><span class="n">f</span><span class="p">,</span> <span class="o">--</span><span class="n">algofile</span> <span class="n">FILENAME</span> <span class="n">The</span> <span class="nb">file</span> <span class="n">that</span> <span class="n">contains</span> <span class="n">the</span> <span class="n">algorithm</span> <span class="n">to</span> <span class="n">run</span><span class="o">.</span>
|
||||
<span class="o">-</span><span class="n">t</span><span class="p">,</span> <span class="o">--</span><span class="n">algotext</span> <span class="n">TEXT</span> <span class="n">The</span> <span class="n">algorithm</span> <span class="n">script</span> <span class="n">to</span> <span class="n">run</span><span class="o">.</span>
|
||||
<span class="o">-</span><span class="n">D</span><span class="p">,</span> <span class="o">--</span><span class="n">define</span> <span class="n">TEXT</span> <span class="n">Define</span> <span class="n">a</span> <span class="n">name</span> <span class="n">to</span> <span class="n">be</span> <span class="n">bound</span> <span class="ow">in</span> <span class="n">the</span> <span class="n">namespace</span>
|
||||
<span class="n">before</span> <span class="n">executing</span> <span class="n">the</span> <span class="n">algotext</span><span class="o">.</span> <span class="n">For</span> <span class="n">example</span>
|
||||
<span class="s1">'-Dname=value'</span><span class="o">.</span> <span class="n">The</span> <span class="n">value</span> <span class="n">may</span> <span class="n">be</span> <span class="nb">any</span> <span class="n">python</span>
|
||||
<span class="n">expression</span><span class="o">.</span> <span class="n">These</span> <span class="n">are</span> <span class="n">evaluated</span> <span class="ow">in</span> <span class="n">order</span> <span class="n">so</span>
|
||||
<span class="n">they</span> <span class="n">may</span> <span class="n">refer</span> <span class="n">to</span> <span class="n">previously</span> <span class="n">defined</span> <span class="n">names</span><span class="o">.</span>
|
||||
<span class="o">--</span><span class="n">data</span><span class="o">-</span><span class="n">frequency</span> <span class="p">[</span><span class="n">daily</span><span class="o">|</span><span class="n">minute</span><span class="p">]</span>
|
||||
<span class="n">The</span> <span class="n">data</span> <span class="n">frequency</span> <span class="n">of</span> <span class="n">the</span> <span class="n">simulation</span><span class="o">.</span>
|
||||
<span class="p">[</span><span class="n">default</span><span class="p">:</span> <span class="n">daily</span><span class="p">]</span>
|
||||
<span class="o">--</span><span class="n">capital</span><span class="o">-</span><span class="n">base</span> <span class="n">FLOAT</span> <span class="n">The</span> <span class="n">starting</span> <span class="n">capital</span> <span class="k">for</span> <span class="n">the</span> <span class="n">simulation</span><span class="o">.</span>
|
||||
<span class="p">[</span><span class="n">default</span><span class="p">:</span> <span class="mf">10000000.0</span><span class="p">]</span>
|
||||
<span class="o">-</span><span class="n">b</span><span class="p">,</span> <span class="o">--</span><span class="n">bundle</span> <span class="n">BUNDLE</span><span class="o">-</span><span class="n">NAME</span> <span class="n">The</span> <span class="n">data</span> <span class="n">bundle</span> <span class="n">to</span> <span class="n">use</span> <span class="k">for</span> <span class="n">the</span> <span class="n">simulation</span><span class="o">.</span>
|
||||
<span class="p">[</span><span class="n">default</span><span class="p">:</span> <span class="n">poloniex</span><span class="p">]</span>
|
||||
<span class="o">--</span><span class="n">bundle</span><span class="o">-</span><span class="n">timestamp</span> <span class="n">TIMESTAMP</span> <span class="n">The</span> <span class="n">date</span> <span class="n">to</span> <span class="n">lookup</span> <span class="n">data</span> <span class="n">on</span> <span class="ow">or</span> <span class="n">before</span><span class="o">.</span>
|
||||
<span class="p">[</span><span class="n">default</span><span class="p">:</span> <span class="o"><</span><span class="n">current</span><span class="o">-</span><span class="n">time</span><span class="o">></span><span class="p">]</span>
|
||||
<span class="o">-</span><span class="n">s</span><span class="p">,</span> <span class="o">--</span><span class="n">start</span> <span class="n">DATE</span> <span class="n">The</span> <span class="n">start</span> <span class="n">date</span> <span class="n">of</span> <span class="n">the</span> <span class="n">simulation</span><span class="o">.</span>
|
||||
<span class="o">-</span><span class="n">e</span><span class="p">,</span> <span class="o">--</span><span class="n">end</span> <span class="n">DATE</span> <span class="n">The</span> <span class="n">end</span> <span class="n">date</span> <span class="n">of</span> <span class="n">the</span> <span class="n">simulation</span><span class="o">.</span>
|
||||
<span class="o">-</span><span class="n">o</span><span class="p">,</span> <span class="o">--</span><span class="n">output</span> <span class="n">FILENAME</span> <span class="n">The</span> <span class="n">location</span> <span class="n">to</span> <span class="n">write</span> <span class="n">the</span> <span class="n">perf</span> <span class="n">data</span><span class="o">.</span> <span class="n">If</span> <span class="n">this</span>
|
||||
<span class="ow">is</span> <span class="s1">'-'</span> <span class="n">the</span> <span class="n">perf</span> <span class="n">will</span> <span class="n">be</span> <span class="n">written</span> <span class="n">to</span> <span class="n">stdout</span><span class="o">.</span>
|
||||
<span class="p">[</span><span class="n">default</span><span class="p">:</span> <span class="o">-</span><span class="p">]</span>
|
||||
<span class="o">--</span><span class="k">print</span><span class="o">-</span><span class="n">algo</span> <span class="o">/</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="k">print</span><span class="o">-</span><span class="n">algo</span> <span class="n">Print</span> <span class="n">the</span> <span class="n">algorithm</span> <span class="n">to</span> <span class="n">stdout</span><span class="o">.</span>
|
||||
<span class="o">-</span><span class="n">x</span><span class="p">,</span> <span class="o">--</span><span class="n">exchange</span><span class="o">-</span><span class="n">name</span> <span class="p">[</span><span class="n">poloniex</span><span class="o">|</span><span class="n">bitfinex</span><span class="o">|</span><span class="n">bittrex</span><span class="p">]</span>
|
||||
<span class="n">The</span> <span class="n">name</span> <span class="n">of</span> <span class="n">the</span> <span class="n">targeted</span> <span class="n">exchange</span>
|
||||
<span class="p">(</span><span class="n">supported</span><span class="p">:</span> <span class="n">bitfinex</span><span class="p">,</span> <span class="n">bittrex</span><span class="p">,</span> <span class="n">poloniex</span><span class="p">)</span><span class="o">.</span>
|
||||
<span class="o">-</span><span class="n">n</span><span class="p">,</span> <span class="o">--</span><span class="n">algo</span><span class="o">-</span><span class="n">namespace</span> <span class="n">TEXT</span> <span class="n">A</span> <span class="n">label</span> <span class="n">assigned</span> <span class="n">to</span> <span class="n">the</span> <span class="n">algorithm</span> <span class="k">for</span> <span class="n">data</span>
|
||||
<span class="n">storage</span> <span class="n">purposes</span><span class="o">.</span>
|
||||
<span class="o">-</span><span class="n">c</span><span class="p">,</span> <span class="o">--</span><span class="n">base</span><span class="o">-</span><span class="n">currency</span> <span class="n">TEXT</span> <span class="n">The</span> <span class="n">base</span> <span class="n">currency</span> <span class="n">used</span> <span class="n">to</span> <span class="n">calculate</span>
|
||||
<span class="n">statistics</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">g</span><span class="o">.</span> <span class="n">usd</span><span class="p">,</span> <span class="n">btc</span><span class="p">,</span> <span class="n">eth</span><span class="p">)</span><span class="o">.</span>
|
||||
<span class="o">--</span><span class="n">help</span> <span class="n">Show</span> <span class="n">this</span> <span class="n">message</span> <span class="ow">and</span> <span class="nb">exit</span><span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>As you can see there are a couple of flags that specify where to find your
|
||||
@@ -396,18 +399,18 @@ performance metrics of your algorithm so that you can analyze how it performed.
|
||||
This is done via the <code class="docutils literal"><span class="pre">--output</span></code> flag and will cause it to write the
|
||||
performance <code class="docutils literal"><span class="pre">DataFrame</span></code> in the pickle Python file format. Note that you can
|
||||
also define a configuration file with these parameters that you can then
|
||||
conveniently pass to the <code class="docutils literal"><span class="pre">-c</span></code> option so that you don’t have to supply the
|
||||
conveniently pass to the <code class="docutils literal"><span class="pre">-c</span></code> option so that you don’t have to supply the
|
||||
command line args all the time.</p>
|
||||
<p>Thus, to execute our algorithm from above and save the results to
|
||||
<code class="docutils literal"><span class="pre">buy_btc_simple_out.pickle</span></code> we would call <code class="docutils literal"><span class="pre">catalyst</span> <span class="pre">run</span></code> as follows:</p>
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span>catalyst run -f buy_btc_simple.py -x bitfinex --start <span class="m">2016</span>-1-1 --end <span class="m">2017</span>-9-30 -c usd --capital-base <span class="m">100000</span> -o buy_btc_simple_out.pickle
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>INFO: run_algo: running algo in backtest mode
|
||||
INFO: exchange_algorithm: initialized trading algorithm in backtest mode
|
||||
INFO: Performance: Simulated 639 trading days out of 639.
|
||||
INFO: Performance: first open: 2016-01-01 00:00:00+00:00
|
||||
INFO: Performance: last close: 2017-09-30 23:59:00+00:00
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">INFO</span><span class="p">:</span> <span class="n">run_algo</span><span class="p">:</span> <span class="n">running</span> <span class="n">algo</span> <span class="ow">in</span> <span class="n">backtest</span> <span class="n">mode</span>
|
||||
<span class="n">INFO</span><span class="p">:</span> <span class="n">exchange_algorithm</span><span class="p">:</span> <span class="n">initialized</span> <span class="n">trading</span> <span class="n">algorithm</span> <span class="ow">in</span> <span class="n">backtest</span> <span class="n">mode</span>
|
||||
<span class="n">INFO</span><span class="p">:</span> <span class="n">Performance</span><span class="p">:</span> <span class="n">Simulated</span> <span class="mi">639</span> <span class="n">trading</span> <span class="n">days</span> <span class="n">out</span> <span class="n">of</span> <span class="mf">639.</span>
|
||||
<span class="n">INFO</span><span class="p">:</span> <span class="n">Performance</span><span class="p">:</span> <span class="n">first</span> <span class="nb">open</span><span class="p">:</span> <span class="mi">2016</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">01</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span>
|
||||
<span class="n">INFO</span><span class="p">:</span> <span class="n">Performance</span><span class="p">:</span> <span class="n">last</span> <span class="n">close</span><span class="p">:</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">09</span><span class="o">-</span><span class="mi">30</span> <span class="mi">23</span><span class="p">:</span><span class="mi">59</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><code class="docutils literal"><span class="pre">run</span></code> first calls the <code class="docutils literal"><span class="pre">initialize()</span></code> function, and then
|
||||
@@ -422,11 +425,11 @@ applying the slippage model which models the influence of your order on
|
||||
the stock price, so your algorithm will be charged more than just the
|
||||
asset price. (Note, that you can also change the commission and
|
||||
slippage model that <code class="docutils literal"><span class="pre">catalyst</span></code> uses).</p>
|
||||
<p>Let’s take a quick look at the performance <code class="docutils literal"><span class="pre">DataFrame</span></code>. For this, we write
|
||||
different Python script–let’s call it <code class="docutils literal"><span class="pre">print_results.py</span></code>–and we make use of
|
||||
<p>Let’s take a quick look at the performance <code class="docutils literal"><span class="pre">DataFrame</span></code>. For this, we write
|
||||
different Python script–let’s call it <code class="docutils literal"><span class="pre">print_results.py</span></code>–and we make use of
|
||||
the fantastic <code class="docutils literal"><span class="pre">pandas</span></code> library to print the first ten rows. Note that
|
||||
<code class="docutils literal"><span class="pre">catalyst</span></code> makes heavy usage of <a class="reference external" href="http://pandas.pydata.org/">pandas</a>,
|
||||
especially for data analysis and outputting so it’s worth spending some time to
|
||||
especially for data analysis and outputting so it’s worth spending some time to
|
||||
learn it.</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span>
|
||||
<span class="n">perf</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_pickle</span><span class="p">(</span><span class="s1">'buy_btc_simple_out.pickle'</span><span class="p">)</span> <span class="c1"># read in perf DataFrame</span>
|
||||
@@ -605,7 +608,7 @@ as how <code class="docutils literal"><span class="pre">initialize()</span></cod
|
||||
variables: <code class="docutils literal"><span class="pre">context</span></code>, which we discussed at the very beginning, and <code class="docutils literal"><span class="pre">perf</span></code>,
|
||||
which is the pandas dataframe containing the performance data for our algorithm
|
||||
that we reviewed above. Inside the <code class="docutils literal"><span class="pre">analyze()</span></code> function is where we can
|
||||
analyze and visualize the results of our strategy. Here’s the revised simple
|
||||
analyze and visualize the results of our strategy. Here’s the revised simple
|
||||
algorithm (note the addition of Line 1, and Lines 11-18)</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
|
||||
<span class="kn">from</span> <span class="nn">catalyst.api</span> <span class="kn">import</span> <span class="n">order</span><span class="p">,</span> <span class="n">record</span><span class="p">,</span> <span class="n">symbol</span>
|
||||
@@ -631,11 +634,11 @@ algorithm (note the addition of Line 1, and Lines 11-18)</p>
|
||||
<a class="reference external" href="https://matplotlib.org/">matplotlib</a>, which you might recall we installed
|
||||
alongside enigma-catalyst (with the exception of the <code class="docutils literal"><span class="pre">Conda</span></code> install, where it
|
||||
was included by default inside the conda environment we created). If for any
|
||||
reason you don’t have it installed, you can add it by running:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>(catalyst)$ pip install matplotlib
|
||||
reason you don’t have it installed, you can add it by running:</p>
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="o">(</span>catalyst<span class="o">)</span>$ pip install matplotlib
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>If everything works well, you’ll see the following chart:</p>
|
||||
<p>If everything works well, you’ll see the following chart:</p>
|
||||
<img alt="https://s3.amazonaws.com/enigmaco-docs/github.io/buy_btc_simple_graph.png" src="https://s3.amazonaws.com/enigmaco-docs/github.io/buy_btc_simple_graph.png" />
|
||||
<p>Our algorithm performance as assessed by the <code class="docutils literal"><span class="pre">portfolio_value</span></code> closely
|
||||
matches that of the bitcoin price. This is not surprising as our algorithm
|
||||
@@ -645,7 +648,7 @@ only bought bitcoin every chance it got.</p>
|
||||
results refer to <a class="reference external" href="install.html#macos-virtualenv-matplotlib">MacOS + Matplotlib</a>.
|
||||
Alternatively, some users have reported the following error when running an algo
|
||||
in a Linux environment:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>ImportError: No module named _tkinter, please install the python-tk package
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="ne">ImportError</span><span class="p">:</span> <span class="n">No</span> <span class="n">module</span> <span class="n">named</span> <span class="n">_tkinter</span><span class="p">,</span> <span class="n">please</span> <span class="n">install</span> <span class="n">the</span> <span class="n">python</span><span class="o">-</span><span class="n">tk</span> <span class="n">package</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Which can easily solved by running (in Ubuntu/Debian-based systems):</p>
|
||||
@@ -659,10 +662,10 @@ in a Linux environment:</p>
|
||||
<span id="history"></span><h2>Access to previous prices using <code class="docutils literal"><span class="pre">history</span></code><a class="headerlink" href="#access-to-previous-prices-using-history" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="working-example-dual-moving-average-cross-over">
|
||||
<h3>Working example: Dual Moving Average Cross-Over<a class="headerlink" href="#working-example-dual-moving-average-cross-over" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The Dual Moving Average (DMA) is a classic momentum strategy. It’s
|
||||
<p>The Dual Moving Average (DMA) is a classic momentum strategy. It’s
|
||||
probably not used by any serious trader anymore but is still very
|
||||
instructive. The basic idea is that we compute two rolling or moving
|
||||
averages (mavg) – one with a longer window that is supposed to capture
|
||||
averages (mavg) – one with a longer window that is supposed to capture
|
||||
long-term trends and one shorter window that is supposed to capture
|
||||
short-term trends. Once the short-mavg crosses the long-mavg from below
|
||||
we assume that the stock price has upwards momentum and long the stock.
|
||||
@@ -676,7 +679,7 @@ for daily or <code class="docutils literal"><span class="pre">'1m'</span></code>
|
||||
minute-level data when using <code class="docutils literal"><span class="pre">1m</span></code>). This is a function we use in the
|
||||
<code class="docutils literal"><span class="pre">handle_data()</span></code> section.</p>
|
||||
<p>You will note that the code below is substantially longer than the previous
|
||||
examples. Don’t get overwhelmed by it as the logic is fairly simple and easy to
|
||||
examples. Don’t get overwhelmed by it as the logic is fairly simple and easy to
|
||||
follow. Most of the added some complexity has been added to beautify the output,
|
||||
which you can skim through for now. A copy of this algorithm is available in
|
||||
the <code class="docutils literal"><span class="pre">examples</span></code> directory:
|
||||
@@ -856,7 +859,7 @@ execute this file as a Python script:</p>
|
||||
<p>A few comments on the code above:</p>
|
||||
<blockquote>
|
||||
<div><p>At the beginning of our code, we import a number of Python libraries that we
|
||||
will be using in different parts of our script. It’s good practice to keep all
|
||||
will be using in different parts of our script. It’s good practice to keep all
|
||||
imports at the beginning of the file, as they are available globally
|
||||
throughout our script. All the libraries imported in this example are already
|
||||
present in your environment since they are prerequisites for the Catalyst
|
||||
@@ -896,7 +899,7 @@ the <code class="docutils literal"><span class="pre">scikit-learn</span></code>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="jupyter-notebook">
|
||||
<h2>Jupyter Notebook<a class="headerlink" href="#jupyter-notebook" title="Permalink to this headline">¶</a></h2>
|
||||
<span id="jupyter"></span><h2>Jupyter Notebook<a class="headerlink" href="#jupyter-notebook" title="Permalink to this headline">¶</a></h2>
|
||||
<p>(<a class="reference external" href="https://github.com/enigmampc/catalyst/blob/master/catalyst/examples/running_catalyst_in_jupyter_notebook.ipynb">This is actual Notebook</a> referenced in the text below)</p>
|
||||
<p>The <a class="reference external" href="https://jupyter.org/">Jupyter Notebook</a> is a very powerful
|
||||
browser-based interface to a Python interpreter. As it is already the
|
||||
@@ -907,16 +910,16 @@ running algorithms through the command line.</p>
|
||||
<div class="section" id="install">
|
||||
<h3>Install<a class="headerlink" href="#install" title="Permalink to this headline">¶</a></h3>
|
||||
<p>In order to use Jupyter Notebook, you first have to install it inside your
|
||||
environment. It’s available as <code class="docutils literal"><span class="pre">pip</span></code> package, so regardless of how you
|
||||
environment. It’s available as <code class="docutils literal"><span class="pre">pip</span></code> package, so regardless of how you
|
||||
installed Catalyst, go inside your catalyst environemnt and run:</p>
|
||||
<div class="code bash highlight-python"><div class="highlight"><pre><span></span>(catalyst)$ pip install jupyter
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="o">(</span>catalyst<span class="o">)</span>$ pip install jupyter
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Once you have Jupyter Notebook installed, every time you want to use it run:</p>
|
||||
<div class="code bash highlight-python"><div class="highlight"><pre><span></span>(catalyst)$ jupyter notebook
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="o">(</span>catalyst<span class="o">)</span>$ jupyter notebook
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>A local server will launch, and will open a new window on your browser. That’s
|
||||
<p>A local server will launch, and will open a new window on your browser. That’s
|
||||
the interface through which you will interact with Jupyter Notebook.</p>
|
||||
</div>
|
||||
<div class="section" id="running-algorithms">
|
||||
@@ -924,7 +927,7 @@ the interface through which you will interact with Jupyter Notebook.</p>
|
||||
<p>Before running your algorithms inside the Jupyter Notebook, remember to ingest
|
||||
the data from the command line interface (CLI). In the example below, you would
|
||||
need to run first:</p>
|
||||
<div class="code bash highlight-python"><div class="highlight"><pre><span></span>catalyst ingest-exchange -x bitfinex -i btc_usd
|
||||
<div class="highlight-bash"><div class="highlight"><pre><span></span>catalyst ingest-exchange -x bitfinex -i btc_usd
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>To use Catalyst inside a Jupyter Noebook, you have to write your algorithm in a
|
||||
@@ -935,152 +938,152 @@ takes the same arguments as the command line interface. Thus to run the
|
||||
algorithm just supply the same parameters as the CLI but without the -f
|
||||
and -o arguments. We just have to execute the following cell after
|
||||
importing <code class="docutils literal"><span class="pre">catalyst</span></code> to register the magic.</p>
|
||||
<div class="code python highlight-python"><div class="highlight"><pre><span></span># Register the catalyst magic
|
||||
%load_ext catalyst
|
||||
<div class="code python highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Register the catalyst magic</span>
|
||||
<span class="o">%</span><span class="n">load_ext</span> <span class="n">catalyst</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code python highlight-python"><div class="highlight"><pre><span></span># Setup matplotlib to display graphs inline in this Notebook
|
||||
%matplotlib inline
|
||||
<div class="code python highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Setup matplotlib to display graphs inline in this Notebook</span>
|
||||
<span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Note below that we do not have to specify an input file (-f) since the
|
||||
magic will use the contents of the cell and look for your algorithm
|
||||
functions.</p>
|
||||
<div class="code python highlight-python"><div class="highlight"><pre><span></span>%%catalyst --start 2015-3-2 --end 2017-6-28 --capital-base 100000 -x bitfinex -c usd
|
||||
<div class="code python highlight-python"><div class="highlight"><pre><span></span><span class="o">%%</span><span class="n">catalyst</span> <span class="o">--</span><span class="n">start</span> <span class="mi">2015</span><span class="o">-</span><span class="mi">3</span><span class="o">-</span><span class="mi">2</span> <span class="o">--</span><span class="n">end</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">6</span><span class="o">-</span><span class="mi">28</span> <span class="o">--</span><span class="n">capital</span><span class="o">-</span><span class="n">base</span> <span class="mi">100000</span> <span class="o">-</span><span class="n">x</span> <span class="n">bitfinex</span> <span class="o">-</span><span class="n">c</span> <span class="n">usd</span>
|
||||
|
||||
from catalyst.finance.slippage import VolumeShareSlippage
|
||||
<span class="kn">from</span> <span class="nn">catalyst.finance.slippage</span> <span class="kn">import</span> <span class="n">VolumeShareSlippage</span>
|
||||
|
||||
from catalyst.api import (
|
||||
order_target_value,
|
||||
symbol,
|
||||
record,
|
||||
cancel_order,
|
||||
get_open_orders,
|
||||
)
|
||||
<span class="kn">from</span> <span class="nn">catalyst.api</span> <span class="kn">import</span> <span class="p">(</span>
|
||||
<span class="n">order_target_value</span><span class="p">,</span>
|
||||
<span class="n">symbol</span><span class="p">,</span>
|
||||
<span class="n">record</span><span class="p">,</span>
|
||||
<span class="n">cancel_order</span><span class="p">,</span>
|
||||
<span class="n">get_open_orders</span><span class="p">,</span>
|
||||
<span class="p">)</span>
|
||||
|
||||
def initialize(context):
|
||||
context.ASSET_NAME = 'btc_usd'
|
||||
context.TARGET_HODL_RATIO = 0.8
|
||||
context.RESERVE_RATIO = 1.0 - context.TARGET_HODL_RATIO
|
||||
<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">context</span><span class="p">):</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">ASSET_NAME</span> <span class="o">=</span> <span class="s1">'btc_usd'</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">TARGET_HODL_RATIO</span> <span class="o">=</span> <span class="mf">0.8</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">RESERVE_RATIO</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="n">context</span><span class="o">.</span><span class="n">TARGET_HODL_RATIO</span>
|
||||
|
||||
# For all trading pairs in the poloniex bundle, the default denomination
|
||||
# currently supported by Catalyst is 1/1000th of a full coin. Use this
|
||||
# constant to scale the price of up to that of a full coin if desired.
|
||||
context.TICK_SIZE = 1000.0
|
||||
<span class="c1"># For all trading pairs in the poloniex bundle, the default denomination</span>
|
||||
<span class="c1"># currently supported by Catalyst is 1/1000th of a full coin. Use this</span>
|
||||
<span class="c1"># constant to scale the price of up to that of a full coin if desired.</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">TICK_SIZE</span> <span class="o">=</span> <span class="mf">1000.0</span>
|
||||
|
||||
context.is_buying = True
|
||||
context.asset = symbol(context.ASSET_NAME)
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">is_buying</span> <span class="o">=</span> <span class="bp">True</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">asset</span> <span class="o">=</span> <span class="n">symbol</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">ASSET_NAME</span><span class="p">)</span>
|
||||
|
||||
context.i = 0
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
|
||||
def handle_data(context, data):
|
||||
context.i += 1
|
||||
<span class="k">def</span> <span class="nf">handle_data</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
|
||||
starting_cash = context.portfolio.starting_cash
|
||||
target_hodl_value = context.TARGET_HODL_RATIO * starting_cash
|
||||
reserve_value = context.RESERVE_RATIO * starting_cash
|
||||
<span class="n">starting_cash</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">portfolio</span><span class="o">.</span><span class="n">starting_cash</span>
|
||||
<span class="n">target_hodl_value</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">TARGET_HODL_RATIO</span> <span class="o">*</span> <span class="n">starting_cash</span>
|
||||
<span class="n">reserve_value</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">RESERVE_RATIO</span> <span class="o">*</span> <span class="n">starting_cash</span>
|
||||
|
||||
# Cancel any outstanding orders
|
||||
orders = get_open_orders(context.asset) or []
|
||||
for order in orders:
|
||||
cancel_order(order)
|
||||
<span class="c1"># Cancel any outstanding orders</span>
|
||||
<span class="n">orders</span> <span class="o">=</span> <span class="n">get_open_orders</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">asset</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]</span>
|
||||
<span class="k">for</span> <span class="n">order</span> <span class="ow">in</span> <span class="n">orders</span><span class="p">:</span>
|
||||
<span class="n">cancel_order</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
|
||||
|
||||
# Stop buying after passing the reserve threshold
|
||||
cash = context.portfolio.cash
|
||||
if cash <= reserve_value:
|
||||
context.is_buying = False
|
||||
<span class="c1"># Stop buying after passing the reserve threshold</span>
|
||||
<span class="n">cash</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">portfolio</span><span class="o">.</span><span class="n">cash</span>
|
||||
<span class="k">if</span> <span class="n">cash</span> <span class="o"><=</span> <span class="n">reserve_value</span><span class="p">:</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">is_buying</span> <span class="o">=</span> <span class="bp">False</span>
|
||||
|
||||
# Retrieve current asset price from pricing data
|
||||
price = data.current(context.asset, 'price')
|
||||
<span class="c1"># Retrieve current asset price from pricing data</span>
|
||||
<span class="n">price</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">current</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">asset</span><span class="p">,</span> <span class="s1">'price'</span><span class="p">)</span>
|
||||
|
||||
# Check if still buying and could (approximately) afford another purchase
|
||||
if context.is_buying and cash > price:
|
||||
# Place order to make position in asset equal to target_hodl_value
|
||||
order_target_value(
|
||||
context.asset,
|
||||
target_hodl_value,
|
||||
limit_price=price*1.1,
|
||||
)
|
||||
<span class="c1"># Check if still buying and could (approximately) afford another purchase</span>
|
||||
<span class="k">if</span> <span class="n">context</span><span class="o">.</span><span class="n">is_buying</span> <span class="ow">and</span> <span class="n">cash</span> <span class="o">></span> <span class="n">price</span><span class="p">:</span>
|
||||
<span class="c1"># Place order to make position in asset equal to target_hodl_value</span>
|
||||
<span class="n">order_target_value</span><span class="p">(</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">asset</span><span class="p">,</span>
|
||||
<span class="n">target_hodl_value</span><span class="p">,</span>
|
||||
<span class="n">limit_price</span><span class="o">=</span><span class="n">price</span><span class="o">*</span><span class="mf">1.1</span><span class="p">,</span>
|
||||
<span class="p">)</span>
|
||||
|
||||
record(
|
||||
price=price,
|
||||
volume=data.current(context.asset, 'volume'),
|
||||
cash=cash,
|
||||
starting_cash=context.portfolio.starting_cash,
|
||||
leverage=context.account.leverage,
|
||||
)
|
||||
<span class="n">record</span><span class="p">(</span>
|
||||
<span class="n">price</span><span class="o">=</span><span class="n">price</span><span class="p">,</span>
|
||||
<span class="n">volume</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">current</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">asset</span><span class="p">,</span> <span class="s1">'volume'</span><span class="p">),</span>
|
||||
<span class="n">cash</span><span class="o">=</span><span class="n">cash</span><span class="p">,</span>
|
||||
<span class="n">starting_cash</span><span class="o">=</span><span class="n">context</span><span class="o">.</span><span class="n">portfolio</span><span class="o">.</span><span class="n">starting_cash</span><span class="p">,</span>
|
||||
<span class="n">leverage</span><span class="o">=</span><span class="n">context</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">leverage</span><span class="p">,</span>
|
||||
<span class="p">)</span>
|
||||
|
||||
def analyze(context=None, results=None):
|
||||
import matplotlib.pyplot as plt
|
||||
<span class="k">def</span> <span class="nf">analyze</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">results</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
||||
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
|
||||
|
||||
# Plot the portfolio and asset data.
|
||||
ax1 = plt.subplot(611)
|
||||
results[['portfolio_value']].plot(ax=ax1)
|
||||
ax1.set_ylabel('Portfolio Value (USD)')
|
||||
<span class="c1"># Plot the portfolio and asset data.</span>
|
||||
<span class="n">ax1</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">611</span><span class="p">)</span>
|
||||
<span class="n">results</span><span class="p">[[</span><span class="s1">'portfolio_value'</span><span class="p">]]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax1</span><span class="p">)</span>
|
||||
<span class="n">ax1</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Portfolio Value (USD)'</span><span class="p">)</span>
|
||||
|
||||
ax2 = plt.subplot(612, sharex=ax1)
|
||||
ax2.set_ylabel('{asset} (USD)'.format(asset=context.ASSET_NAME))
|
||||
(context.TICK_SIZE * results[['price']]).plot(ax=ax2)
|
||||
<span class="n">ax2</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">612</span><span class="p">,</span> <span class="n">sharex</span><span class="o">=</span><span class="n">ax1</span><span class="p">)</span>
|
||||
<span class="n">ax2</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'{asset} (USD)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">asset</span><span class="o">=</span><span class="n">context</span><span class="o">.</span><span class="n">ASSET_NAME</span><span class="p">))</span>
|
||||
<span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">TICK_SIZE</span> <span class="o">*</span> <span class="n">results</span><span class="p">[[</span><span class="s1">'price'</span><span class="p">]])</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax2</span><span class="p">)</span>
|
||||
|
||||
trans = results.ix[[t != [] for t in results.transactions]]
|
||||
buys = trans.ix[
|
||||
[t[0]['amount'] > 0 for t in trans.transactions]
|
||||
]
|
||||
ax2.plot(
|
||||
buys.index,
|
||||
context.TICK_SIZE * results.price[buys.index],
|
||||
'^',
|
||||
markersize=10,
|
||||
color='g',
|
||||
)
|
||||
<span class="n">trans</span> <span class="o">=</span> <span class="n">results</span><span class="o">.</span><span class="n">ix</span><span class="p">[[</span><span class="n">t</span> <span class="o">!=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">results</span><span class="o">.</span><span class="n">transactions</span><span class="p">]]</span>
|
||||
<span class="n">buys</span> <span class="o">=</span> <span class="n">trans</span><span class="o">.</span><span class="n">ix</span><span class="p">[</span>
|
||||
<span class="p">[</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">'amount'</span><span class="p">]</span> <span class="o">></span> <span class="mi">0</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">trans</span><span class="o">.</span><span class="n">transactions</span><span class="p">]</span>
|
||||
<span class="p">]</span>
|
||||
<span class="n">ax2</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span>
|
||||
<span class="n">buys</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">TICK_SIZE</span> <span class="o">*</span> <span class="n">results</span><span class="o">.</span><span class="n">price</span><span class="p">[</span><span class="n">buys</span><span class="o">.</span><span class="n">index</span><span class="p">],</span>
|
||||
<span class="s1">'^'</span><span class="p">,</span>
|
||||
<span class="n">markersize</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
|
||||
<span class="n">color</span><span class="o">=</span><span class="s1">'g'</span><span class="p">,</span>
|
||||
<span class="p">)</span>
|
||||
|
||||
ax3 = plt.subplot(613, sharex=ax1)
|
||||
results[['leverage', 'alpha', 'beta']].plot(ax=ax3)
|
||||
ax3.set_ylabel('Leverage ')
|
||||
<span class="n">ax3</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">613</span><span class="p">,</span> <span class="n">sharex</span><span class="o">=</span><span class="n">ax1</span><span class="p">)</span>
|
||||
<span class="n">results</span><span class="p">[[</span><span class="s1">'leverage'</span><span class="p">,</span> <span class="s1">'alpha'</span><span class="p">,</span> <span class="s1">'beta'</span><span class="p">]]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax3</span><span class="p">)</span>
|
||||
<span class="n">ax3</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Leverage '</span><span class="p">)</span>
|
||||
|
||||
ax4 = plt.subplot(614, sharex=ax1)
|
||||
results[['starting_cash', 'cash']].plot(ax=ax4)
|
||||
ax4.set_ylabel('Cash (USD)')
|
||||
<span class="n">ax4</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">614</span><span class="p">,</span> <span class="n">sharex</span><span class="o">=</span><span class="n">ax1</span><span class="p">)</span>
|
||||
<span class="n">results</span><span class="p">[[</span><span class="s1">'starting_cash'</span><span class="p">,</span> <span class="s1">'cash'</span><span class="p">]]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax4</span><span class="p">)</span>
|
||||
<span class="n">ax4</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Cash (USD)'</span><span class="p">)</span>
|
||||
|
||||
results[[
|
||||
'treasury',
|
||||
'algorithm',
|
||||
'benchmark',
|
||||
]] = results[[
|
||||
'treasury_period_return',
|
||||
'algorithm_period_return',
|
||||
'benchmark_period_return',
|
||||
]]
|
||||
<span class="n">results</span><span class="p">[[</span>
|
||||
<span class="s1">'treasury'</span><span class="p">,</span>
|
||||
<span class="s1">'algorithm'</span><span class="p">,</span>
|
||||
<span class="s1">'benchmark'</span><span class="p">,</span>
|
||||
<span class="p">]]</span> <span class="o">=</span> <span class="n">results</span><span class="p">[[</span>
|
||||
<span class="s1">'treasury_period_return'</span><span class="p">,</span>
|
||||
<span class="s1">'algorithm_period_return'</span><span class="p">,</span>
|
||||
<span class="s1">'benchmark_period_return'</span><span class="p">,</span>
|
||||
<span class="p">]]</span>
|
||||
|
||||
ax5 = plt.subplot(615, sharex=ax1)
|
||||
results[[
|
||||
'treasury',
|
||||
'algorithm',
|
||||
'benchmark',
|
||||
]].plot(ax=ax5)
|
||||
ax5.set_ylabel('Percent Change')
|
||||
<span class="n">ax5</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">615</span><span class="p">,</span> <span class="n">sharex</span><span class="o">=</span><span class="n">ax1</span><span class="p">)</span>
|
||||
<span class="n">results</span><span class="p">[[</span>
|
||||
<span class="s1">'treasury'</span><span class="p">,</span>
|
||||
<span class="s1">'algorithm'</span><span class="p">,</span>
|
||||
<span class="s1">'benchmark'</span><span class="p">,</span>
|
||||
<span class="p">]]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax5</span><span class="p">)</span>
|
||||
<span class="n">ax5</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Percent Change'</span><span class="p">)</span>
|
||||
|
||||
ax6 = plt.subplot(616, sharex=ax1)
|
||||
results[['volume']].plot(ax=ax6)
|
||||
ax6.set_ylabel('Volume (mCoins/5min)')
|
||||
<span class="n">ax6</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">616</span><span class="p">,</span> <span class="n">sharex</span><span class="o">=</span><span class="n">ax1</span><span class="p">)</span>
|
||||
<span class="n">results</span><span class="p">[[</span><span class="s1">'volume'</span><span class="p">]]</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax6</span><span class="p">)</span>
|
||||
<span class="n">ax6</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Volume (mCoins/5min)'</span><span class="p">)</span>
|
||||
|
||||
plt.legend(loc=3)
|
||||
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||||
|
||||
# Show the plot.
|
||||
plt.gcf().set_size_inches(18, 8)
|
||||
plt.show()
|
||||
<span class="c1"># Show the plot.</span>
|
||||
<span class="n">plt</span><span class="o">.</span><span class="n">gcf</span><span class="p">()</span><span class="o">.</span><span class="n">set_size_inches</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span>
|
||||
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span>[2017-08-11 07:19:46.411748] INFO: Loader: Loading benchmark data for 'USDT_BTC' from 1989-12-31 00:00:00+00:00 to 2017-08-09 00:00:00+00:00
|
||||
[2017-08-11 07:19:46.418983] INFO: Loader: Loading data for /Users/<snipped>/.catalyst/data/USDT_BTC_benchmark.csv failed with error [Unknown string format].
|
||||
[2017-08-11 07:19:46.419740] INFO: Loader: Cache at /Users/<snipped>/.catalyst/data/USDT_BTC_benchmark.csv does not have data from 1990-01-01 00:00:00+00:00 to 2017-08-09 00:00:00+00:00.
|
||||
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">46.411748</span><span class="p">]</span> <span class="n">INFO</span><span class="p">:</span> <span class="n">Loader</span><span class="p">:</span> <span class="n">Loading</span> <span class="n">benchmark</span> <span class="n">data</span> <span class="k">for</span> <span class="s1">'USDT_BTC'</span> <span class="kn">from</span> <span class="mi">1989</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span> <span class="n">to</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">09</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span>
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">46.418983</span><span class="p">]</span> <span class="n">INFO</span><span class="p">:</span> <span class="n">Loader</span><span class="p">:</span> <span class="n">Loading</span> <span class="n">data</span> <span class="k">for</span> <span class="o">/</span><span class="n">Users</span><span class="o">/<</span><span class="n">snipped</span><span class="o">>/.</span><span class="n">catalyst</span><span class="o">/</span><span class="n">data</span><span class="o">/</span><span class="n">USDT_BTC_benchmark</span><span class="o">.</span><span class="n">csv</span> <span class="n">failed</span> <span class="k">with</span> <span class="n">error</span> <span class="p">[</span><span class="n">Unknown</span> <span class="n">string</span> <span class="n">format</span><span class="p">]</span><span class="o">.</span>
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">46.419740</span><span class="p">]</span> <span class="n">INFO</span><span class="p">:</span> <span class="n">Loader</span><span class="p">:</span> <span class="n">Cache</span> <span class="n">at</span> <span class="o">/</span><span class="n">Users</span><span class="o">/<</span><span class="n">snipped</span><span class="o">>/.</span><span class="n">catalyst</span><span class="o">/</span><span class="n">data</span><span class="o">/</span><span class="n">USDT_BTC_benchmark</span><span class="o">.</span><span class="n">csv</span> <span class="n">does</span> <span class="ow">not</span> <span class="n">have</span> <span class="n">data</span> <span class="kn">from</span> <span class="mi">1990</span><span class="o">-</span><span class="mo">01</span><span class="o">-</span><span class="mo">01</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span> <span class="n">to</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">09</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mf">00.</span>
|
||||
|
||||
[2017-08-11 07:19:46.420770] INFO: Loader: Downloading benchmark data for 'USDT_BTC' from 1989-12-31 00:00:00+00:00 to 2017-08-09 00:00:00+00:00
|
||||
[2017-08-11 07:19:50.060244] WARNING: Loader: Still don't have expected data after redownload!
|
||||
[2017-08-11 07:19:50.097334] WARNING: Loader: Refusing to download new treasury data because a download succeeded at 2017-08-11 06:56:49+00:00.
|
||||
[2017-08-11 07:19:54.618399] INFO: Performance: Simulated 851 trading days out of 851.
|
||||
[2017-08-11 07:19:54.619301] INFO: Performance: first open: 2015-03-01 00:00:00+00:00
|
||||
[2017-08-11 07:19:54.620430] INFO: Performance: last close: 2017-06-28 23:59:00+00:00
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">46.420770</span><span class="p">]</span> <span class="n">INFO</span><span class="p">:</span> <span class="n">Loader</span><span class="p">:</span> <span class="n">Downloading</span> <span class="n">benchmark</span> <span class="n">data</span> <span class="k">for</span> <span class="s1">'USDT_BTC'</span> <span class="kn">from</span> <span class="mi">1989</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">31</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span> <span class="n">to</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">09</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span>
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">50.060244</span><span class="p">]</span> <span class="n">WARNING</span><span class="p">:</span> <span class="n">Loader</span><span class="p">:</span> <span class="n">Still</span> <span class="n">don</span><span class="s1">'t have expected data after redownload!</span>
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">50.097334</span><span class="p">]</span> <span class="n">WARNING</span><span class="p">:</span> <span class="n">Loader</span><span class="p">:</span> <span class="n">Refusing</span> <span class="n">to</span> <span class="n">download</span> <span class="n">new</span> <span class="n">treasury</span> <span class="n">data</span> <span class="n">because</span> <span class="n">a</span> <span class="n">download</span> <span class="n">succeeded</span> <span class="n">at</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">06</span><span class="p">:</span><span class="mi">56</span><span class="p">:</span><span class="mi">49</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mf">00.</span>
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">54.618399</span><span class="p">]</span> <span class="n">INFO</span><span class="p">:</span> <span class="n">Performance</span><span class="p">:</span> <span class="n">Simulated</span> <span class="mi">851</span> <span class="n">trading</span> <span class="n">days</span> <span class="n">out</span> <span class="n">of</span> <span class="mf">851.</span>
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">54.619301</span><span class="p">]</span> <span class="n">INFO</span><span class="p">:</span> <span class="n">Performance</span><span class="p">:</span> <span class="n">first</span> <span class="nb">open</span><span class="p">:</span> <span class="mi">2015</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">01</span> <span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span>
|
||||
<span class="p">[</span><span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">11</span> <span class="mo">07</span><span class="p">:</span><span class="mi">19</span><span class="p">:</span><span class="mf">54.620430</span><span class="p">]</span> <span class="n">INFO</span><span class="p">:</span> <span class="n">Performance</span><span class="p">:</span> <span class="n">last</span> <span class="n">close</span><span class="p">:</span> <span class="mi">2017</span><span class="o">-</span><span class="mo">06</span><span class="o">-</span><span class="mi">28</span> <span class="mi">23</span><span class="p">:</span><span class="mi">59</span><span class="p">:</span><span class="mo">00</span><span class="o">+</span><span class="mo">00</span><span class="p">:</span><span class="mo">00</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="figure">
|
||||
@@ -2450,7 +2453,7 @@ def analyze(context=None, results=None):
|
||||
</td><td><p>7.135895</p>
|
||||
</td><td><p>9.470831</p>
|
||||
</td></tr></tbody></table><p><p>851 rows × 45 columns</p>
|
||||
</p></div><p>Also, instead of defining an output file we are accessing it via the “_”
|
||||
</p></div><p>Also, instead of defining an output file we are accessing it via the “_”
|
||||
variable that will be created in the name space and contain the
|
||||
performance DataFrame.</p>
|
||||
<div class="code python highlight-python"><div class="highlight"><pre><span></span><span class="n">_</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
|
||||
@@ -2594,7 +2597,7 @@ performance DataFrame.</p>
|
||||
<h2>Next steps<a class="headerlink" href="#next-steps" title="Permalink to this headline">¶</a></h2>
|
||||
<p>We hope that this tutorial gave you a little insight into the
|
||||
architecture, API, and features of Catalyst. For next steps, check
|
||||
out some of the other <a class="reference internal" href="example-algos.html"><em>example algorithms</em></a>.</p>
|
||||
out some of the other <a class="reference internal" href="example-algos.html"><span class="doc">example algorithms</span></a>.</p>
|
||||
<p>Feel free to ask questions on the <code class="docutils literal"><span class="pre">#catalyst_dev</span></code> channel of our
|
||||
<a class="reference external" href="https://discord.gg/SJK32GY">Discord group</a> and report
|
||||
problems on our <a class="reference external" href="https://github.com/enigmampc/catalyst/issues">GitHub issue tracker</a>.</p>
|
||||
@@ -2649,7 +2652,7 @@ problems on our <a class="reference external" href="https://github.com/enigmampc
|
||||
COLLAPSE_INDEX:false,
|
||||
FILE_SUFFIX:'.html',
|
||||
HAS_SOURCE: true,
|
||||
SOURCELINK_SUFFIX: ''
|
||||
SOURCELINK_SUFFIX: '.txt'
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||
|
||||
Reference in New Issue
Block a user