Exemple #1
0
 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
Exemple #2
0
 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
Exemple #3
0
 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
Exemple #4
0
 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
Exemple #5
0
 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)
Exemple #6
0
 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
Exemple #7
0
 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
Exemple #8
0
 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
Exemple #9
0
 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)
Exemple #10
0
 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]
Exemple #11
0
 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
Exemple #12
0
 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)
Exemple #13
0
    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()
Exemple #14
0
    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
Exemple #15
0
 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)
Exemple #16
0
 def validate(self, date):
     return TradeTime.is_trade_day(date)
Exemple #17
0
 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
Exemple #18
0
 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
Exemple #19
0
 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