1717
1818import re
1919import copy
20- import datetime
21- import inspect
20+ from datetime import datetime , time , date
2221from typing import Dict , Callable , Optional
2322from methodtools import lru_cache
2423
3433
3534# TODO:改为 namedtuple,提升性能
3635class Instrument (metaclass = PropertyReprMeta ):
37- DEFAULT_DE_LISTED_DATE = datetime . datetime (2999 , 12 , 31 )
36+ DEFAULT_DE_LISTED_DATE = datetime (2999 , 12 , 31 )
3837
3938 @staticmethod
40- def _fix_date (ds , dflt = None ) -> Optional [datetime . datetime ]:
41- if isinstance (ds , datetime . datetime ):
39+ def _fix_date (ds , dflt = None ) -> Optional [datetime ]:
40+ if isinstance (ds , datetime ):
4241 return ds
4342 if ds == '0000-00-00' or ds is None :
4443 return dflt
4544 try :
4645 year , month , day = ds .split ('-' )
47- return datetime . datetime (int (year ), int (month ), int (day ))
46+ return datetime (int (year ), int (month ), int (day ))
4847 except :
4948 return parse (ds )
5049
@@ -92,15 +91,14 @@ def round_lot(self) -> int:
9291 return int (self ._dict ["round_lot" ])
9392
9493 @cached_property
95- def listed_date (self ) -> Optional [ datetime . datetime ] :
94+ def listed_date (self ) -> datetime :
9695 """
9796 [datetime] 股票:该证券上市日期。期货:期货的上市日期,主力连续合约与指数连续合约都为 datetime(1990, 1, 1)。
9897 """
9998 return self ._dict ["listed_date" ]
10099
101100 @cached_property
102- def de_listed_date (self ):
103- # type: () -> datetime.datetime
101+ def de_listed_date (self ) -> datetime :
104102 """
105103 [datetime] 股票:退市日期。期货:交割日期。
106104 """
@@ -262,7 +260,7 @@ def underlying_symbol(self):
262260
263261 @cached_property
264262 def maturity_date (self ):
265- # type: () -> datetime.datetime
263+ # type: () -> datetime
266264 """
267265 [datetime] 到期日
268266 """
@@ -316,36 +314,30 @@ def account_type(self):
316314 else :
317315 raise NotImplementedError
318316
319- def listing_at (self , dt ) :
317+ def listing_at (self , dt : datetime ) -> bool :
320318 """
321319 该合约在指定日期是否在交易
322- :param dt: datetime.datetime
323- :return: bool
324320 """
325321 return self .listed_at (dt ) and not self .de_listed_at (dt )
326322
327- def listed_at (self , dt ) :
323+ def listed_at (self , dt : datetime ) -> bool :
328324 """
329325 该合约在指定日期是否已上市
330- :param dt: datetime.datetime
331- :return: bool
332326 """
333- return self .listed_date and self . listed_date <= dt
327+ return self .listed_date <= dt
334328
335- def de_listed_at (self , dt ) :
329+ def de_listed_at (self , dt : datetime ) -> bool :
336330 """
337331 该合约在指定日期是否已退市
338- :param dt: datetime.datetime
339- :return: bool
340332 """
341333 if self .type in (INSTRUMENT_TYPE .FUTURE , INSTRUMENT_TYPE .OPTION ):
342334 return dt .date () > self .de_listed_date .date ()
343335 else :
344336 return dt >= self .de_listed_date
345337
346338 STOCK_TRADING_PERIOD = [
347- TimeRange (start = datetime . time (9 , 31 ), end = datetime . time (11 , 30 )),
348- TimeRange (start = datetime . time (13 , 1 ), end = datetime . time (15 , 0 )),
339+ TimeRange (start = time (9 , 31 ), end = time (11 , 30 )),
340+ TimeRange (start = time (13 , 1 ), end = time (15 , 0 )),
349341 ]
350342
351343 @cached_property
@@ -361,16 +353,16 @@ def trading_hours(self):
361353 trading_hours = trading_hours .replace ("-" , ":" )
362354 for time_range_str in trading_hours .split ("," ):
363355 start_h , start_m , end_h , end_m = (int (i ) for i in time_range_str .split (":" ))
364- start , end = datetime . time (start_h , start_m ), datetime . time (end_h , end_m )
356+ start , end = time (start_h , start_m ), time (end_h , end_m )
365357 if start > end :
366- trading_period .append (TimeRange (start , datetime . time (23 , 59 )))
367- trading_period .append (TimeRange (datetime . time (0 , 0 ), end ))
358+ trading_period .append (TimeRange (start , time (23 , 59 )))
359+ trading_period .append (TimeRange (time (0 , 0 ), end ))
368360 else :
369361 trading_period .append (TimeRange (start , end ))
370362 return trading_period
371363
372364 def during_continuous_auction (self , time ):
373- # type: (datetime. time) -> bool
365+ # type: (time) -> bool
374366 """ 是否处于连续竞价时间段内 """
375367 for time_range in self .trading_hours :
376368 if time_range .start <= time <= time_range .end :
@@ -389,7 +381,7 @@ def trading_code(self):
389381
390382 @cached_property
391383 def trade_at_night (self ):
392- return any (r .start <= datetime . time (4 , 0 ) or r .end >= datetime . time (19 , 0 ) for r in (self .trading_hours or []))
384+ return any (r .start <= time (4 , 0 ) or r .end >= time (19 , 0 ) for r in (self .trading_hours or []))
393385
394386 @cached_property
395387 def min_order_quantity (self ):
@@ -455,21 +447,21 @@ def tick_size(self):
455447 raise NotImplementedError
456448
457449 @lru_cache (8 )
458- def get_long_margin_ratio (self , dt : datetime . date ) -> float :
450+ def get_long_margin_ratio (self , dt : date ) -> float :
459451 """
460452 获取多头保证金率(期货专用)
461453 """
462454 return Environment .get_instance ().data_proxy .get_futures_trading_parameters (self .order_book_id , dt ).long_margin_ratio
463455
464456 @lru_cache (8 )
465- def get_short_margin_ratio (self , dt : datetime . date ) -> float :
457+ def get_short_margin_ratio (self , dt : date ) -> float :
466458 """
467459 获取空头保证金率(期货专用)
468460 """
469461 return Environment .get_instance ().data_proxy .get_futures_trading_parameters (self .order_book_id , dt ).short_margin_ratio
470462
471463 def calc_cash_occupation (self , price , quantity , direction , dt ):
472- # type: (float, int, POSITION_DIRECTION, datetime. date) -> float
464+ # type: (float, int, POSITION_DIRECTION, date) -> float
473465 if self .market != MARKET .CN :
474466 exchagne_rate = Environment .get_instance ().data_proxy .get_exchange_rate (dt , self .market )
475467 price = price * exchagne_rate .ask_reference
0 commit comments