def random_intalpha(startdate='20140103', freq='30min', n=None): if not n >= 0: n = np.random.randint(10, 20) dates = dateutil.get_startfrom(DATES, dateutil.compliment_datestring(str(startdate), -1, True), n) times = dateutil.generate_intervals(int(freq[:-3])*60) dts = pd.to_datetime([d+' '+t for d in dates for t in times]) df = pd.DataFrame(np.random.randn(len(dts), len(SIDS)), index=dts, columns=SIDS) return df
class IntervalFetcher(KMinFetcher): """Class to fetch TinySoft minute-bar data. :param str freq: Frequency of minute-bar data, currently only supports: ('30min', '5min', '1min') """ collections = { '30min': DB.ts_30min, '5min': DB.ts_5min, '1min': DB.ts_1min, } intervals = { '30min': dateutil.generate_intervals(1800), '5min': dateutil.generate_intervals(300), '1min': dateutil.generate_intervals(60), } dnames = DB.ts_30min.distinct('dname') freqs = ('30min', '5min', '1min') def __init__(self, freq, **kwargs): if freq not in IntervalFetcher.freqs: raise ValueError( 'No minute-bar data of frequency {0!r} exists'.format(freq)) self._freq = freq self.collection = IntervalFetcher.collections[freq] self.intervals = IntervalFetcher.intervals[freq] super(IntervalFetcher, self).__init__(**kwargs) @property def freq(self): """Property.""" return self._freq @freq.setter def freq(self, freq): if freq not in IntervalFetcher.freqs: self.warning( 'No minute-bar data of frequency {0!r} exists. Nothing has changed' .format(freq)) return self._freq = freq self.collection = IntervalFetcher.collections[freq] self.intervals = IntervalFetcher.intervals[freq]
class IntervalReturnsFetcher(KMinFetcher): """Class to fetch TinySoft interval returns data. :param str freq: Frequency of interval returns, currently only supports: ('1min', '5min', '15min', '30min', '60min', '120min') """ freqs = ('1min', '5min', '15min', '30min', '60min', '120min') intervals = { '1min': dateutil.generate_intervals(60), '5min': dateutil.generate_intervals(300), '15min': dateutil.generate_intervals(15 * 60), '30min': dateutil.generate_intervals(30 * 60), '60min': dateutil.generate_intervals(60 * 60), '120min': dateutil.generate_intervals(120 * 60), } def __init__(self, freq, **kwargs): if freq is not None and freq not in IntervalReturnsFetcher.freqs: raise ValueError( 'No interval returns of frequency {0!r} exists'.format(freq)) self._freq = freq self._dname = 'returns' + freq[:-3] self.collection = DB.ts_ret self.intervals = IntervalReturnsFetcher.intervals[freq] super(IntervalReturnsFetcher, self).__init__(**kwargs) @property def freq(self): """Property.""" return self._freq @freq.setter def freq(self, freq): if freq not in IntervalReturnsFetcher.freqs: self.warning( 'No interval returns of frequency {0!r} exists. Nothing has changed' .format(freq)) return self._freq = freq self._dname = 'returns' + freq[:-3] self.intervals = IntervalReturnsFetcher.intervals[freq] def fetch(self, *args, **kwargs): """A variant of :py:meth:`orca.mongo.base.KMinFetcher.fetch`: when ``dname`` is omitted, it uses the :py:attr:`IntervalReturnsFetcher.freq` to determine which data to fetch.""" if isinstance(args[0], str) and args[0][:7] == 'returns': # dname is given return super(IntervalReturnsFetcher, self).fetch(*args, **kwargs) else: return super(IntervalReturnsFetcher, self).fetch(*((self._dname, ) + args), **kwargs) def fetch_window(self, *args, **kwargs): """A variant of :py:meth:`orca.mongo.base.KMinFetcher.fetch_window`: when ``dname`` is omitted, it uses the :py:attr:`IntervalReturnsFetcher.freq` to determine which data to fetch.""" if isinstance(args[0], str): # dname is given return super(IntervalReturnsFetcher, self).fetch_window(*args, **kwargs) else: return super(IntervalReturnsFetcher, self).fetch_window(*((self._dname, ) + args), **kwargs) def fetch_history(self, *args, **kwargs): """A variant of :py:meth:`orca.mongo.base.KMinFetcher.fetch_history`: when ``dname`` is omitted, it uses the :py:attr:`IntervalReturnsFetcher.freq` to determine which data to fetch.""" if isinstance(args[0], str) and args[0][:7] == 'returns': # dname is given return super(IntervalReturnsFetcher, self).fetch_history(*args, **kwargs) else: return super(IntervalReturnsFetcher, self).fetch_history(*((self._dname, ) + args), **kwargs) def fetch_daily(self, *args, **kwargs): """A variant of :py:meth:`orca.mongo.base.KMinFetcher.fetch_daily`: when ``dname`` is omitted, it uses the :py:attr:`IntervalReturnsFetcher.freq` to determine which data to fetch.""" if isinstance(args[0], str) and args[0][:7] == 'returns': # dname is given return super(IntervalReturnsFetcher, self).fetch_daily(*args, **kwargs) else: return super(IntervalReturnsFetcher, self).fetch_daily(*((self._dname, ) + args), **kwargs) def fetch_intervals(self, *args, **kwargs): """A variant of :py:meth:`orca.mongo.base.KMinFetcher.fetch_daily`: when ``dname`` is omitted, it uses the :py:attr:`IntervalReturnsFetcher.freq` to determine which data to fetch.""" if isinstance(args[0], str) and args[0][:7] == 'returns': # dname is given return super(IntervalReturnsFetcher, self).fetch_intervals(*args, **kwargs) else: return super(IntervalReturnsFetcher, self).fetch_intervals(*((self._dname, ) + args), **kwargs)
def __init__(self, timeout=60): UpdaterBase.__init__(self, timeout=timeout) self.interval = IntervalFetcher('1min') self.quote = QuoteFetcher() self.indexquote = IndexQuoteFetcher() self.times = dateutil.generate_intervals(60)
""" .. moduleauthor:: Li, Wang <*****@*****.**> """ import os from datetime import datetime, timedelta import numpy as np import pandas as pd import warnings warnings.simplefilter(action='ignore', category=pd.core.common.SettingWithCopyWarning) from base import UpdaterBase from orca.utils.dateutil import generate_intervals times_1min = generate_intervals(1*60, begin='091500', end='151500') times_5min = generate_intervals(5*60, begin='091500', end='151500') columns = ['dt', 'price', 'volume', 'bid1', 'ask1', 'bds1', 'aks1', 'open_interest'] dnames = ['price', 'volume', 'open_interest', 'bid1', 'bds1', 'ask1', 'aks1'] columns1 = ['dt', 'price', 'volume'] dnames1 = ['price', 'volume'] class IFUpdater(UpdaterBase): """The updater class for collection 'IF'.""" def __init__(self, timeout=1200): super(IFUpdater, self).__init__(timeout=timeout) self.sids = set() def pre_update(self):
def __init__(self, freq, **kwargs): super(IntervalAlphaBase, self).__init__(**kwargs) if freq not in IntervalAlphaBase.freqs: raise ValueError('Frequency {0!r} is currently not supported'.format(freq)) self.freq = 60 * int(freq[:-3]) self.times = dateutil.generate_intervals(self.freq)
class IFIntervalFetcher(KDayFetcher): """Class to fetch TinySoft futures minute-bar data. :param str freq: Frequency of minute-bar data, currently only supports: ('5min', '1min') """ collections = { '5min': DB.IF_5min, '1min': DB.IF_1min, } intervals = { '5min': dateutil.generate_intervals(5 * 60, begin='091500', end='151500'), '1min': dateutil.generate_intervals(1 * 60, begin='091500', end='151500'), } dnames = DB.IF_5min.distinct('dname') freqs = ('30min', '5min', '1min') def __init__(self, freq, **kwargs): if freq not in IFIntervalFetcher.freqs: raise ValueError( 'No minute-bar data of frequency {0!r} exists'.format(freq)) self._freq = freq self.collection = IFIntervalFetcher.collections[freq] self.intervals = IFIntervalFetcher.intervals[freq] super(IFIntervalFetcher, self).__init__(**kwargs) @property def freq(self): """Property.""" return self._freq @freq.setter def freq(self, freq): if freq not in IFIntervalFetcher.freqs: self.warning( 'No minute-bar data of frequency {0!r} exists. Nothing has changed' .format(freq)) return self._freq = freq self.collection = IFIntervalFetcher.collections[freq] self.intervals = IFIntervalFetcher.intervals[freq] def fetch_window(self, dname, window, sid=None, **kwargs): assert sid datetime_index = kwargs.get('datetime_index', self.datetime_index) reindex = kwargs.get('reindex', self.reindex) query = { 'sid': sid, 'dname': dname, 'date': { '$gte': window[0], '$lte': window[-1] } } proj = {'_id': 0, 'dvalue': 1, 'date': 1} cursor = self.collection.find(query, proj) df = pd.DataFrame({row['date']: row['dvalue'] for row in cursor}).T del cursor if reindex: ser = df.T.unstack() ser.index = pd.to_datetime([d + t for d, t in ser.index]) return ser if datetime_index: df.index = pd.to_datetime(df.index) return df def fetch(self, dname, startdate=None, **kwargs): if startdate is None: startdate = '20100416' return super(IFIntervalFetcher, self).fetch(dname, startdate, **kwargs)