Skip to content

Commit

Permalink
refactor BaseDataSource, remove logic about hk stock
Browse files Browse the repository at this point in the history
  • Loading branch information
Cuizi7 committed Oct 16, 2018
1 parent 02b10b3 commit b31fd71
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 155 deletions.
2 changes: 1 addition & 1 deletion rqalpha/VERSION.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.1.1.b7af7e
3.1.1.dev.fc82ab
89 changes: 29 additions & 60 deletions rqalpha/data/base_data_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,14 @@
import numpy as np

from rqalpha.interface import AbstractDataSource
from rqalpha.const import MARGIN_TYPE, MARKET
from rqalpha.environment import Environment
from rqalpha.const import MARGIN_TYPE
from rqalpha.utils.py2 import lru_cache
from rqalpha.utils.datetime_func import convert_date_to_int, convert_int_to_date
from rqalpha.utils.i18n import gettext as _

from rqalpha.data.future_info_cn import CN_FUTURE_INFO
from rqalpha.data.converter import StockBarConverter, IndexBarConverter
from rqalpha.data.converter import (
FutureDayBarConverter, FundDayBarConverter, PublicFundDayBarConverter, HkStockBarConverter)
from rqalpha.data.converter import FutureDayBarConverter, FundDayBarConverter, PublicFundDayBarConverter

from rqalpha.data.daybar_store import DayBarStore
from rqalpha.data.date_set import DateSet
Expand All @@ -39,7 +37,6 @@
from rqalpha.data.simple_factor_store import SimpleFactorStore
from rqalpha.data.adjust import adjust_bars, FIELDS_REQUIRE_ADJUSTMENT
from rqalpha.data.public_fund_commission import PUBLIC_FUND_COMMISSION
from rqalpha.data.hk_data_helper import HkYieldCurveMocker, HkDividendStore, HkDayBarStore


class BaseDataSource(AbstractDataSource):
Expand All @@ -50,47 +47,30 @@ def __init__(self, path):
def _p(name):
return os.path.join(path, name)

self._market = Environment.get_instance().config.base.market

if self._market == MARKET.CN:
self._day_bars = [
DayBarStore(_p('stocks.bcolz'), StockBarConverter),
DayBarStore(_p('indexes.bcolz'), IndexBarConverter),
DayBarStore(_p('futures.bcolz'), FutureDayBarConverter),
DayBarStore(_p('funds.bcolz'), FundDayBarConverter),
]

self._instruments = InstrumentStore(_p('instruments.pk'))
self._dividends = DividendStore(_p('original_dividends.bcolz'))
self._trading_dates = TradingDatesStore(_p('trading_dates.bcolz'))
self._yield_curve = YieldCurveStore(_p('yield_curve.bcolz'))
self._split_factor = SimpleFactorStore(_p('split_factor.bcolz'))
self._ex_cum_factor = SimpleFactorStore(_p('ex_cum_factor.bcolz'))

self._st_stock_days = DateSet(_p('st_stock_days.bcolz'))
self._suspend_days = DateSet(_p('suspended_days.bcolz'))

self.get_yield_curve = self._yield_curve.get_yield_curve
self.get_risk_free_rate = self._yield_curve.get_risk_free_rate
if os.path.exists(_p('public_funds.bcolz')):
self._day_bars.append(DayBarStore(_p('public_funds.bcolz'), PublicFundDayBarConverter))
self._public_fund_dividends = DividendStore(_p('public_fund_dividends.bcolz'))
self._non_subscribable_days = DateSet(_p('non_subscribable_days.bcolz'))
self._non_redeemable_days = DateSet(_p('non_redeemable_days.bcolz'))

elif self._market == MARKET.HK:
self._day_bars = [
HkDayBarStore(_p("hk_stocks.bcolz"), HkStockBarConverter)
]
self._instruments = InstrumentStore(_p("hk_instruments.pk"))
self._dividends = HkDividendStore(_p('hk_dividend.bcolz'))
self._trading_dates = TradingDatesStore(_p("hk_trading_dates.bcolz"))
self._yield_curve = HkYieldCurveMocker()
self._split_factor = SimpleFactorStore(_p('hk_split_factor.bcolz'))
self._ex_cum_factor = SimpleFactorStore(_p("hk_ex_cum_factor.bcolz"))
self._suspend_days = DateSet(_p('hk_suspended_days.bcolz'))
else:
raise NotImplementedError
self._day_bars = [
DayBarStore(_p('stocks.bcolz'), StockBarConverter),
DayBarStore(_p('indexes.bcolz'), IndexBarConverter),
DayBarStore(_p('futures.bcolz'), FutureDayBarConverter),
DayBarStore(_p('funds.bcolz'), FundDayBarConverter),
]

self._instruments = InstrumentStore(_p('instruments.pk'))
self._dividends = DividendStore(_p('original_dividends.bcolz'))
self._trading_dates = TradingDatesStore(_p('trading_dates.bcolz'))
self._yield_curve = YieldCurveStore(_p('yield_curve.bcolz'))
self._split_factor = SimpleFactorStore(_p('split_factor.bcolz'))
self._ex_cum_factor = SimpleFactorStore(_p('ex_cum_factor.bcolz'))

