def is_month_start_date(date): if not TradeTime.is_trade_day(date): return False # if find any date before this day is trade day, return False. for i in range(date.day-1): date_i = date - timedelta(i + 1) if TradeTime.is_trade_day(date_i): return False return True
def is_week_end_date(date): if not TradeTime.is_trade_day(date): return False left_days = 4 - date.weekday() # if find any date after this day is trade day, return False. for i in range(left_days): date_i = date + timedelta(i + 1) if TradeTime.is_trade_day(date_i): return False return True
def is_week_start_date(date): if not TradeTime.is_trade_day(date): return False weekday = date.weekday() # if find any date before this day is trade day, return False. for i in range(weekday): date_i = date - timedelta(i+1) if TradeTime.is_trade_day(date_i): return False return True
def is_month_end_date(date): if not TradeTime.is_trade_day(date): return False next_month = date.replace(day=28) + timedelta(days=4) last_date = next_month - timedelta(days=next_month.day) left_days = last_date.day - date.day # if find any date after this day is trade day, return False. for i in range(left_days): date_i = date + timedelta(i + 1) if TradeTime.is_trade_day(date_i): return False return True
def get_following_vix(self, from_date=None, to_date=None): from_date = from_date or TradeTime.get_latest_trade_date( ) - datetime.timedelta(30) to_date = to_date or TradeTime.get_latest_trade_date() #self.logger.info('today=%s, from_date=%s, to_date=%s'%(datetime.datetime.today(), from_date, to_date)) symbols = VIX.get_vix_symbol_list(from_date, to_date, 3) #records_index = self.get_vix_price_by_symbol('VIY00') symbol_dic = {} for symbol in symbols: symbol_dic[symbol] = list_to_hash( self.get_vix_price_by_symbol_and_date(symbol, from_date, to_date)) days = (to_date - from_date).days + 1 records_f1 = [] records_f2 = [] records_f3 = [] for i in range(days): date = from_date + datetime.timedelta(days=i) if TradeTime.is_trade_day(date): symbol_f1 = VIX.get_f1_by_date(date) symbol_f2 = VIX.get_f2_by_date(date) symbol_f3 = VIX.get_f3_by_date(date) records_f1.append( [date, symbol_dic[symbol_f1].get(date), symbol_f1]) records_f2.append( [date, symbol_dic[symbol_f2].get(date), symbol_f2]) records_f3.append( [date, symbol_dic[symbol_f3].get(date), symbol_f3]) # self.logger.info([records_f1[-1], records_f2[-1]], records_f3[-1]]) return (records_f1, records_f2, records_f3)
def get_vix_price_by_symbol(self, symbol, remove_invalid_date=True): query_template = """select dailyDate1dAgo, dailyLastPrice from vix where symbol = '{}' order by dailyDate1dAgo""" query = BaseDAO.mysql_format(query_template, symbol) rows = self.select(query) if remove_invalid_date: rows = filter(lambda x: TradeTime.is_trade_day(x[0]), rows) return rows
def offset_days(current_date, days_offset): count = 0 date = current_date while count < abs(days_offset): if days_offset > 0: date += timedelta(days=1) else: date -= timedelta(days=1) if TradeTime.is_trade_day(date): count += 1 return date
def validate(self, dt): if TradeTime.is_trade_day(dt.date()): if TradeTime.is_half_trade_day(dt.date()) and self.hours * 60 + self.minutes >= 3*60 + 30: return False else: passed_minutes = dt.hour * 60 + dt.minute - (9*60 + 30) if passed_minutes == self.hours * 60 + self.minutes: return True else: return False return False
def clear_invalid_date_records(self): query = """select distinct TradeDate from yahoo_equity""" remove_invalid_query_template = """delete from yahoo_equity where TradeDate = '{}'""" rows = self.select(query) dates = map(lambda x: x[0], rows) for date in dates: if not TradeTime.is_trade_day(date): query = remove_invalid_query_template.format(date) print date print query self.execute_query(query)
def get_date_values(self): expiration_date = self.get_expiration_date() latest_date = min(TradeTime.get_latest_trade_date(), expiration_date) days = (latest_date - self.start_date).days for i in range(days + 1): date = self.start_date + datetime.timedelta(days=i) if TradeTime.is_trade_day(date): value = DataProvider.get_price_by_date(self.option_symbol, date) #print 'date=%s,value=%s'%(date,value) if value is not None: if self.long_short.lower() == 'short': value = -value yield [date, self.quantity * value]
def get_vix_price_by_symbol_and_date(self, symbol, from_date=datetime.datetime( 1993, 1, 1), to_date=None, remove_invalid_date=True): to_date = to_date or TradeTime.get_latest_trade_date() query_template = """select dailyDate1dAgo, dailyLastPrice from vix where symbol = '{}' and dailyDate1dAgo >= str_to_date('{}', '%Y-%m-%d') and dailyDate1dAgo <= str_to_date('{}', '%Y-%m-%d') order by dailyDate1dAgo""" query = BaseDAO.mysql_format(query_template, symbol, from_date.strftime('%Y-%m-%d'), to_date.strftime('%Y-%m-%d')) rows = self.select(query) if remove_invalid_date: rows = filter(lambda x: TradeTime.is_trade_day(x[0]), rows) return rows
def add_missing_data_in_real_time( self, symbol='SVXY', ): us_dt = datetime.datetime.now(tz=pytz.timezone('US/Eastern')) now = datetime.datetime(us_dt.year, us_dt.month, us_dt.day, us_dt.hour, us_dt.minute, us_dt.second) if TradeTime.is_trade_day(now.date()): default_start_time = datetime.datetime(now.year, now.month, now.day, 9, 30, 0) start_time = max( default_start_time, datetime.datetime(now.year, now.month, now.day, now.hour - 1, now.minute, 0)) if now > start_time: if TradeTime.is_half_trade_day(now.date()): default_end_time = datetime.datetime( now.year, now.month, now.day, 13, 0, 0) else: default_end_time = datetime.datetime( now.year, now.month, now.day, 16, 0, 0) end_time = min(now, default_end_time) if end_time > start_time: minutes_count = range((end_time - start_time).seconds / 60 + 1) trade_minutes = map( lambda x: start_time + datetime.timedelta(minutes=x), minutes_count) # print trade_minutes rows = self.get_time_and_price(symbol, start_time, end_time) # print rows j = 0 missing_records = [] for i, time in enumerate(trade_minutes): if rows[j][0] > time: if j > 0: price = rows[j - 1][1] else: price = rows[0][1] missing_records.append( Equity(symbol, time, price, price, price, price, 0, 0)) else: j = j + 1 if len(missing_records) > 0: self.insert(missing_records) return len(missing_records)
def insert(self, symbol, df): query_template = """insert into yahoo_equity (symbol,tradeDate,openPrice,highPrice,lowPrice,closePrice,adjClosePrice,volume) values ('{}','{}',{},{},{},{},{},{})""" conn = BaseDAO.get_connection() cursor = conn.cursor() for index, row in df.iterrows(): if TradeTime.is_trade_day( datetime.datetime.strptime(row['Date'], '%Y-%m-%d')): query = BaseDAO.mysql_format(query_template, symbol, row['Date'], row['Open'], row['High'], row['Low'], row['Close'], row['Adj Close'], row['Volume']) self.execute_query(query, cursor) conn.commit() conn.close()
def validate(self, dt): if TradeTime.is_trade_day(dt.date()): if TradeTime.is_half_trade_day(dt.date()): if self.hours * 60 + self.minutes >= 3.5 * 60: return False else: left_minutes = 13 * 60 - (dt.hour * 60 + dt.minute) if left_minutes == self.hours * 60 + self.minutes: return True else: return False else: left_minutes = 16 * 60 - (dt.hour * 60 + dt.minute) if left_minutes == self.hours * 60 + self.minutes: return True else: return False return False
def add_missing_data_in_real_time(self, symbol='SVXY', ): us_dt = datetime.datetime.now(tz=pytz.timezone('US/Eastern')) now = datetime.datetime(us_dt.year, us_dt.month, us_dt.day, us_dt.hour, us_dt.minute, us_dt.second) if TradeTime.is_trade_day(now.date()): default_start_time = datetime.datetime(now.year, now.month, now.day, 9, 30, 0) start_time = max(default_start_time, datetime.datetime(now.year, now.month, now.day, now.hour-1, now.minute, 0)) if now > start_time: if TradeTime.is_half_trade_day(now.date()): default_end_time = datetime.datetime(now.year, now.month, now.day, 13, 0, 0) else: default_end_time = datetime.datetime(now.year, now.month, now.day, 16, 0, 0) end_time = min(now, default_end_time) if end_time > start_time: minutes_count = range((end_time - start_time).seconds/60 + 1) trade_minutes = map(lambda x: start_time + datetime.timedelta(minutes=x), minutes_count) # print trade_minutes rows = self.get_min_time_and_price(symbol, start_time, end_time) # print rows j = 0 missing_records = [] # self.logger.info('rows = %s, \n trade_minutes = %s' %(rows[-2:], trade_minutes[-2:])) for i, time in enumerate(trade_minutes): if j >= len(rows): break # rows length may less than trade_minutes for 1 elements. if rows[j][0].minute > time.minute or rows[j][0].hour > time.hour: if j > 0: # price = rows[j-1][1] price = self.get_nearest_price(time, symbol) else: price = rows[0][1] # self.logger.info('missing record: j = %s, time=%s'%(j, time)) missing_records.append((symbol, time, price)) else: j = j + 1 if len(missing_records) > 0: for record in missing_records: self.insert(*record) return len(missing_records)
def validate(self, date): return TradeTime.is_trade_day(date)
def validate(self, date): if TradeTime.is_trade_day(date): week_end_date = DateRule.offset_days(date, self.days_offset) return self.is_week_end_date(week_end_date) else: return False
def validate(self, date): if TradeTime.is_trade_day(date): month_end_date = DateRule.offset_days(date, self.days_offset) return MonthEndRule.is_month_end_date(month_end_date) else: return False
def validate(self, date): if TradeTime.is_trade_day(date): month_start_date = DateRule.offset_days(date, -self.days_offset) return MonthStartRule.is_month_start_date(month_start_date) else: return False