def dateseris(mindate, maxdate): date = timedelta(mindate, 0) series = [] while maxdate >= date: series.append(date) date = timedelta(date, 1) return series
def getTime(self): """ 获取最小起始日期和min{最大交割日日期,当前日期} """ post = postgersql() colname = ['trade_date','delivery_date','currency_pair','dates'] sql = """select op.trade_date,op.delivery_date,op.currency_pair, case when t.dates<op.delivery_date then date(t.dates)+1 when t.dates=op.delivery_date then current_date end as dates from %s op left join (select max(pt.date) as dates,pt.der_id from %s pt group by pt.der_id) t on op.trade_type||'_'||op.id = t.der_id """%(self.table,self.querytable) time = post.view(sql,colname) if time==[] or time==None: self.begintime = None self.endtime = None else: time = filter(lambda x:x['currency_pair'] in getrate() and dateTostr(x['delivery_date'])>=getrate()[x['currency_pair']],time) #print len(time) for lst in time: if lst['dates'] is None: lst['dates'] = dateTostr(lst['trade_date']) if dateTostr(lst['trade_date'])>getrate()[lst['currency_pair']] else getrate()[lst['currency_pair']] else: lst['dates'] = dateTostr(lst['dates']) begintime = time[0]['dates'] if len(time)==1 else min(map(lambda x:x['dates'],time)) self.begintime = begintime if getNow('%Y-%m-%d')>=begintime else None endtime = dateTostr(time[0]['delivery_date'] if len(time)==1 else max(map(lambda x:x['delivery_date'],time))) self.endtime = endtime if getNow('%Y-%m-%d')>endtime else timedelta(getNow('%Y-%m-%d'),-1)
def getday(self, Time=None): """ 获取某一天的拆借利率值 """ Time2 = timedelta(Time, -100) ##查找最近20天的拆借利率,如果找不到就以0填充 data = self.__mongo.select( 'KPI', { 'index': self.code, 'datadate': { '$lte': Time, '$gte': Time2 }, 'ratetype': self.ratetype }) if data != []: data = data[-1] try: rate = float(data['rate']) self.__mongo.close() return rate except: return 0.0 #print '查找不到所需数据,那么其拆借利率以0填充' self.__mongo.close() return 0.0
def do_all(self): """ 执行所有历史数据 """ self.getTime() if self.begintime and self.endtime is not None: Now = self.begintime while (Now >= self.begintime and Now <= self.endtime): self.Now = strTostr(Now) CollaOptions_oneday(self.Lock, self.Now) Now = timedelta(Now, 1)
def getdayMax(self,Time=None): """ 获取某一天汇率最大值 """ key={'code':True} Time_end = strTostr(timedelta(Time,17.0/24))##当天时间下午5点 Time = strTostr(Time) initial ={'Close':0,'Time':Time} reduces = """function(doc,prev){ if (prev.Time<doc.Time){ prev.Close = doc.Close/1.0/doc.PriceWeight; prev.Time = doc.Time }}"""##遍历寻找当前最大汇率值 condition={'type':'0','code':self.code,'Time':{'$lt':Time_end,'$gte':Time}} data = self.__mongo.group('kline',key,condition,initial,reduces) self.__mongo.close() return data
def getday(self, Time=None): """ 获取某一天汇率 """ Time1 = Time + ' 00:00:00' Time2 = timedelta(Time, -100) + ' 00:00:00' data = self.__mongo.select('kline', { 'type': '5', 'code': self.code, 'Time': { '$gte': Time2, '$lte': Time1 } }) if data == []: return [] else: data = data[0] return data.get('Close') / 1.0 / data.get('PriceWeight') return None
def getdayMax(self, Time=None): """ 获取某一天汇率最大值 """ '''key={'code':True} Time_end = strTostr(timedelta(Time,17.0/24))##当天时间下午5点 Time = strTostr(Time) initial ={'Close':0,'Time':Time} reduces = """function(doc,prev){ if (prev.Time<doc.Time){ prev.Close = doc.Close/1.0/doc.PriceWeight; prev.Time = doc.Time }}"""##遍历寻找当前最大汇率值 condition={'type':'0','code':self.code,'Time':{'$lt':Time_end,'$gte':Time}} data = self.__mongo.group('kline',key,condition,initial,reduces) self.__mongo.close()''' Time1 = Time + ' 00:00:00' Time2 = timedelta(Time, -100) + ' 00:00:00' data = self.__mongo.select('kline', { 'type': '5', 'code': self.code, 'Time': { '$gte': Time2, '$lte': Time1 } }) if data == []: return [] else: data = data[0] return data.get('High') / 1.0 / data.get('PriceWeight') return None
def getDataFromMongo(self): """ from mongo get the currency_pairs and bank_rate """ trfdata = {} if self.data != []: S = {} ##货币对最新汇率 spot = {} Time = dateTostr(self.Now) #mongo = mongodb() for lst in self.data: ##获取厘定日汇率,未到立定日,以None填充 code = lst.get('currency_pair') date = lst.get('determined_date').strftime('%Y-%m-%d') #determined_date_rate = getkline(code,date,self.mongo)##获取厘定日汇率 if Time < date: determined_date_rate = None else: determined_date_rate = getkline(code, date, self.mongo) ##获取厘定日汇率 #SetRate = RateExchange(currency_pair).getdayMax(Setdate)##厘定日汇率 lst.update({'determined_date_rate': determined_date_rate}) sell_currency = lst['currency_pair'][:3] buy_currency = lst['currency_pair'][3:] #ratetype = getRate((lst['delivery_date'] -lst['trade_date']).days) ratetype = '12月' #SellRate,BuyRate = getcurrentbankrate(sell_currency,buy_currency,ratetype) SellRate, BuyRate = gethistorybankrate(sell_currency, buy_currency, ratetype, Time) ##获取银行历史拆借利率 if S.get(code) is None: for i in range(100): RE = RateExchange(code).getdayMax(Time) if RE is not None and RE != []: S[code] = RE break Time = timedelta(Time, -1) #RE = RateExchange(code).getMax() #if RE is not None and RE !=[]: #S[code] = RE[0].get('Close')##获取实时汇率 #if sell_currency+buy_currency!=code: # BuyRate,SellRate=SellRate,BuyRate##判断卖出买入货币与汇率对的对应情况 if spot.get(code) is None: dayspot = getdayspot(code, self.mongo) dayspot = datafill(dayspot) spot[code] = dayspot sell_amount = np.float64(lst['sell_amount']) buy_amount = np.float64(lst['buy_amount']) if lst['type'] == u'1': amount = buy_amount currency = lst['buy_currency'] elif lst['type'] == u'2': amount = sell_amount currency = lst['sell_currency'] elif lst['type'] == u'3': if lst['sell_currency'] == 'USD': amount = buy_amount currency = lst['buy_currency'] else: amount = sell_amount currency = lst['sell_currency'] else: amount = None ##其他交易类型,暂时无法计算 currency = None if trfdata.get(lst['trade_id']) is None: try: lags = getLags(self.data, lst['trade_id']) except: continue trfdata[lst['trade_id']] = { 'orderlist': [], 'spotList': lagdata(spot[code], lags), ##lags时间段收益时间序列 'S': S[code], ##实时汇率 'SellRate': SellRate, ##卖出货币拆解利率 'BuyRate': BuyRate, ##买入货币拆解利率 'K': float(lst.get('rate')), ##锁定汇率 'TIV': float(lst.get('trp')), ##目标收益 'lags': lags, ##每期时间间隔 'Now': self.Now, ##损益计算时间 'amount': amount, ##本金 'consign_entity': lst['consign_entity'], 'trade_type': lst['trade_type'], 'id': lst['id'], 'currency': currency } trfdata[lst['trade_id']]['orderlist'].append(lst) self.trfdata = trfdata