Compare commits

...
7 Commits
Author SHA1 Message Date
Victor Grau Serrat 2dbace37bb Merge branch 'develop' - Release 0.3.1
FIX: bundle start_dt cannot be earlier than asset_start
FIX: prior raise of AuthNotFound, now generates empty auth.json, and raises AuthEmpty when live
FIX: os.path.join to make BUNDLE_NAME_TEMPLATE compatible across OSes
2017-10-21 22:57:47 -06:00
Victor Grau Serrat 2e903fd42c FIX: bundle start_dt, empty auth, bundle_name_template->os.path.join 2017-10-21 22:56:22 -06:00
fredfortier d248581523 Fixed an error message 2017-10-21 00:27:05 -04:00
fredfortier 48f6300e08 Optimized imports 2017-10-20 23:18:15 -04:00
VictorandGitHub f7a143cb78 Merge pull request #41 from abnera/patch-1
Fix issues with .yml file and incompatible packages.
2017-10-20 15:46:02 -06:00
Victor Grau Serrat 2f7cd97852 DOC: WIP fix tutorial 2017-10-20 15:37:04 -06:00
Abner Ayala-AcevedoandGitHub 73eca75ed9 Updated conda .yml file to work with enigma 0.3 or above.
Removed unnecessary libraries that were giving issues.
2017-10-20 14:30:06 -07:00
18 changed files with 103 additions and 111 deletions
+10
View File
@@ -0,0 +1,10 @@
from catalyst.api import order, record, symbol
def initialize(context):
context.asset = symbol('btc_usd')
def handle_data(context, data):
order(context.asset, 1)
record(btc=data.current(context.asset, 'price'))
+3 -3
View File
@@ -1,10 +1,10 @@
import base64 import base64
import datetime
import hashlib import hashlib
import hmac import hmac
import json import json
import re import re
import time import time
import datetime
import numpy as np import numpy as np
import pandas as pd import pandas as pd
@@ -22,10 +22,10 @@ from catalyst.exchange.exchange_errors import (
InvalidOrderStyle, OrderCancelError) InvalidOrderStyle, OrderCancelError)
from catalyst.exchange.exchange_execution import ExchangeLimitOrder, \ from catalyst.exchange.exchange_execution import ExchangeLimitOrder, \
ExchangeStopLimitOrder, ExchangeStopOrder ExchangeStopLimitOrder, ExchangeStopOrder
from catalyst.finance.order import Order, ORDER_STATUS
from catalyst.protocol import Account
from catalyst.exchange.exchange_utils import get_exchange_symbols_filename, \ from catalyst.exchange.exchange_utils import get_exchange_symbols_filename, \
download_exchange_symbols download_exchange_symbols
from catalyst.finance.order import Order, ORDER_STATUS
from catalyst.protocol import Account
# Trying to account for REST api instability # Trying to account for REST api instability
# https://stackoverflow.com/questions/15431044/can-i-set-max-retries-for-requests-request # https://stackoverflow.com/questions/15431044/can-i-set-max-retries-for-requests-request
+3 -4
View File
@@ -5,18 +5,17 @@ from catalyst.assets._assets import TradingPair
from logbook import Logger from logbook import Logger
from six.moves import urllib from six.moves import urllib
from catalyst.constants import LOG_LEVEL
from catalyst.exchange.bittrex.bittrex_api import Bittrex_api from catalyst.exchange.bittrex.bittrex_api import Bittrex_api
from catalyst.exchange.exchange import Exchange from catalyst.exchange.exchange import Exchange
from catalyst.exchange.exchange_bundle import ExchangeBundle from catalyst.exchange.exchange_bundle import ExchangeBundle
from catalyst.exchange.exchange_errors import InvalidHistoryFrequencyError, \ from catalyst.exchange.exchange_errors import InvalidHistoryFrequencyError, \
ExchangeRequestError, InvalidOrderStyle, OrderNotFound, OrderCancelError, \ ExchangeRequestError, InvalidOrderStyle, OrderNotFound, OrderCancelError, \
CreateOrderError CreateOrderError
from catalyst.finance.execution import LimitOrder, StopLimitOrder
from catalyst.finance.order import Order, ORDER_STATUS
from catalyst.exchange.exchange_utils import get_exchange_symbols_filename, \ from catalyst.exchange.exchange_utils import get_exchange_symbols_filename, \
download_exchange_symbols download_exchange_symbols
from catalyst.finance.execution import LimitOrder, StopLimitOrder
from catalyst.constants import LOG_LEVEL from catalyst.finance.order import Order, ORDER_STATUS
log = Logger('Bittrex', level=LOG_LEVEL) log = Logger('Bittrex', level=LOG_LEVEL)
+2 -6
View File
@@ -19,17 +19,13 @@ import pandas as pd
from catalyst.assets._assets import TradingPair from catalyst.assets._assets import TradingPair
from logbook import Logger from logbook import Logger
from catalyst.constants import LOG_LEVEL
from catalyst.data.data_portal import DataPortal from catalyst.data.data_portal import DataPortal
from catalyst.exchange.bundle_utils import get_start_dt
from catalyst.exchange.exchange_bundle import ExchangeBundle from catalyst.exchange.exchange_bundle import ExchangeBundle
from catalyst.exchange.exchange_errors import ( from catalyst.exchange.exchange_errors import (
ExchangeRequestError, ExchangeRequestError,
ExchangeBarDataError, ExchangeBarDataError,
PricingDataBeforeTradingError, PricingDataNotLoadedError)
PricingDataNotLoadedError, InvalidHistoryFrequencyError,
BundleNotFoundError)
from catalyst.constants import LOG_LEVEL
log = Logger('DataPortalExchange', level=LOG_LEVEL) log = Logger('DataPortalExchange', level=LOG_LEVEL)
+3 -5
View File
@@ -9,14 +9,14 @@ import pandas as pd
from catalyst.assets._assets import TradingPair from catalyst.assets._assets import TradingPair
from logbook import Logger from logbook import Logger
from catalyst.constants import LOG_LEVEL
from catalyst.data.data_portal import BASE_FIELDS from catalyst.data.data_portal import BASE_FIELDS
from catalyst.exchange.bundle_utils import get_start_dt, \ from catalyst.exchange.bundle_utils import get_start_dt, \
get_delta, get_periods, get_adj_dates get_delta, get_periods
from catalyst.exchange.exchange_bundle import ExchangeBundle from catalyst.exchange.exchange_bundle import ExchangeBundle
from catalyst.exchange.exchange_errors import MismatchingBaseCurrencies, \ from catalyst.exchange.exchange_errors import MismatchingBaseCurrencies, \
InvalidOrderStyle, BaseCurrencyNotFoundError, SymbolNotFoundOnExchange, \ InvalidOrderStyle, BaseCurrencyNotFoundError, SymbolNotFoundOnExchange, \
InvalidHistoryFrequencyError, MismatchingFrequencyError, \ InvalidHistoryFrequencyError, PricingDataNotLoadedError
BundleNotFoundError, NoDataAvailableOnExchange, PricingDataNotLoadedError
from catalyst.exchange.exchange_execution import ExchangeStopLimitOrder, \ from catalyst.exchange.exchange_execution import ExchangeStopLimitOrder, \
ExchangeLimitOrder, ExchangeStopOrder ExchangeLimitOrder, ExchangeStopOrder
from catalyst.exchange.exchange_portfolio import ExchangePortfolio from catalyst.exchange.exchange_portfolio import ExchangePortfolio
@@ -24,8 +24,6 @@ from catalyst.exchange.exchange_utils import get_exchange_symbols
from catalyst.finance.order import ORDER_STATUS from catalyst.finance.order import ORDER_STATUS
from catalyst.finance.transaction import Transaction from catalyst.finance.transaction import Transaction
from catalyst.constants import LOG_LEVEL
log = Logger('Exchange', level=LOG_LEVEL) log = Logger('Exchange', level=LOG_LEVEL)
+2 -3
View File
@@ -26,6 +26,7 @@ from catalyst.assets._assets import TradingPair
import catalyst.protocol as zp import catalyst.protocol as zp
from catalyst.algorithm import TradingAlgorithm from catalyst.algorithm import TradingAlgorithm
from catalyst.constants import LOG_LEVEL
from catalyst.data.minute_bars import BcolzMinuteBarWriter, \ from catalyst.data.minute_bars import BcolzMinuteBarWriter, \
BcolzMinuteBarReader BcolzMinuteBarReader
from catalyst.errors import OrderInBeforeTradingStart from catalyst.errors import OrderInBeforeTradingStart
@@ -51,10 +52,8 @@ from catalyst.utils.api_support import (
disallowed_in_before_trading_start) disallowed_in_before_trading_start)
from catalyst.utils.input_validation import error_keywords, ensure_upper_case, \ from catalyst.utils.input_validation import error_keywords, ensure_upper_case, \
expect_types expect_types
from catalyst.utils.preprocess import preprocess
from catalyst.utils.math_utils import round_nearest from catalyst.utils.math_utils import round_nearest
from catalyst.utils.preprocess import preprocess
from catalyst.constants import LOG_LEVEL
log = logbook.Logger('exchange_algorithm', level=LOG_LEVEL) log = logbook.Logger('exchange_algorithm', level=LOG_LEVEL)
-1
View File
@@ -3,7 +3,6 @@ import numpy as np
from catalyst import get_calendar from catalyst import get_calendar
from catalyst.data.minute_bars import BcolzMinuteBarReader, \ from catalyst.data.minute_bars import BcolzMinuteBarReader, \
BcolzMinuteBarWriter BcolzMinuteBarWriter
from catalyst.exchange.bundle_utils import get_periods, get_periods_range
class BcolzExchangeBarWriter(BcolzMinuteBarWriter): class BcolzExchangeBarWriter(BcolzMinuteBarWriter):
+1 -2
View File
@@ -1,13 +1,12 @@
from catalyst.assets._assets import TradingPair from catalyst.assets._assets import TradingPair
from logbook import Logger from logbook import Logger
from catalyst.constants import LOG_LEVEL
from catalyst.finance.blotter import Blotter from catalyst.finance.blotter import Blotter
from catalyst.finance.commission import CommissionModel from catalyst.finance.commission import CommissionModel
from catalyst.finance.slippage import SlippageModel from catalyst.finance.slippage import SlippageModel
from catalyst.finance.transaction import Transaction from catalyst.finance.transaction import Transaction
from catalyst.constants import LOG_LEVEL
log = Logger('exchange_blotter', level=LOG_LEVEL) log = Logger('exchange_blotter', level=LOG_LEVEL)
# It seems like we need to accept greater slippage risk in cryptos # It seems like we need to accept greater slippage risk in cryptos
+9 -7
View File
@@ -3,9 +3,10 @@ import shutil
from datetime import timedelta from datetime import timedelta
import pandas as pd import pandas as pd
from logbook import Logger, INFO from logbook import Logger
from catalyst import get_calendar from catalyst import get_calendar
from catalyst.constants import LOG_LEVEL
from catalyst.data.minute_bars import BcolzMinuteOverlappingData, \ from catalyst.data.minute_bars import BcolzMinuteOverlappingData, \
BcolzMinuteBarMetadata BcolzMinuteBarMetadata
from catalyst.exchange.bundle_utils import range_in_bundle, \ from catalyst.exchange.bundle_utils import range_in_bundle, \
@@ -14,18 +15,16 @@ from catalyst.exchange.bundle_utils import range_in_bundle, \
from catalyst.exchange.exchange_bcolz import BcolzExchangeBarReader, \ from catalyst.exchange.exchange_bcolz import BcolzExchangeBarReader, \
BcolzExchangeBarWriter BcolzExchangeBarWriter
from catalyst.exchange.exchange_errors import EmptyValuesInBundleError, \ from catalyst.exchange.exchange_errors import EmptyValuesInBundleError, \
InvalidHistoryFrequencyError, PricingDataBeforeTradingError, \ InvalidHistoryFrequencyError, TempBundleNotFoundError, \
TempBundleNotFoundError, NoDataAvailableOnExchange, \ NoDataAvailableOnExchange, \
PricingDataNotLoadedError PricingDataNotLoadedError
from catalyst.exchange.exchange_utils import get_exchange_folder from catalyst.exchange.exchange_utils import get_exchange_folder
from catalyst.utils.cli import maybe_show_progress from catalyst.utils.cli import maybe_show_progress
from catalyst.utils.paths import ensure_directory from catalyst.utils.paths import ensure_directory
from catalyst.constants import LOG_LEVEL
log = Logger('exchange_bundle', level=LOG_LEVEL) log = Logger('exchange_bundle', level=LOG_LEVEL)
BUNDLE_NAME_TEMPLATE = '{root}/{frequency}_bundle' BUNDLE_NAME_TEMPLATE = os.path.join('{root}','{frequency}_bundle')
def _cachpath(symbol, type_): def _cachpath(symbol, type_):
return '-'.join([symbol, type_]) return '-'.join([symbol, type_])
@@ -172,7 +171,7 @@ class ExchangeBundle:
invalid_data_behavior='raise' invalid_data_behavior='raise'
) )
except BcolzMinuteOverlappingData as e: except BcolzMinuteOverlappingData as e:
log.warn('chunk already exists: {}'.format(e)) log.debug('chunk already exists: {}'.format(e))
except Exception as e: except Exception as e:
log.warn('error when writing data: {}, trying again'.format(e)) log.warn('error when writing data: {}, trying again'.format(e))
@@ -319,6 +318,9 @@ class ExchangeBundle:
except NoDataAvailableOnExchange: except NoDataAvailableOnExchange:
continue continue
start_dt = max(start_dt, self.calendar.first_trading_session)
start_dt = max(start_dt, asset_start)
# Aligning start / end dates with the daily calendar # Aligning start / end dates with the daily calendar
sessions = get_periods_range(start_dt, end_dt, data_frequency) \ sessions = get_periods_range(start_dt, end_dt, data_frequency) \
if data_frequency == 'minute' \ if data_frequency == 'minute' \
+12 -2
View File
@@ -1,10 +1,13 @@
import sys, traceback import sys
import traceback
from catalyst.errors import ZiplineError from catalyst.errors import ZiplineError
def silent_except_hook(exctype, excvalue, exctraceback): def silent_except_hook(exctype, excvalue, exctraceback):
if exctype in [PricingDataBeforeTradingError, PricingDataNotLoadedError, if exctype in [PricingDataBeforeTradingError, PricingDataNotLoadedError,
SymbolNotFoundOnExchange, NoDataAvailableOnExchange, ]: SymbolNotFoundOnExchange, NoDataAvailableOnExchange,
ExchangeAuthEmpty ]:
fn = traceback.extract_tb(exctraceback)[-1][0] fn = traceback.extract_tb(exctraceback)[-1][0]
ln = traceback.extract_tb(exctraceback)[-1][1] ln = traceback.extract_tb(exctraceback)[-1][1]
print "Error traceback: {1} (line {2})\n" \ print "Error traceback: {1} (line {2})\n" \
@@ -63,6 +66,13 @@ class ExchangeAuthNotFound(ZiplineError):
).strip() ).strip()
class ExchangeAuthEmpty(ZiplineError):
msg = (
'Please enter your API token key and secret for exchange {exchange} '
'in the following file: {filename}'
).strip()
class ExchangeSymbolsNotFound(ZiplineError): class ExchangeSymbolsNotFound(ZiplineError):
msg = ( msg = (
'Unable to download or find a local copy of symbols.json for exchange ' 'Unable to download or find a local copy of symbols.json for exchange '
+1 -2
View File
@@ -1,9 +1,8 @@
import numpy as np import numpy as np
from logbook import Logger from logbook import Logger
from catalyst.protocol import Portfolio, Positions, Position
from catalyst.constants import LOG_LEVEL from catalyst.constants import LOG_LEVEL
from catalyst.protocol import Portfolio, Positions, Position
log = Logger('ExchangePortfolio', level=LOG_LEVEL) log = Logger('ExchangePortfolio', level=LOG_LEVEL)
+6 -6
View File
@@ -8,7 +8,8 @@ import pandas as pd
from catalyst.exchange.exchange_errors import ExchangeAuthNotFound, \ from catalyst.exchange.exchange_errors import ExchangeAuthNotFound, \
ExchangeSymbolsNotFound ExchangeSymbolsNotFound
from catalyst.utils.paths import data_root, ensure_directory, last_modified_time from catalyst.utils.paths import data_root, ensure_directory, \
last_modified_time
SYMBOLS_URL = 'https://s3.amazonaws.com/enigmaco/catalyst-exchanges/' \ SYMBOLS_URL = 'https://s3.amazonaws.com/enigmaco/catalyst-exchanges/' \
'{exchange}/symbols.json' '{exchange}/symbols.json'
@@ -64,11 +65,10 @@ def get_exchange_auth(exchange_name, environ=None):
data = json.load(data_file) data = json.load(data_file)
return data return data
else: else:
raise ExchangeAuthNotFound( data = dict(name=exchange_name, key='', secret='')
exchange=exchange_name, with open(filename, 'w') as f:
filename=filename json.dump(data, f, sort_keys=False, indent=2, separators=(',', ':'))
) return data
def get_algo_folder(algo_name, environ=None): def get_algo_folder(algo_name, environ=None):
if not environ: if not environ:
+1 -3
View File
@@ -10,7 +10,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from datetime import timedelta
import pandas as pd import pandas as pd
from catalyst.gens.sim_engine import ( from catalyst.gens.sim_engine import (
@@ -19,11 +18,10 @@ from catalyst.gens.sim_engine import (
) )
from logbook import Logger from logbook import Logger
from catalyst.constants import LOG_LEVEL
from catalyst.exchange.exchange_errors import \ from catalyst.exchange.exchange_errors import \
MismatchingBaseCurrenciesExchanges MismatchingBaseCurrenciesExchanges
from catalyst.constants import LOG_LEVEL
log = Logger('LiveGraphClock', level=LOG_LEVEL) log = Logger('LiveGraphClock', level=LOG_LEVEL)
+10 -17
View File
@@ -1,39 +1,32 @@
import base64
import hashlib
import hmac
import json import json
import re import json
import time import time
from collections import defaultdict from collections import defaultdict
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import pytz import pytz
import requests
# import six
from six import iteritems
from catalyst.assets._assets import TradingPair from catalyst.assets._assets import TradingPair
from logbook import Logger from logbook import Logger
# import six
from six import iteritems
from catalyst.exchange.exchange_bundle import ExchangeBundle from catalyst.constants import LOG_LEVEL
from catalyst.exchange.poloniex.poloniex_api import Poloniex_api
# from websocket import create_connection # from websocket import create_connection
from catalyst.exchange.exchange import Exchange from catalyst.exchange.exchange import Exchange
from catalyst.exchange.exchange_bundle import ExchangeBundle
from catalyst.exchange.exchange_errors import ( from catalyst.exchange.exchange_errors import (
ExchangeRequestError, ExchangeRequestError,
InvalidHistoryFrequencyError, InvalidHistoryFrequencyError,
InvalidOrderStyle, OrderCancelError, InvalidOrderStyle, OrphanOrderReverseError)
OrphanOrderReverseError)
from catalyst.exchange.exchange_execution import ExchangeLimitOrder, \ from catalyst.exchange.exchange_execution import ExchangeLimitOrder, \
ExchangeStopLimitOrder, ExchangeStopOrder ExchangeStopLimitOrder
from catalyst.finance.order import Order, ORDER_STATUS
from catalyst.protocol import Account
from catalyst.exchange.exchange_utils import get_exchange_symbols_filename, \ from catalyst.exchange.exchange_utils import get_exchange_symbols_filename, \
download_exchange_symbols download_exchange_symbols
from catalyst.exchange.poloniex.poloniex_api import Poloniex_api
from catalyst.finance.order import Order, ORDER_STATUS
from catalyst.finance.transaction import Transaction from catalyst.finance.transaction import Transaction
from catalyst.protocol import Account
from catalyst.constants import LOG_LEVEL
log = Logger('Poloniex', level=LOG_LEVEL) log = Logger('Poloniex', level=LOG_LEVEL)
+4 -4
View File
@@ -16,13 +16,13 @@ from time import sleep
import pandas as pd import pandas as pd
from catalyst.gens.sim_engine import ( from catalyst.gens.sim_engine import (
BAR, BAR,
SESSION_START, SESSION_START
MINUTE_END,
SESSION_END
) )
from logbook import Logger from logbook import Logger
log = Logger('ExchangeClock') from catalyst.constants import LOG_LEVEL
log = Logger('ExchangeClock', level=LOG_LEVEL)
class SimpleClock(object): class SimpleClock(object):
+13 -4
View File
@@ -36,11 +36,11 @@ from catalyst.exchange.data_portal_exchange import DataPortalExchangeLive, \
from catalyst.exchange.asset_finder_exchange import AssetFinderExchange from catalyst.exchange.asset_finder_exchange import AssetFinderExchange
from catalyst.exchange.exchange_portfolio import ExchangePortfolio from catalyst.exchange.exchange_portfolio import ExchangePortfolio
from catalyst.exchange.exchange_errors import ( from catalyst.exchange.exchange_errors import (
ExchangeRequestError, ExchangeRequestError, ExchangeAuthEmpty,
ExchangeRequestErrorTooManyAttempts, ExchangeRequestErrorTooManyAttempts,
BaseCurrencyNotFoundError, ExchangeNotFoundError) BaseCurrencyNotFoundError, ExchangeNotFoundError)
from catalyst.exchange.exchange_utils import get_exchange_auth, \ from catalyst.exchange.exchange_utils import get_exchange_auth, \
get_algo_object get_algo_object, get_exchange_folder
from logbook import Logger from logbook import Logger
from catalyst.constants import LOG_LEVEL from catalyst.constants import LOG_LEVEL
@@ -166,6 +166,12 @@ def _run(handle_data,
# This corresponds to the json file containing api token info # This corresponds to the json file containing api token info
exchange_auth = get_exchange_auth(exchange_name) exchange_auth = get_exchange_auth(exchange_name)
if live and (exchange_auth['key'] == '' or exchange_auth['secret'] == ''):
raise ExchangeAuthEmpty(
exchange=exchange_name.title(),
filename=os.path.join(get_exchange_folder(exchange_name, environ), 'auth.json') )
if exchange_name == 'bitfinex': if exchange_name == 'bitfinex':
exchanges[exchange_name] = Bitfinex( exchanges[exchange_name] = Bitfinex(
key=exchange_auth['key'], key=exchange_auth['key'],
@@ -237,8 +243,11 @@ def _run(handle_data,
balances = exchange.get_balances() balances = exchange.get_balances()
except ExchangeRequestError as e: except ExchangeRequestError as e:
if attempt_index < 20: if attempt_index < 20:
log.warn('exchange error when retrieving balances, {} ' log.warn(
'trying again in 5 seconds'.format(e)) 'could not retrieve balances on {}: {}'.format(
exchange.name, e
)
)
sleep(5) sleep(5)
return fetch_capital_base(exchange, attempt_index + 1) return fetch_capital_base(exchange, attempt_index + 1)
+11 -6
View File
@@ -429,6 +429,10 @@ and allows us to plot the price of bitcoin. For example, we could easily
examine now how our portfolio value changed over time compared to the examine now how our portfolio value changed over time compared to the
bitcoin price. bitcoin price.
.. code-block:: python
%load_ext catalyst
.. code-block:: python .. code-block:: python
%pylab inline %pylab inline
@@ -484,7 +488,8 @@ a function we use in the ``handle_data()`` section:
.. code-block:: python .. code-block:: python
%%catalyst --start 2016-1-1 --end 2017-9-30 -x bitfinex -o dma.pickle %%catalyst --start 2016-4-1 --end 2017-9-30 -x bitfinex
from catalyst.api import order, record, symbol, order_target from catalyst.api import order, record, symbol, order_target
def initialize(context): def initialize(context):
@@ -492,16 +497,16 @@ a function we use in the ``handle_data()`` section:
context.asset = symbol('btc_usd') context.asset = symbol('btc_usd')
def handle_data(context, data): def handle_data(context, data):
# Skip first 300 days to get full windows # Skip first 150 days to get full windows
context.i += 1 context.i += 1
if context.i < 300: if context.i < 150:
return return
# Compute averages # Compute averages
# data.history() has to be called with the same params # data.history() has to be called with the same params
# from above and returns a pandas dataframe. # from above and returns a pandas dataframe.
short_mavg = data.history(context.asset, 'price', bar_count=100, frequency="1d").mean() short_mavg = data.history(context.asset, 'price', bar_count=50, frequency="1d").mean()
long_mavg = data.history(context.asset, 'price', bar_count=300, frequency="1d").mean() long_mavg = data.history(context.asset, 'price', bar_count=150, frequency="1d").mean()
# Trading logic # Trading logic
if short_mavg > long_mavg: if short_mavg > long_mavg:
@@ -518,7 +523,7 @@ a function we use in the ``handle_data()`` section:
def analyze(context, perf): def analyze(context, perf):
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
fig = plt.figure() fig = plt.figure(figsize=(12,12))
ax1 = fig.add_subplot(211) ax1 = fig.add_subplot(211)
perf.portfolio_value.plot(ax=ax1) perf.portfolio_value.plot(ax=ax1)
ax1.set_ylabel('portfolio value in $') ax1.set_ylabel('portfolio value in $')
+12 -36
View File
@@ -1,30 +1,24 @@
name: catalyst name: catalyst
channels: channels:
- statiskit
- defaults - defaults
dependencies: dependencies:
- certifi=2016.2.28=py27_0 - certifi=2016.2.28=py27_0
- coverage=4.4.1=py27_0 - libgfortran=3.0.0=1
- nose=1.3.7=py27_1 - mkl=2017.0.3=0
- numpy=1.13.1=py27_0
- openssl=1.0.2l=0 - openssl=1.0.2l=0
- path.py=10.3.1=py27_0
- pip=9.0.1=py27_1 - pip=9.0.1=py27_1
- python=2.7.13=0 - python=2.7.13=0
- pyyaml=3.12=py27_0
- readline=6.2=2 - readline=6.2=2
- setuptools=36.4.0=py27_0 - scipy=0.19.1=np113py27_0
- six=1.10.0=py27_0 - setuptools=36.4.0=py27_1
- sqlite=3.13.0=0 - sqlite=3.13.0=0
- tk=8.5.18=0 - tk=8.5.18=0
- wheel=0.29.0=py27_0 - wheel=0.29.0=py27_0
- yaml=0.1.6=0
- zlib=1.2.11=0 - zlib=1.2.11=0
- libdev=1.0.0=py27_0
- python-dev=1.0.0=py27_0
- python-scons=3.0.0=py27_0
- pip: - pip:
- alembic==0.9.5 - alembic==0.9.6
- backports.shutil-get-terminal-size==1.0.0 - backports.functools-lru-cache==1.4
- bcolz==0.12.1 - bcolz==0.12.1
- bottleneck==1.2.1 - bottleneck==1.2.1
- chardet==3.0.4 - chardet==3.0.4
@@ -32,36 +26,22 @@ dependencies:
- contextlib2==0.5.5 - contextlib2==0.5.5
- cycler==0.10.0 - cycler==0.10.0
- cyordereddict==1.0.0 - cyordereddict==1.0.0
- cython==0.26.1 - cython==0.27.1
- decorator==4.1.2 - decorator==4.1.2
- empyrical==0.2.1 - empyrical==0.2.1
- enigma-catalyst>=0.2.dev2
- enum34==1.1.6
- functools32==3.2.3.post2
- idna==2.6 - idna==2.6
- intervaltree==2.1.0 - intervaltree==2.1.0
- ipdb==0.10.3
- ipdbplugin==1.4.5
- ipython==5.5.0
- ipython-genutils==0.2.0
- logbook==1.1.0 - logbook==1.1.0
- lru-dict==1.1.6 - lru-dict==1.1.6
- mako==1.0.7 - mako==1.0.7
- markupsafe==1.0 - markupsafe==1.0
- matplotlib==2.0.2 - matplotlib==2.1.0
- multipledispatch==0.4.9 - multipledispatch==0.4.9
- networkx==1.11 - networkx==2.0
- numexpr==2.6.4 - numexpr==2.6.4
- numpy==1.13.1
- pandas==0.19.2 - pandas==0.19.2
- pandas-datareader==0.5.0 - pandas-datareader==0.5.0
- pathlib2==2.3.0
- patsy==0.4.1 - patsy==0.4.1
- pexpect==4.2.1
- pickleshare==0.7.4
- prompt-toolkit==1.0.15
- ptyprocess==0.5.2
- pygments==2.2.0
- pyparsing==2.2.0 - pyparsing==2.2.0
- python-dateutil==2.6.1 - python-dateutil==2.6.1
- python-editor==1.0.3 - python-editor==1.0.3
@@ -69,16 +49,12 @@ dependencies:
- requests==2.18.4 - requests==2.18.4
- requests-file==1.4.2 - requests-file==1.4.2
- requests-ftp==0.3.1 - requests-ftp==0.3.1
- scandir==1.5 - six==1.11.0
- scipy==0.19.1
- scons==3.0.0a20170821
- simplegeneric==0.8.1
- sortedcontainers==1.5.7 - sortedcontainers==1.5.7
- sqlalchemy==1.1.14 - sqlalchemy==1.1.14
- statsmodels==0.8.0 - statsmodels==0.8.0
- subprocess32==3.2.7 - subprocess32==3.2.7
- tables==3.4.2 - tables==3.4.2
- toolz==0.8.2 - toolz==0.8.2
- traitlets==4.3.2
- urllib3==1.22 - urllib3==1.22
- wcwidth==0.1.7 - enigma-catalyst>=0.3