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 cumputeLost(self): """ """ Time = dateTostr(self.Now) Lost = [] self.forwarddict = [] for trade_id in self.trfdata: spotList = self.trfdata[trade_id]['spotList'] orderlist = self.trfdata[trade_id]['orderlist'] S = self.trfdata[trade_id]['S'] K = self.trfdata[trade_id]['K'] SellRate = self.trfdata[trade_id]['SellRate'] BuyRate = self.trfdata[trade_id]['BuyRate'] Now = self.trfdata[trade_id]['Now'] lags = self.trfdata[trade_id]['lags'] TIV = self.trfdata[trade_id]['TIV'] amount = self.trfdata[trade_id]['amount'] #print 'knockoptions',lst['id'],currency_pair,dateTostr(lst['trade_date']),deliverydate, TRF = TargetRedemptionForward(spotList, orderlist, S, K, SellRate, BuyRate, lags, Now, TIV) ##计算损益值 gal = 0 for lst in TRF: lst['price'] = ( lst['price'] * amount) if lst['price'] is not None else lst['price'] gal += lst['price'] if TRF is not None: Lost.extend(TRF) """ 'date','com_code','der_id','cap_currency','cap_amount','gal','exrate','data_date': 日期,公司代码,衍生品编号,本金币种,本金金额,汇兑损益,当天的本金/人民币汇率,数据生成日期 """ forwarddict = {} forwarddict['date'] = Time forwarddict['com_code'] = self.trfdata[trade_id]['consign_entity'] forwarddict['der_id'] = self.trfdata[trade_id][ 'trade_type'] + '_' + str(self.trfdata[trade_id]['id']) forwarddict['gal'] = gal forwarddict['cap_amount'] = amount forwarddict['cap_currency'] = self.trfdata[trade_id]['currency'] currencypair = forwarddict['cap_currency'] + 'CNY' forwarddict['exrate'] = gethistoryrate( [currencypair], Time)[currencypair] if currencypair != 'CNYCNY' else 1.0 forwarddict['data_date'] = getNow('%Y-%m-%d %H:%M:%S') logs('compute', 'targetforwards', 'cumputeLost', forwarddict, infoFalg=True) self.forwarddict.append(forwarddict) self.updateData()
def getDataFromPostgres(self): """ 获取结构性产品的订单数据 """ post = postgersql() colname = [ 'id', 'trade_id', 'currency_pair', 'sell_currency', 'buy_currency', 'sell_amount', 'buy_amount', 'trade_date', 'determined_date', 'delivery_date', 'trp', 'rate', 'type', 'consign_entity', 'trade_type' ] #wherestring = None #orderby = "order by trade_id, delivery_date" #Now = getNow('%Y-%m-%d') Now = dateTostr(self.Now) sql = """select %s from %s t join (select trade_id from %s group by trade_id having max(delivery_date)>=date'%s' ) b on t.trade_id=b.trade_id order by t.trade_id, t.delivery_date """ % (','.join(map(lambda x: 't.' + x, colname)), self.table, self.table, Now) ##过滤已交割完成的结构产品 #self.data = post.view(sql,colname) optiondata = post.view(sql, colname) optiondata = filter( lambda x: x['currency_pair'] in getrate() and Now >= getrate()[x[ 'currency_pair']], optiondata) colname2 = ['der_id'] wherestring2 = """date='{}'""".format(Now) savedata = map(lambda x: x['der_id'], post.select(self.writetable, colname2, wherestring2)) data = [] for lst in optiondata: if lst['trade_type'] + '_' + str(lst['id']) not in savedata: data.append(lst) if data is not None and data != []: self.data = data self.getDataFromMongo() ##从mongo提取数据并更新损益 self.cumputeLost()
def getDataFromMongo(self): """ from mongo get the currency_pairs and bank_rate """ ## currency_pairs currency_pairs = list(set(map(lambda x: x['currency_pair'], self.data))) Time = self.Now.split()[0] #currency_dict = getcurrentrate(currency_pairs) currency_dict = gethistoryrate(currency_pairs, Time) ##bank_rate self.forwarddict = [] for lst in self.data: forwarddict = {} sell_currency = lst['currency_pair'][:3] buy_currency = lst['currency_pair'][3:] currency_pair = lst['currency_pair'] #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) ##获取银行历史拆借利率 #sell_amount = float64(lst['sell_amount']) #buy_amount = float64(lst['buy_amount']) ##获取厘定日的汇率,如果还未到厘定日,那么汇率返回None Setdate = dateTostr(lst['determined_date']) ##厘定日 if Setdate is None: Setdate = dateTostr(lst['delivery_date']) if Time < Setdate: SetRate = None else: SetRate = RateExchange(currency_pair).getdayMax( Setdate) ##厘定日汇率 #SetRate = RateExchange(currency_pair).getdayMax(Setdate)##厘定日汇率 if SetRate == []: SetRate = None ## 还未到厘定日 ## 执行汇率上下限 strikeLowerRate = float64(lst['exe_doexrate']) strikeUpperRate = float64(lst['exe_upexrate']) currentRate = currency_dict.get(currency_pair) if currentRate is None: print "{ } not Fund!\n".format(currency_pair) continue deliverydate = dateTostr(lst['delivery_date']) #print 'CollaOptions',lst['id'],currency_pair,dateTostr(lst['trade_date']),deliverydate, temp = self.cumputeLost(Setdate, SetRate, deliverydate, strikeLowerRate, strikeUpperRate, currentRate, SellRate, BuyRate, self.delta) #if forwarddict[lst['id']] is not None: ## 计算本金损益 #forwarddict[lst['id']] = chooselocalmoney(lst,forwarddict[lst['id']]) """ 'date','com_code','der_id','cap_currency','cap_amount','gal','exrate','data_date': 日期,公司代码,衍生品编号,本金币种,本金金额,汇兑损益,当天的本金/人民币汇率,数据生成日期 """ if temp is not None: forwarddict['gal'], forwarddict['cap_amount'], forwarddict[ 'cap_currency'] = chooselocalmoney(lst, temp) forwarddict['date'] = Time forwarddict['com_code'] = lst['consign_entity'] forwarddict['der_id'] = lst['trade_type'] + '_' + str(lst['id']) currencypair = forwarddict['cap_currency'] + 'CNY' forwarddict['exrate'] = gethistoryrate( [currencypair], Time)[currencypair] if currencypair != 'CNYCNY' else 1.0 forwarddict['data_date'] = getNow('%Y-%m-%d %H:%M:%S') logs('compute', 'CollaOptions', 'getDataFromMongo', forwarddict, infoFalg=True) self.forwarddict.append(forwarddict) #self.forwarddict = forwarddict self.updateData()
def getDataFromMongo(self): """ from mongo get the currency_pairs and bank_rate #卖出币种如果是人民币(CNY/CNH),那么买入币种是本金,否则就是卖出币种 """ ## currency_pairs ##--------------------获取汇率对的实时汇率 currency_pairs = list(set(map(lambda x: x['currency_pair'], self.data))) Time = self.Now.split()[0] #currency_dict = getcurrentrate(currency_pairs) currency_dict = gethistoryrate(currency_pairs, Time) ##--------------------获取汇率对的历史汇率 self.forwarddict = [] for lst in self.data: ## forwarddict = {} sell_currency = lst['currency_pair'][:3] buy_currency = lst['currency_pair'][3:] currency_pair = lst['currency_pair'] #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) ##获取银行历史拆借利率 LockedRate = float(lst['rate']) ##锁定汇率 currentRate = currency_dict.get(currency_pair) ##即期实时汇率 if currentRate is None: print "{} not fund!\n".format(currency_pair) continue deliverydate = dateTostr(lst['delivery_date']) ##交割日期 #print 'forwards',lst['id'],currency_pair,dateTostr(lst['trade_date']),deliverydate, temp = self.cumputeLost(SellRate, BuyRate, deliverydate, LockedRate, currentRate) #print temp ## 计算本金损益 #if forwarddict[lst['id']] is not None: #forwarddict[lst['id']] = chooselocalmoney(lst,forwarddict[lst['id']]) """ 'date','com_code','der_id','cap_currency','cap_amount','gal','exrate','data_date': 日期,公司代码,衍生品编号,本金币种,本金金额,汇兑损益,当天的本金/人民币汇率,数据生成日期 """ if temp is not None: forwarddict['gal'], forwarddict['cap_amount'], forwarddict[ 'cap_currency'] = chooselocalmoney(lst, temp) forwarddict['date'] = Time forwarddict['com_code'] = lst['consign_entity'] forwarddict['der_id'] = lst['trade_type'] + '_' + str(lst['id']) currencypair = forwarddict['cap_currency'] + 'CNY' forwarddict['exrate'] = gethistoryrate( [currencypair], Time)[currencypair] if currencypair != 'CNYCNY' else 1.0 forwarddict['data_date'] = getNow('%Y-%m-%d %H:%M:%S') logs('compute', 'forwards', 'getDataFromMongo', forwarddict, infoFalg=True) #forwarddict[lst['consign_entity']] self.forwarddict.append(forwarddict) #self.forwarddict = forwarddict self.updateData()
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
def getDataFromMongo(self): """ from mongo get the currency_pairs and bank_rate """ ## currency_pairs currency_pairs = list(set(map(lambda x: x['currency_pair'], self.data))) Time = self.Now.split()[0] #currency_dict = getcurrentrate(currency_pairs) currency_dict = gethistoryrate(currency_pairs, Time) ##--------------------获取汇率对的历史汇率 ##bank_rate self.forwarddict = [] for lst in self.data: forwarddict = {} sell_currency = lst['currency_pair'][:3] buy_currency = lst['currency_pair'][3:] currency_pair = lst['currency_pair'] #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) ##获取银行历史拆借利率 #sell_amount = float64(lst['sell_amount']) #buy_amount = float64(lst['buy_amount']) Setdate = dateTostr(lst['determined_date']) if Time < Setdate: SetRate = None else: SetRate = RateExchange(currency_pair).getdayMax( Setdate) ##厘定日汇率 #SetRate = RateExchange(currency_pair).getdayMax(Setdate)##厘定日汇率 kncockRate = float64(lst['knockout_exrate']) ##敲出汇率 LockedRate = float(lst['rate']) currentRate = currency_dict[currency_pair] deliverydate = dateTostr(lst['delivery_date']) #print 'knockoptions',lst['id'],currency_pair,dateTostr(lst['trade_date']),deliverydate, type = lst['type'] temp = self.cumputeLost(Setdate, SetRate, deliverydate, currentRate, LockedRate, kncockRate, SellRate, BuyRate, self.delta, type) #print temp #print '\n' ## 计算本金损益 #if forwarddict[lst['id']] is not None: #forwarddict[lst['id']] = chooselocalmoney(lst,forwarddict[lst['id']]) """ 'date','com_code','der_id','cap_currency','cap_amount','gal','exrate','data_date': 日期,公司代码,衍生品编号,本金币种,本金金额,汇兑损益,当天的本金/人民币汇率,数据生成日期 """ if temp is not None: forwarddict['gal'], forwarddict['cap_amount'], forwarddict[ 'cap_currency'] = chooselocalmoney(lst, temp) forwarddict['date'] = Time forwarddict['com_code'] = lst['consign_entity'] forwarddict['der_id'] = lst['trade_type'] + '_' + str(lst['id']) currencypair = forwarddict['cap_currency'] + 'CNY' forwarddict['exrate'] = gethistoryrate( [currencypair], Time)[currencypair] if currencypair != 'CNYCNY' else 1.0 forwarddict['data_date'] = getNow('%Y-%m-%d %H:%M:%S') logs('compute', 'knockoptions', 'getDataFromMongo', forwarddict, infoFalg=True) self.forwarddict.append(forwarddict) #self.forwarddict = forwarddict self.updateData()
def getDataFromMongo(self): """ from mongo get the currency_pairs and bank_rate """ ## currency_pairs currency_pairs = list(set(map(lambda x:x['currency_pair'],self.data))) Time = self.Now.split()[0] #currency_dict = getcurrentrate(currency_pairs) currency_dict = gethistoryrate(currency_pairs,Time) ##bank_rate self.forwarddict = [] for lst in self.data: forwarddict= {} ##交易本币与外币 ##支付固定利率 #print '计算订单{}\n'.format(lst) payFixRate = None if lst['pay_fix_rate'] is None else float64(lst['pay_fix_rate']) ##支付固定利率 chargeFixRate = None if lst['charge_fix_rate'] is None else float64(lst['charge_fix_rate'])##收取浮动利息固定部分 value_date = dateTostr(lst['value_date']) delivery_date = dateTostr(lst['delivery_date']) trade_date = dateTostr(lst['trade_date']) #print lst['id'] if lst['interest_pay_way'] == '3': ##到期一次性支付 br = BankRate(lst['buy_currency'],interestway(lst['interest_pay_way'],lst['charge_float_libor'])) if delivery_date> Time: date = {dateTostr(lst['delivery_date']):br.getday(Time)} else: date = {dateTostr(lst['delivery_date']):br.getday(delivery_date)} elif lst['interest_pay_way']== '0' or lst['trade_type']=='4': ##提前支付 br = BankRate(lst['buy_currency'],interestway(lst['interest_pay_way'],lst['charge_float_libor'])) if (lst['trade_date'] - lst['value_date']).days>180: date = {dateTostr(lst['delivery_date']):br.getday(trade_date)}## value_date trade_date else: date = {dateTostr(lst['delivery_date']):br.getday(value_date)}## value_date trade_date else: #print lst if (lst['trade_date'] - lst['value_date']).days>180: date = getbankrateoneday(lst['buy_currency'],trade_date,delivery_date,lst['interest_pay_way'],lst['charge_float_libor'],Time) else: date = getbankrateoneday(lst['buy_currency'],value_date,delivery_date,lst['interest_pay_way'],lst['charge_float_libor'],Time) #payFixRateDict = {} if chargeFixRate is None: chargeFixRate=0.0 for t in date: date[t] = date[t]/100.0+chargeFixRate##货币浮动利率及支付利息时间 Fix = array(sorted(date.items(),key=lambda x:x[0])) FixDate = Fix[:,0] FixRate = Fix[:,1][:] FixRate = FixRate.astype(float64) Rate = (FixDate,payFixRate,FixRate)##利息支付日期,支付卖出货币利息,收取浮动利率利息 currency_pair = lst['currency_pair'] ##货币对之间本币与外币 sellCurrency = currency_pair[:3] buyCurrency = currency_pair[3:] ratetype ='12月' #SellRate,BuyRate = getcurrentbankrate(sellCurrency,buyCurrency,ratetype) SellRate,BuyRate = gethistorybankrate(sellCurrency,buyCurrency,ratetype,Time)##获取银行历史拆借利率 LockedRate = float64(lst['exe_exrate'])##执行汇率 capped_exrate = None if lst['capped_exrate'] is None else float64(lst['capped_exrate']) ##封顶汇率 ##获取厘定日汇率 ##获取厘定日的汇率,如果还未到厘定日,那么汇率返回None Setdate = dateTostr(lst['determined_date'])##厘定日 if Time<Setdate: SetRate = None else: SetRate = RateExchange(currency_pair).getdayMax(Setdate)##厘定日汇率 #SetRate = RateExchange(currency_pair).getdayMax(Setdate)##厘定日汇率 if SetRate ==[]: SetRate = None## 还未到厘定日 currentRate = currency_dict.get(currency_pair) ## 实时汇率 if currentRate is None: print "{} not fund!".format(currency_pair) continue #deliverydate = dateTostr(lst['delivery_date'])## 交割日期 trade_type = lst['trade_type']##交易类型 rateway = lst['interest_pay_way']##利息支付方式 #sell_amount = float64(lst['sell_amount']) #buy_amount = float64(lst['buy_amount']) #2,3,4分别表示:区间式货币掉期(利率进行互换+固定补贴)、货币掉期(利率互换)、封顶式期权(固定补贴) #print 'SwapOptions', lst['id'],currency_pair,rateway,'区间式货币掉期' if trade_type=='2' else ('货币掉期' if trade_type=='3' else '封顶式期权'),value_date,delivery_date, temp = self.cumputeLost(Setdate,SetRate,value_date,delivery_date,currentRate,SellRate,BuyRate,LockedRate,rateway,self.delta,capped_exrate,trade_type,Rate) #if sell_currency+buy_currency !=currency_pair: # forwarddict[lst['id']] = forwarddict[lst['id']]/currentRate #if forwarddict[lst['id']] is not None: #forwarddict[lst['id']] = chooselocalmoney(lst,forwarddict[lst['id']]) """ 'date','com_code','der_id','cap_currency','cap_amount','gal','exrate','data_date': 日期,公司代码,衍生品编号,本金币种,本金金额,汇兑损益,当天的本金/人民币汇率,数据生成日期 """ if temp is not None: forwarddict['gal'],forwarddict['cap_amount'],forwarddict['cap_currency'] = chooselocalmoney(lst,temp) forwarddict['date'] = Time forwarddict['com_code'] = lst['consign_entity'] forwarddict['der_id'] = lst['trade_type']+'_'+str(lst['id']) currencypair = forwarddict['cap_currency']+'CNY' forwarddict['exrate'] = gethistoryrate([currencypair],Time)[currencypair] if currencypair!='CNYCNY' else 1.0 forwarddict['data_date'] = getNow('%Y-%m-%d %H:%M:%S') logs('compute','swaoption','getDataFromMongo',forwarddict,infoFalg=True) #if lst['id']==1170: #print Setdate,SetRate,value_date,delivery_date,currentRate,SellRate,BuyRate,LockedRate,rateway,self.delta,capped_exrate,trade_type,Rate,forwarddict['gal'] self.forwarddict.append(forwarddict) #print forwarddict #self.forwarddict = forwarddict self.updateData()