self._st_stock_days = DateSet(_p('st_stock_days.bcolz'))
self._suspend_days = DateSet(_p('suspended_days.bcolz'))

self.get_yield_curve = self._yield_curve.get_yield_curve
self.get_risk_free_rate = self._yield_curve.get_risk_free_rate
if os.path.exists(_p('public_funds.bcolz')):
self._day_bars.append(DayBarStore(_p('public_funds.bcolz'), PublicFundDayBarConverter))
self._public_fund_dividends = DividendStore(_p('public_fund_dividends.bcolz'))
self._non_subscribable_days = DateSet(_p('non_subscribable_days.bcolz'))
self._non_redeemable_days = DateSet(_p('non_redeemable_days.bcolz'))

def get_dividend(self, order_book_id, public_fund=False):
if public_fund:
Expand Down Expand Up @@ -214,13 +194,9 @@ def get_split(self, order_book_id):
return self._split_factor.get_factors(order_book_id)

def available_data_range(self, frequency):
if self._market == MARKET.CN:
if frequency in ['tick', '1d']:
s, e = self._day_bars[self.INSTRUMENT_TYPE_MAP['INDX']].get_date_range('000001.XSHG')
return convert_int_to_date(s).date(), convert_int_to_date(e).date()
elif self._market == MARKET.HK:
return self._day_bars[self.INSTRUMENT_TYPE_MAP['CS']].get_available_data_range()
raise NotImplementedError
if frequency in ['tick', '1d']:
s, e = self._day_bars[self.INSTRUMENT_TYPE_MAP['INDX']].get_date_range('000001.XSHG')
return convert_int_to_date(s).date(), convert_int_to_date(e).date()

def get_margin_info(self, instrument):
return {
Expand All @@ -247,15 +223,8 @@ def non_subscribable(self, order_book_id, dates):
def non_redeemable(self, order_book_id, dates):
return self._non_redeemable_days.contains(order_book_id, dates)

HK_STOCK_PRICE_SECTIONS = [0.25, 0.5, 10, 20, 100, 200, 500, 1000, 2000, 5000]
HK_STOCK_TICK_SIZES = [0.001, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5]

def get_tick_size(self, instrument):
if instrument.type == 'CS':
if instrument.exchange == "XHKG":
last_price = Environment.get_instance().get_last_price(instrument.order_book_id)
return self.HK_STOCK_TICK_SIZES[np.searchsorted(self.HK_STOCK_PRICE_SECTIONS, last_price)]
else:
return 0.01
elif instrument.type == "INDX":
return 0.01
Expand Down
10 changes: 1 addition & 9 deletions rqalpha/data/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ def field_type(self, name, dt):

float64 = np.dtype('float64')


StockBarConverter = Converter({
'open': Rule(float64, 1 / 10000.0, 2),
'close': Rule(float64, 1 / 10000.0, 2),
Expand All @@ -55,15 +56,6 @@ def field_type(self, name, dt):
'volume': Rule(float64, 1, 0),
})

HkStockBarConverter = Converter({
'open': Rule(float64, 1 / 10000.0, 3),
'close': Rule(float64, 1 / 10000.0, 3),
'high': Rule(float64, 1 / 10000.0, 3),
'low': Rule(float64, 1 / 10000.0, 3),
'limit_up': Rule(float64, 1/10000.0, 3),
'limit_down': Rule(float64, 1/10000.0, 3),
'volume': Rule(float64, 1, 0),
})

FutureDayBarConverter = Converter({
'open': Rule(float64, 1 / 10000.0, 3),
Expand Down
79 changes: 0 additions & 79 deletions rqalpha/data/hk_data_helper.py

This file was deleted.

6 changes: 0 additions & 6 deletions tests/unittest/test_data/test_base_data_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,6 @@

class BaseDataSourceTestCase(BaseDataSourceFixture, RQAlphaTestCase):
def test_get_tick_size(self):
with self.mock_env_get_last_price(return_value=0.03):
self.assertEqual(self.base_data_source.get_tick_size(mock_instrument(exchange="XHKG")), 0.001)
with self.mock_env_get_last_price(return_value=50):
self.assertEqual(self.base_data_source.get_tick_size(mock_instrument(exchange="XHKG")), 0.05)
with self.mock_env_get_last_price(return_value=9999):
self.assertEqual(self.base_data_source.get_tick_size(mock_instrument(exchange="XHKG")), 5)
self.assertEqual(self.base_data_source.get_tick_size(mock_instrument(exchange="XSHE")), 0.01)
self.assertEqual(self.base_data_source.get_tick_size(mock_instrument(_type="FenjiA")), 0.001)
self.assertEqual(self.base_data_source.get_tick_size(mock_instrument(_type="INDX")), 0.01)
Expand Down

0 comments on commit b31fd71

Please sign in to comment.