mirror of
https://github.com/wassname/catalyst.git
synced 2026-06-28 01:59:35 +08:00
121 lines
3.4 KiB
Python
121 lines
3.4 KiB
Python
import importlib
|
|
import os
|
|
|
|
import matplotlib
|
|
import matplotlib.pyplot as plt
|
|
# from matplotlib.finance import volume_overlay
|
|
import matplotlib.ticker as ticker
|
|
import pandas as pd
|
|
from matplotlib.finance import candlestick2_ohlc
|
|
|
|
from catalyst.exchange.exchange_bcolz import BcolzExchangeBarReader
|
|
from catalyst.exchange.exchange_bundle import ExchangeBundle
|
|
from catalyst.exchange.utils.bundle_utils import get_df_from_arrays, \
|
|
get_bcolz_chunk
|
|
from catalyst.exchange.utils.factory import get_exchange
|
|
|
|
EXCHANGE_NAMES = ['bitfinex', 'bittrex', 'poloniex']
|
|
exchanges = dict((e, getattr(importlib.import_module(
|
|
'catalyst.exchange.{0}.{0}'.format(e)), e.capitalize()))
|
|
for e in EXCHANGE_NAMES)
|
|
|
|
|
|
class ValidateChunks(object):
|
|
def __init__(self):
|
|
self.columns = ['open', 'high', 'low', 'close', 'volume']
|
|
|
|
def chunk_to_df(self, exchange_name, symbol, data_frequency, period):
|
|
|
|
exchange = get_exchange(exchange_name)
|
|
asset = exchange.get_asset(symbol)
|
|
|
|
filename = get_bcolz_chunk(
|
|
exchange_name=exchange_name,
|
|
symbol=symbol,
|
|
data_frequency=data_frequency,
|
|
period=period
|
|
)
|
|
|
|
reader = BcolzExchangeBarReader(rootdir=filename,
|
|
data_frequency=data_frequency)
|
|
|
|
# metadata = BcolzMinuteBarMetadata.read(filename)
|
|
|
|
start = reader.first_trading_day
|
|
end = reader.last_available_dt
|
|
|
|
if data_frequency == 'daily':
|
|
end = end - pd.Timedelta(hours=23, minutes=59)
|
|
|
|
print(start, end, data_frequency)
|
|
|
|
arrays = reader.load_raw_arrays(self.columns, start, end,
|
|
[asset.sid, ])
|
|
|
|
bundle = ExchangeBundle(exchange_name)
|
|
|
|
periods = bundle.get_calendar_periods_range(
|
|
start, end, data_frequency
|
|
)
|
|
|
|
return get_df_from_arrays(arrays, periods)
|
|
|
|
def plot_ohlcv(self, df):
|
|
|
|
fig, ax = plt.subplots()
|
|
|
|
# Plot the candlestick
|
|
candlestick2_ohlc(ax, df['open'], df['high'], df['low'], df['close'],
|
|
width=1, colorup='g', colordown='r', alpha=0.5)
|
|
|
|
# shift y-limits of the candlestick plot so that there is space
|
|
# at the bottom for the volume bar chart
|
|
pad = 0.25
|
|
yl = ax.get_ylim()
|
|
ax.set_ylim(yl[0] - (yl[1] - yl[0]) * pad, yl[1])
|
|
|
|
# Add a seconds axis for the volume overlay
|
|
ax2 = ax.twinx()
|
|
|
|
ax2.set_position(
|
|
matplotlib.transforms.Bbox([[0.125, 0.1], [0.9, 0.26]]))
|
|
|
|
# Plot the volume overlay
|
|
# bc = volume_overlay(ax2, df['open'], df['close'], df['volume'],
|
|
# colorup='g', alpha=0.5, width=1)
|
|
|
|
ax.xaxis.set_major_locator(ticker.MaxNLocator(6))
|
|
|
|
def mydate(x, pos):
|
|
try:
|
|
return df.index[int(x)]
|
|
except IndexError:
|
|
return ''
|
|
|
|
ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate))
|
|
plt.margins(0)
|
|
plt.show()
|
|
|
|
def plot(self, filename):
|
|
df = self.chunk_to_df(filename)
|
|
self.plot_ohlcv(df)
|
|
|
|
def to_csv(self, filename):
|
|
df = self.chunk_to_df(filename)
|
|
df.to_csv(os.path.basename(filename).split('.')[0] + '.csv')
|
|
|
|
|
|
v = ValidateChunks()
|
|
|
|
df = v.chunk_to_df(
|
|
exchange_name='bitfinex',
|
|
symbol='eth_btc',
|
|
data_frequency='daily',
|
|
period='2016'
|
|
)
|
|
print(df.tail())
|
|
v.plot_ohlcv(df)
|
|
# v.plot(
|
|
# ex
|
|
# )
|