mirror of
https://github.com/wassname/catalyst.git
synced 2026-06-27 18:04:12 +08:00
DOC: PEP8 simple_universe.py & added to example_algos.html
This commit is contained in:
@@ -31,6 +31,11 @@ Overview
|
||||
`two-part video tutorial <videos.html#backtesting-a-strategy>`_ to show how
|
||||
to get started in backtesting and live trading with Catalyst.
|
||||
|
||||
- :ref:`Simple Universe <simple_universe>`: This code provides the 'universe'
|
||||
of available trading pairs on a given exchange on any given day. You can use
|
||||
this code to dynamically select which currency pairs you want to trade each
|
||||
day of your strategy. This example does not make any trades.
|
||||
|
||||
- :ref:`Portfolio Optimization <portfolio_optimization>`: Use this code to
|
||||
execute a portfolio optimization model. This strategy will select the
|
||||
portfolio with the maximum Sharpe Ratio. The parameters are set to use 180
|
||||
@@ -753,6 +758,177 @@ implemented after the video was recorded, which executes the orders at slighlty
|
||||
different prices, but resulting in significant changes in performance of our
|
||||
strategy.
|
||||
|
||||
.. _simple_universe:
|
||||
|
||||
Simple Universe
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Source code: `examples/simple_universe.py <https://github.com/enigmampc/catalyst/blob/master/catalyst/examples/simple_universe.py>`_
|
||||
|
||||
This example aims to provide an easy way for users to learn how to
|
||||
collect data from any given exchange and select a subset of the available
|
||||
currency pairs for trading. You simply need to specify the exchange and
|
||||
the market (base_currency) that you want to focus on. You will then see
|
||||
how to create a universe of assets, and filter it based the market you
|
||||
desire.
|
||||
|
||||
The example prints out the closing price of all the pairs for a given
|
||||
market in a given exchange every 30 minutes. The example also contains
|
||||
the OHLCV data with minute-resolution for the past seven days which
|
||||
could be used to create indicators. Use this code as the backbone to
|
||||
create your own trading strategy.
|
||||
|
||||
The lookback_date variable is used to ensure data for a coin existed on
|
||||
the lookback period specified.
|
||||
|
||||
To run, execute the following two commands in a terminal (inside catalyst
|
||||
environment). The first one retrieves all the pricing data needed for this
|
||||
script to run (only needs to be run once), and the second one executes this
|
||||
script with the parameters specified in the run_algorithm() call at the end
|
||||
of the file:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
catalyst ingest-exchange -x bitfinex -f minute
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
python simple_universe.py
|
||||
|
||||
Credits: This code was originally submitted by `Abner Ayala-Acevedo
|
||||
<https://github.com/abnera>`_. Thank you!
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from datetime import timedelta
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
from catalyst import run_algorithm
|
||||
from catalyst.exchange.exchange_utils import get_exchange_symbols
|
||||
from catalyst.api import (symbols, )
|
||||
|
||||
|
||||
def initialize(context):
|
||||
context.i = -1 # minute counter
|
||||
context.exchange = context.exchanges.values()[0].name.lower()
|
||||
context.base_currency = context.exchanges.values()[0].base_currency.lower()
|
||||
|
||||
|
||||
def handle_data(context, data):
|
||||
context.i += 1
|
||||
lookback_days = 7 # 7 days
|
||||
|
||||
# current date & time in each iteration formatted into a string
|
||||
now = data.current_dt
|
||||
date, time = now.strftime('%Y-%m-%d %H:%M:%S').split(' ')
|
||||
lookback_date = now - timedelta(days=lookback_days)
|
||||
# keep only the date as a string, discard the time
|
||||
lookback_date = lookback_date.strftime('%Y-%m-%d %H:%M:%S').split(' ')[0]
|
||||
|
||||
one_day_in_minutes = 1440 # 60 * 24 assumes data_frequency='minute'
|
||||
# update universe everyday at midnight
|
||||
if not context.i % one_day_in_minutes:
|
||||
context.universe = universe(context, lookback_date, date)
|
||||
|
||||
# get data every 30 minutes
|
||||
minutes = 30
|
||||
# get lookback_days of history data: that is 'lookback' number of bins
|
||||
lookback = one_day_in_minutes / minutes * lookback_days
|
||||
if not context.i % minutes and context.universe:
|
||||
# we iterate for every pair in the current universe
|
||||
for coin in context.coins:
|
||||
pair = str(coin.symbol)
|
||||
|
||||
# Get 30 minute interval OHLCV data. This is the standard data
|
||||
# required for candlestick or indicators/signals. Return Pandas
|
||||
# DataFrames. 30T means 30-minute re-sampling of one minute data.
|
||||
# Adjust it to your desired time interval as needed.
|
||||
opened = fill(data.history(coin, 'open',
|
||||
bar_count=lookback, frequency='30T')).values
|
||||
high = fill(data.history(coin, 'high',
|
||||
bar_count=lookback, frequency='30T')).values
|
||||
low = fill(data.history(coin, 'low',
|
||||
bar_count=lookback, frequency='30T')).values
|
||||
close = fill(data.history(coin, 'price',
|
||||
bar_count=lookback, frequency='30T')).values
|
||||
volume = fill(data.history(coin, 'volume',
|
||||
bar_count=lookback, frequency='30T')).values
|
||||
|
||||
# close[-1] is the last value in the set, which is the equivalent
|
||||
# to current price (as in the most recent value)
|
||||
# displays the minute price for each pair every 30 minutes
|
||||
print('{now}: {pair} -\tO:{o},\tH:{h},\tL:{c},\tC{c},\tV:{v}'.format(
|
||||
now=now,
|
||||
pair=pair,
|
||||
o=opened[-1],
|
||||
h=high[-1],
|
||||
l=low[-1],
|
||||
c=close[-1],
|
||||
v=volume[-1],
|
||||
))
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# --------------- Insert Your Strategy Here -------------------
|
||||
# -------------------------------------------------------------
|
||||
|
||||
|
||||
def analyze(context=None, results=None):
|
||||
pass
|
||||
|
||||
|
||||
# Get the universe for a given exchange and a given base_currency market
|
||||
# Example: Poloniex BTC Market
|
||||
def universe(context, lookback_date, current_date):
|
||||
# get all the pairs for the given exchange
|
||||
json_symbols = get_exchange_symbols(context.exchange)
|
||||
# convert into a DataFrame for easier processing
|
||||
df = pd.DataFrame.from_dict(json_symbols).transpose().astype(str)
|
||||
df['base_currency'] = df.apply(lambda row: row.symbol.split('_')[1],axis=1)
|
||||
df['market_currency'] = df.apply(lambda row: row.symbol.split('_')[0],axis=1)
|
||||
|
||||
# Filter all the pairs to get only the ones for a given base_currency
|
||||
df = df[df['base_currency'] == context.base_currency]
|
||||
|
||||
# Filter all the pairs to ensure that pair existed in the current date range
|
||||
df = df[df.start_date < lookback_date]
|
||||
df = df[df.end_daily >= current_date]
|
||||
context.coins = symbols(*df.symbol) # convert all the pairs to symbols
|
||||
|
||||
return df.symbol.tolist()
|
||||
|
||||
|
||||
# Replace all NA, NAN or infinite values with its nearest value
|
||||
def fill(series):
|
||||
if isinstance(series, pd.Series):
|
||||
return series.replace([np.inf, -np.inf], np.nan).ffill().bfill()
|
||||
elif isinstance(series, np.ndarray):
|
||||
return pd.Series(series).replace(
|
||||
[np.inf, -np.inf], np.nan
|
||||
).ffill().bfill().values
|
||||
else:
|
||||
return series
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
start_date = pd.to_datetime('2017-11-10', utc=True)
|
||||
end_date = pd.to_datetime('2017-11-13', utc=True)
|
||||
|
||||
performance = run_algorithm(start=start_date, end=end_date,
|
||||
capital_base=100.0, # amount of base_currency
|
||||
initialize=initialize,
|
||||
handle_data=handle_data,
|
||||
analyze=analyze,
|
||||
exchange_name='bitfinex',
|
||||
data_frequency='minute',
|
||||
base_currency='btc',
|
||||
live=False,
|
||||
live_graph=False,
|
||||
algo_namespace='simple_universe')
|
||||
|
||||
|
||||
|
||||
.. _portfolio_optimization:
|
||||
|
||||
Portfolio Optimization
|
||||
|
||||
@@ -125,6 +125,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -125,6 +125,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
+163
-1
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -279,6 +280,10 @@ in the <code class="docutils literal"><span class="pre">analyze()</span></code>
|
||||
strategy that is used in our
|
||||
<a class="reference external" href="videos.html#backtesting-a-strategy">two-part video tutorial</a> to show how
|
||||
to get started in backtesting and live trading with Catalyst.</li>
|
||||
<li><a class="reference internal" href="#simple-universe"><span>Simple Universe</span></a>: This code provides the ‘universe’
|
||||
of available trading pairs on a given exchange on any given day. You can use
|
||||
this code to dynamically select which currency pairs you want to trade each
|
||||
day of your strategy. This example does not make any trades.</li>
|
||||
<li><a class="reference internal" href="#portfolio-optimization"><span>Portfolio Optimization</span></a>: Use this code to
|
||||
execute a portfolio optimization model. This strategy will select the
|
||||
portfolio with the maximum Sharpe Ratio. The parameters are set to use 180
|
||||
@@ -963,8 +968,165 @@ implemented after the video was recorded, which executes the orders at slighlty
|
||||
different prices, but resulting in significant changes in performance of our
|
||||
strategy.</p>
|
||||
</div>
|
||||
<div class="section" id="simple-universe">
|
||||
<span id="id1"></span><h2>Simple Universe<a class="headerlink" href="#simple-universe" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Source code: <a class="reference external" href="https://github.com/enigmampc/catalyst/blob/master/catalyst/examples/simple_universe.py">examples/simple_universe.py</a></p>
|
||||
<p>This example aims to provide an easy way for users to learn how to
|
||||
collect data from any given exchange and select a subset of the available
|
||||
currency pairs for trading. You simply need to specify the exchange and
|
||||
the market (base_currency) that you want to focus on. You will then see
|
||||
how to create a universe of assets, and filter it based the market you
|
||||
desire.</p>
|
||||
<p>The example prints out the closing price of all the pairs for a given
|
||||
market in a given exchange every 30 minutes. The example also contains
|
||||
the OHLCV data with minute-resolution for the past seven days which
|
||||
could be used to create indicators. Use this code as the backbone to
|
||||
create your own trading strategy.</p>
|
||||
<p>The lookback_date variable is used to ensure data for a coin existed on
|
||||
the lookback period specified.</p>
|
||||
<p>To run, execute the following two commands in a terminal (inside catalyst
|
||||
environment). The first one retrieves all the pricing data needed for this
|
||||
script to run (only needs to be run once), and the second one executes this
|
||||
script with the parameters specified in the run_algorithm() call at the end
|
||||
of the file:</p>
|
||||
<div class="highlight-bash"><div class="highlight"><pre>catalyst ingest-exchange -x bitfinex -f minute
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-bash"><div class="highlight"><pre>python simple_universe.py
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Credits: This code was originally submitted by <a class="reference external" href="https://github.com/abnera">Abner Ayala-Acevedo</a>. Thank you!</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
|
||||
<span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">catalyst</span> <span class="kn">import</span> <span class="n">run_algorithm</span>
|
||||
<span class="kn">from</span> <span class="nn">catalyst.exchange.exchange_utils</span> <span class="kn">import</span> <span class="n">get_exchange_symbols</span>
|
||||
<span class="kn">from</span> <span class="nn">catalyst.api</span> <span class="kn">import</span> <span class="p">(</span><span class="n">symbols</span><span class="p">,</span> <span class="p">)</span>
|
||||
|
||||
|
||||
<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">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="c"># minute counter</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">exchange</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">exchanges</span><span class="o">.</span><span class="n">values</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">base_currency</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">exchanges</span><span class="o">.</span><span class="n">values</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">base_currency</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
||||
|
||||
|
||||
<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>
|
||||
<span class="n">lookback_days</span> <span class="o">=</span> <span class="mi">7</span> <span class="c"># 7 days</span>
|
||||
|
||||
<span class="c"># current date & time in each iteration formatted into a string</span>
|
||||
<span class="n">now</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">current_dt</span>
|
||||
<span class="n">date</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">'%Y-%m-</span><span class="si">%d</span><span class="s"> %H:%M:%S'</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">' '</span><span class="p">)</span>
|
||||
<span class="n">lookback_date</span> <span class="o">=</span> <span class="n">now</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">lookback_days</span><span class="p">)</span>
|
||||
<span class="c"># keep only the date as a string, discard the time</span>
|
||||
<span class="n">lookback_date</span> <span class="o">=</span> <span class="n">lookback_date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">'%Y-%m-</span><span class="si">%d</span><span class="s"> %H:%M:%S'</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">' '</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||||
|
||||
<span class="n">one_day_in_minutes</span> <span class="o">=</span> <span class="mi">1440</span> <span class="c"># 60 * 24 assumes data_frequency='minute'</span>
|
||||
<span class="c"># update universe everyday at midnight</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">context</span><span class="o">.</span><span class="n">i</span> <span class="o">%</span> <span class="n">one_day_in_minutes</span><span class="p">:</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">universe</span> <span class="o">=</span> <span class="n">universe</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">lookback_date</span><span class="p">,</span> <span class="n">date</span><span class="p">)</span>
|
||||
|
||||
<span class="c"># get data every 30 minutes</span>
|
||||
<span class="n">minutes</span> <span class="o">=</span> <span class="mi">30</span>
|
||||
<span class="c"># get lookback_days of history data: that is 'lookback' number of bins</span>
|
||||
<span class="n">lookback</span> <span class="o">=</span> <span class="n">one_day_in_minutes</span> <span class="o">/</span> <span class="n">minutes</span> <span class="o">*</span> <span class="n">lookback_days</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">context</span><span class="o">.</span><span class="n">i</span> <span class="o">%</span> <span class="n">minutes</span> <span class="ow">and</span> <span class="n">context</span><span class="o">.</span><span class="n">universe</span><span class="p">:</span>
|
||||
<span class="c"># we iterate for every pair in the current universe</span>
|
||||
<span class="k">for</span> <span class="n">coin</span> <span class="ow">in</span> <span class="n">context</span><span class="o">.</span><span class="n">coins</span><span class="p">:</span>
|
||||
<span class="n">pair</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">coin</span><span class="o">.</span><span class="n">symbol</span><span class="p">)</span>
|
||||
|
||||
<span class="c"># Get 30 minute interval OHLCV data. This is the standard data</span>
|
||||
<span class="c"># required for candlestick or indicators/signals. Return Pandas</span>
|
||||
<span class="c"># DataFrames. 30T means 30-minute re-sampling of one minute data.</span>
|
||||
<span class="c"># Adjust it to your desired time interval as needed.</span>
|
||||
<span class="n">opened</span> <span class="o">=</span> <span class="n">fill</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">history</span><span class="p">(</span><span class="n">coin</span><span class="p">,</span> <span class="s">'open'</span><span class="p">,</span>
|
||||
<span class="n">bar_count</span><span class="o">=</span><span class="n">lookback</span><span class="p">,</span> <span class="n">frequency</span><span class="o">=</span><span class="s">'30T'</span><span class="p">))</span><span class="o">.</span><span class="n">values</span>
|
||||
<span class="n">high</span> <span class="o">=</span> <span class="n">fill</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">history</span><span class="p">(</span><span class="n">coin</span><span class="p">,</span> <span class="s">'high'</span><span class="p">,</span>
|
||||
<span class="n">bar_count</span><span class="o">=</span><span class="n">lookback</span><span class="p">,</span> <span class="n">frequency</span><span class="o">=</span><span class="s">'30T'</span><span class="p">))</span><span class="o">.</span><span class="n">values</span>
|
||||
<span class="n">low</span> <span class="o">=</span> <span class="n">fill</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">history</span><span class="p">(</span><span class="n">coin</span><span class="p">,</span> <span class="s">'low'</span><span class="p">,</span>
|
||||
<span class="n">bar_count</span><span class="o">=</span><span class="n">lookback</span><span class="p">,</span> <span class="n">frequency</span><span class="o">=</span><span class="s">'30T'</span><span class="p">))</span><span class="o">.</span><span class="n">values</span>
|
||||
<span class="n">close</span> <span class="o">=</span> <span class="n">fill</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">history</span><span class="p">(</span><span class="n">coin</span><span class="p">,</span> <span class="s">'price'</span><span class="p">,</span>
|
||||
<span class="n">bar_count</span><span class="o">=</span><span class="n">lookback</span><span class="p">,</span> <span class="n">frequency</span><span class="o">=</span><span class="s">'30T'</span><span class="p">))</span><span class="o">.</span><span class="n">values</span>
|
||||
<span class="n">volume</span> <span class="o">=</span> <span class="n">fill</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">history</span><span class="p">(</span><span class="n">coin</span><span class="p">,</span> <span class="s">'volume'</span><span class="p">,</span>
|
||||
<span class="n">bar_count</span><span class="o">=</span><span class="n">lookback</span><span class="p">,</span> <span class="n">frequency</span><span class="o">=</span><span class="s">'30T'</span><span class="p">))</span><span class="o">.</span><span class="n">values</span>
|
||||
|
||||
<span class="c"># close[-1] is the last value in the set, which is the equivalent</span>
|
||||
<span class="c"># to current price (as in the most recent value)</span>
|
||||
<span class="c"># displays the minute price for each pair every 30 minutes</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">'{now}: {pair} -</span><span class="se">\t</span><span class="s">O:{o},</span><span class="se">\t</span><span class="s">H:{h},</span><span class="se">\t</span><span class="s">L:{c},</span><span class="se">\t</span><span class="s">C{c},</span><span class="se">\t</span><span class="s">V:{v}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
||||
<span class="n">now</span><span class="o">=</span><span class="n">now</span><span class="p">,</span>
|
||||
<span class="n">pair</span><span class="o">=</span><span class="n">pair</span><span class="p">,</span>
|
||||
<span class="n">o</span><span class="o">=</span><span class="n">opened</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
|
||||
<span class="n">h</span><span class="o">=</span><span class="n">high</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
|
||||
<span class="n">l</span><span class="o">=</span><span class="n">low</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
|
||||
<span class="n">c</span><span class="o">=</span><span class="n">close</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
|
||||
<span class="n">v</span><span class="o">=</span><span class="n">volume</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
|
||||
<span class="p">))</span>
|
||||
|
||||
<span class="c"># -------------------------------------------------------------</span>
|
||||
<span class="c"># --------------- Insert Your Strategy Here -------------------</span>
|
||||
<span class="c"># -------------------------------------------------------------</span>
|
||||
|
||||
|
||||
<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="k">pass</span>
|
||||
|
||||
|
||||
<span class="c"># Get the universe for a given exchange and a given base_currency market</span>
|
||||
<span class="c"># Example: Poloniex BTC Market</span>
|
||||
<span class="k">def</span> <span class="nf">universe</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">lookback_date</span><span class="p">,</span> <span class="n">current_date</span><span class="p">):</span>
|
||||
<span class="c"># get all the pairs for the given exchange</span>
|
||||
<span class="n">json_symbols</span> <span class="o">=</span> <span class="n">get_exchange_symbols</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">exchange</span><span class="p">)</span>
|
||||
<span class="c"># convert into a DataFrame for easier processing</span>
|
||||
<span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">json_symbols</span><span class="p">)</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">str</span><span class="p">)</span>
|
||||
<span class="n">df</span><span class="p">[</span><span class="s">'base_currency'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">row</span><span class="p">:</span> <span class="n">row</span><span class="o">.</span><span class="n">symbol</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'_'</span><span class="p">)[</span><span class="mi">1</span><span class="p">],</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||||
<span class="n">df</span><span class="p">[</span><span class="s">'market_currency'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">row</span><span class="p">:</span> <span class="n">row</span><span class="o">.</span><span class="n">symbol</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'_'</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||||
|
||||
<span class="c"># Filter all the pairs to get only the ones for a given base_currency</span>
|
||||
<span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="s">'base_currency'</span><span class="p">]</span> <span class="o">==</span> <span class="n">context</span><span class="o">.</span><span class="n">base_currency</span><span class="p">]</span>
|
||||
|
||||
<span class="c"># Filter all the pairs to ensure that pair existed in the current date range</span>
|
||||
<span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="o">.</span><span class="n">start_date</span> <span class="o"><</span> <span class="n">lookback_date</span><span class="p">]</span>
|
||||
<span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="o">.</span><span class="n">end_daily</span> <span class="o">>=</span> <span class="n">current_date</span><span class="p">]</span>
|
||||
<span class="n">context</span><span class="o">.</span><span class="n">coins</span> <span class="o">=</span> <span class="n">symbols</span><span class="p">(</span><span class="o">*</span><span class="n">df</span><span class="o">.</span><span class="n">symbol</span><span class="p">)</span> <span class="c"># convert all the pairs to symbols</span>
|
||||
|
||||
<span class="k">return</span> <span class="n">df</span><span class="o">.</span><span class="n">symbol</span><span class="o">.</span><span class="n">tolist</span><span class="p">()</span>
|
||||
|
||||
|
||||
<span class="c"># Replace all NA, NAN or infinite values with its nearest value</span>
|
||||
<span class="k">def</span> <span class="nf">fill</span><span class="p">(</span><span class="n">series</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">series</span><span class="p">,</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="n">series</span><span class="o">.</span><span class="n">replace</span><span class="p">([</span><span class="n">np</span><span class="o">.</span><span class="n">inf</span><span class="p">,</span> <span class="o">-</span><span class="n">np</span><span class="o">.</span><span class="n">inf</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span><span class="p">)</span><span class="o">.</span><span class="n">ffill</span><span class="p">()</span><span class="o">.</span><span class="n">bfill</span><span class="p">()</span>
|
||||
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">series</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">series</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span>
|
||||
<span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">inf</span><span class="p">,</span> <span class="o">-</span><span class="n">np</span><span class="o">.</span><span class="n">inf</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
|
||||
<span class="p">)</span><span class="o">.</span><span class="n">ffill</span><span class="p">()</span><span class="o">.</span><span class="n">bfill</span><span class="p">()</span><span class="o">.</span><span class="n">values</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">series</span>
|
||||
|
||||
|
||||
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
|
||||
<span class="n">start_date</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="s">'2017-11-10'</span><span class="p">,</span> <span class="n">utc</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
||||
<span class="n">end_date</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="s">'2017-11-13'</span><span class="p">,</span> <span class="n">utc</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
||||
|
||||
<span class="n">performance</span> <span class="o">=</span> <span class="n">run_algorithm</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="n">end_date</span><span class="p">,</span>
|
||||
<span class="n">capital_base</span><span class="o">=</span><span class="mf">100.0</span><span class="p">,</span> <span class="c"># amount of base_currency</span>
|
||||
<span class="n">initialize</span><span class="o">=</span><span class="n">initialize</span><span class="p">,</span>
|
||||
<span class="n">handle_data</span><span class="o">=</span><span class="n">handle_data</span><span class="p">,</span>
|
||||
<span class="n">analyze</span><span class="o">=</span><span class="n">analyze</span><span class="p">,</span>
|
||||
<span class="n">exchange_name</span><span class="o">=</span><span class="s">'bitfinex'</span><span class="p">,</span>
|
||||
<span class="n">data_frequency</span><span class="o">=</span><span class="s">'minute'</span><span class="p">,</span>
|
||||
<span class="n">base_currency</span><span class="o">=</span><span class="s">'btc'</span><span class="p">,</span>
|
||||
<span class="n">live</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
|
||||
<span class="n">live_graph</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
|
||||
<span class="n">algo_namespace</span><span class="o">=</span><span class="s">'simple_universe'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="portfolio-optimization">
|
||||
<span id="id1"></span><h2>Portfolio Optimization<a class="headerlink" href="#portfolio-optimization" title="Permalink to this headline">¶</a></h2>
|
||||
<span id="id2"></span><h2>Portfolio Optimization<a class="headerlink" href="#portfolio-optimization" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Use this code to execute a portfolio optimization model. This strategy will
|
||||
select the portfolio with the maximum Sharpe Ratio. The parameters are set to
|
||||
use 180 days of historical data and rebalance every 30 days. This code was used
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
BIN
Binary file not shown.
@@ -125,6 +125,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -125,6 +125,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -125,6 +125,7 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#buy-and-hodl-algorithm">Buy and Hodl Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#dual-moving-average-crossover">Dual Moving Average Crossover</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#mean-reversion-algorithm">Mean Reversion Algorithm</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#simple-universe">Simple Universe</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="example-algos.html#portfolio-optimization">Portfolio Optimization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
Reference in New Issue
Block a user