def func2(): yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1)).strftime("%Y-%m-%d") df_openA=pd.read_csv('openA.csv') last_date_openA = time.strftime("%Y-%m-%d",time.strptime(str(int(df_openA.iloc[-1,0])),"%Y%m%d")) day_gap_openA = w.tdayscount(last_date_openA, yesterday).Data[0][0]-1 print 2 w_wsd_data={} stock_ls=[] for stock in universe: if stock[0]=='1': stock = stock + '.SZ' else: stock += '.SH' stock_ls.append(stock) w_wsd_data[stock] = w.wsd(stock, 'open', (w.tdaysoffset(1,last_date_openA).Data[0][0]).strftime("%Y-%m-%d"),yesterday) for i in xrange(day_gap_openA): this_day = w.tdaysoffset(i+1,last_date_openA) ls = [] this_day_csv = (this_day.Data[0][0]).strftime("%Y%m%d") for stock in stock_ls: ls.append(w_wsd_data[stock].Data[0][i]) f=open('openA.csv','a') f.write(this_day_csv) for stock_data in ls: f.write(",") f.write(str(stock_data)) f.write("\n") f.close() print 'finish'
def func9(): yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1)).strftime("%Y-%m-%d") df_discount_ratio_M = pd.read_csv('discount_ratio_M.csv') last_date_discount_ratio_M = time.strftime("%Y-%m-%d",time.strptime(str(int(df_discount_ratio_M.iloc[-1,0])),"%Y%m%d")) day_gap_discount_ratio_M = w.tdayscount(last_date_discount_ratio_M, yesterday).Data[0][0]-1 w_wsd_data={} print 9 stock_ls=[] for stock in universe: if stock[0]=='1': stock = stock + '.SZ' else: stock = stock + '.SH' mA_code = w.wsd(stock, 'fund_smfcode', yesterday).Data[0][0] stock_ls.append(mA_code) w_wsd_data[mA_code] = w.wsd(mA_code, 'anal_tdiscountratio', (w.tdaysoffset(1,last_date_discount_ratio_M).Data[0][0]).strftime("%Y-%m-%d"),yesterday) for i in xrange(day_gap_discount_ratio_M): this_day = w.tdaysoffset(i+1,last_date_discount_ratio_M) ls = [] this_day_csv = (this_day.Data[0][0]).strftime("%Y%m%d") for stock in stock_ls: ls.append(w_wsd_data[stock].Data[0][i]) f=open('discount_ratio_M.csv','a') f.write(this_day_csv) for stock_data in ls: f.write(",") f.write(str(stock_data)) f.write("\n") f.close() print 'finish'
def func11(): yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1)).strftime("%Y-%m-%d") df_industry=pd.read_csv('industry.csv') last_date_industry = time.strftime("%Y-%m-%d",time.strptime(str(int(df_industry.iloc[-1,0])),"%Y%m%d")) day_gap_industry = w.tdayscount(last_date_industry, yesterday).Data[0][0]-1 print 11 w_wsd_data={} stock_ls=[] for stock in list(df_industry.columns.values)[1:] : stock_ls.append(stock) w_wsd_data[stock] = w.wsd(stock, 'close', (w.tdaysoffset(1,last_date_industry).Data[0][0]).strftime("%Y-%m-%d"),yesterday) print w_wsd_data f=open('industry.csv','a') for i in xrange(day_gap_industry): this_day = w.tdaysoffset(i+1,last_date_industry) ls = [] this_day_csv = (this_day.Data[0][0]).strftime("%Y%m%d") for stock in stock_ls: ls.append(w_wsd_data[stock].Data[0][i]) f.write(this_day_csv) for stock_data in ls: f.write(",") f.write(str(stock_data)) f.write("\n") f.close() print 'finish'
def get_trading_date_from_now(date_now, diff_periods, period=ql.Days): always_using_ql = False # 是否全部使用quantlib处理日期,否则只在某些情形使用quantlib处理日期 if (int(date_now.split('-')[0]) <= 2019 and int(date_now.split('-')[1]) <= 9 and diff_periods <= 1) or (int(date_now.split('-')[0]) <= 2018 and diff_periods <= 1) or always_using_ql: calculation_date = ql.Date(int(date_now.split('-')[2]), int(date_now.split('-')[1]), int(date_now.split('-')[0])) calendar = ql.China() date_diff = calendar.advance(calculation_date, diff_periods, period).to_date().strftime('%Y-%m-%d') else: # 其余日子用wind处理 if period==ql.Days: w.start() date_diff = w.tdaysoffset(diff_periods, date_now, '').Data[0][0].strftime('%Y-%m-%d') if diff_periods == 0: # 非交易日顺延到下一个交易日 date_now_date = datetime.date.fromisoformat(date_now) date_diff_date = datetime.date.fromisoformat(date_diff) if date_diff_date < date_now_date: date_diff = w.tdaysoffset(1, date_now, '').Data[0][0].strftime('%Y-%m-%d') elif period==ql.Months: w.start() date_diff = w.tdaysoffset(diff_periods, date_now, 'Period=M').Data[0][0].strftime('%Y-%m-%d') if diff_periods == 0: # 非交易日顺延到下一个交易日 date_now_date = datetime.date.fromisoformat(date_now) date_diff_date = datetime.date.fromisoformat(date_diff) if date_diff_date < date_now_date: date_diff = w.tdaysoffset(1, date_now, '').Data[0][0].strftime('%Y-%m-%d') return date_diff
def get_trading_date_from_now(date_now, diff_periods, period=ql.Days): if period == ql.Days: w.start() date_diff = w.tdaysoffset(diff_periods, date_now, '').Data[0][0].strftime('%Y-%m-%d') if diff_periods == 0: date_now_date = datetime.date.fromisoformat(date_now) date_diff_date = datetime.date.fromisoformat(date_diff) if date_diff_date < date_now_date: date_diff = w.tdaysoffset(1, date_now, '').Data[0][0].strftime('%Y-%m-%d') return date_diff # 未改善代码 calculation_date = ql.Date(int(date_now.split('-')[2]), int(date_now.split('-')[1]), int(date_now.split('-')[0])) calendar = ql.China() date_diff = calendar.advance(calculation_date, diff_periods, period).to_date().strftime('%Y-%m-%d') # 临时修正错误,是包QuantLib的错误,节假日问题 if date_now == '2019-01-02' and diff_periods == -1 and period == ql.Days: return '2018-12-28' if (date_now == '2019-02-08' or date_now == '2019-02-09' or date_now == '2019-02-10' or date_now == '2019-02-11') and diff_periods == -1 and period == ql.Days: return '2019-02-01' if (date_now == '2019-05-06' or date_now == '2019-05-02' or date_now == '2019-05-03' or date_now == '2019-05-04') and diff_periods == -1 and period == ql.Days: return '2019-04-30' return date_diff
def tradedate(days=30): lastdate = datetime.now().date() starttradedate = (datetime.now() - timedelta(days)).date() if lastdate.weekday() == 5 or lastdate.weekday() == 6: lasttradedate = w.tdaysoffset(0, lastdate).Data[0][0].date() else: lasttradedate = w.tdaysoffset(-1, lastdate).Data[0][0].date() if starttradedate >= lasttradedate: starttradedate = lasttradedate else: pass return (str(starttradedate), str(lasttradedate))
def lookup_w(w_panel, t, calendar, pre_w=None, pre_r=None): """ 用于返回对应高频(这里是daily)日期在回测期间的权重(调频周期为低频周、月). :param w_panel: dict,在调仓日(收盘后)的对应新权重. :param t: str, 需要确定组合日收益率的当日. :param pre_w: list, 前2交易日收盘后的权重,即是前1交易日开盘前权重. :param pre_r: list, 前1交易日当天收益率. :return: list,t当日开盘前权重. """ assert isinstance(w_panel, dict), "TypeError: w_panel should be type dict" # 按时间顺序排序 w_panel = OrderedDict(sorted(w_panel.items(), key=lambda k: k[0])) rebalance_seq = list(w_panel.keys()) # 由上期莫转换到本期初 try: tt = rebalance_seq[0] rebalance_seq_ = list(map(lambda tt: w.tdaysoffset(1, tt, f'''TradingCalendar={ calendar}''').Data[0][0].strftime( "%Y-%m-%d"), rebalance_seq)) except AttributeError as e: print(f"{tt} {e}") if t[:10] in rebalance_seq_: idx = rebalance_seq_.index(t[:10]) cur_w = w_panel[rebalance_seq[idx]] else: # 价格变化导致每天的实际权重发生变化 cur_w = list(np.array(pre_w) * (np.array(pre_r)/100 + 1) / np.dot(np.array(pre_r)/100 + 1, np.array(pre_w))) return cur_w
def get_schedule(**kwargs): sec_code = kwargs.get('sec_code') end_date = kwargs.get('end_date') if not sec_code or not end_date: raise ValueError('sec_code and end_date should not be empty') participant_rate = kwargs.get('participant_rate') or 0.15 target_ratio = kwargs.get('target_ratio') or 0.01 period = kwargs.get('period') or 100 target_vol = kwargs.get('target_vol') or 8000000 target_period = kwargs.get('target_period') price_ratio = kwargs.get('price_ratio') or 0.95 update = kwargs.get('update') or False ret_vol, ret_price = get_trade_schedule(participant_rate=participant_rate, target_ratio=target_ratio, sec_code=sec_code, end_date=end_date, period=period, target_vol=target_vol, target_period=target_period, price_ratio=price_ratio) # FIXME fix the border print(sum(ret_vol), target_vol) next_date = w.tdaysoffset(1, end_date).Data[0][0].strftime('%Y-%m-%d') sec_code = sec_code vol = ret_vol[0] price = min(ret_price) df = pd.DataFrame([[sec_code, next_date, vol, price]], columns=['sec_code', 'trade_date', 'vol', 'price']) curr_df = pd.read_csv('data/trade_strategy.csv') curr_df = curr_df.append(df) if update: curr_df.to_csv('data/trade_strategy.csv', index=False) return df
def GetLastTradeDate(): end_date = date.today() count = w.tdayscount(end_date) if count.Data == 0 or datetime.now().hour <= 15: return w.tdaysoffset(-1, end_date).Data[0][0].date() return end_date
def histroy_same_date(tdate, years=10): his_list = [] for y in range(-years, 0): his_y = w.tdaysoffset(y, "2018-04-24", "Period=Y;TradingCalendar=DCE") his_y = his_y.Data[0][0] his_list.append(his_y) return his_list
def post(self): """ json str:{"offset": "1", "begin_time": "2017-3-31", "options": ""} :return: 返回万得返回数据dict """ data_dic = request.json logger.info('/tdaysoffset/ data_dic:%s', data_dic) offset = int(data_dic['offset']) begin_time = data_dic['begin_time'] options = data_dic['options'] if not w.isconnected(): w.start() if options == "": options = None ret_data = w.tdaysoffset(offset, begin_time, options) error_code = ret_data.ErrorCode if error_code != 0: msg = ERROR_CODE_MSG_DIC.setdefault(error_code, "") logger.error('tdaysoffset("%s", "%s", "%s") ErrorCode=%d %s' % (offset, begin_time, options, error_code, msg)) return {'error_code': ret_data.ErrorCode, 'message': msg}, 404 # if ret_data.ErrorCode != 0: # logger.error( # 'tdaysoffset("%s", "%s", "%s") ErrorCode=%d' % (offset, begin_time, options, ret_data.ErrorCode)) # return {'error_code': ret_data.ErrorCode}, 404 # 将 Data数据中所有 datetime date 类型的数据转换为 string if len(ret_data.Data) > 0 and len(ret_data.Data[0]) > 0: date_str = format_2_date_str(ret_data.Data[0][0]) else: logger.warning('tdaysoffset(%s, %s, %s) No value return' % (offset, begin_time, options)) date_str = '' ret_dic = {'Date': date_str} # print('offset:\n', ret_dic) return ret_dic
def t_days_offset(offset=0, cur_date=datetime.now()): try: w.start() result = w.tdaysoffset(offset, cur_date, "").Data[0][0] return result except IndexError as e: print(format(e)) raise
def advance_date(date, unit, freq): try: ret = w.tdaysoffset(int(unit) * -1, date, 'period=' + freq) WindDataProvider.force_throw_err(ret, 'WindDataProvider.advance_date') return ret.Data[0][0] except NameError: pass
def get_trading_date_from_now(date_now, diff_periods, period=ql.Days): if period==ql.Months: w.start() date_diff = w.tdaysoffset(diff_periods, date_now, 'Period=M').Data[0][0].strftime('%Y-%m-%d') if diff_periods == 0: # 非交易日顺延到下一个交易日 date_now_date = datetime.date.fromisoformat(date_now) date_diff_date = datetime.date.fromisoformat(date_diff) if date_diff_date < date_now_date: date_diff = w.tdaysoffset(1, date_now, '').Data[0][0].strftime('%Y-%m-%d') else: # 默认以日为单位进行调整 w.start() date_diff = w.tdaysoffset(diff_periods, date_now, '').Data[0][0].strftime('%Y-%m-%d') if diff_periods == 0: # 非交易日顺延到下一个交易日 date_now_date = datetime.date.fromisoformat(date_now) date_diff_date = datetime.date.fromisoformat(date_diff) if date_diff_date < date_now_date: date_diff = w.tdaysoffset(1, date_now, '').Data[0][0].strftime('%Y-%m-%d') return date_diff
def _get_trade_day(self, caldate): res = w.tdaysoffset( 0, caldate, ) if res.ErrorCode != 0: raise WindQueryFailError( "Get date data failed, errorcode={}.".format(res.ErrorCode)) return res.Data[0][0]
def get_stdevr(stocks, date): date_i = date.strftime("%Y%m%d") date_20 = w.tdaysoffset(-20, date, "").Data[0][0].strftime("%Y%m%d") date_60 = w.tdaysoffset(-60, date, "").Data[0][0].strftime("%Y%m%d") rawdata1 = w.wss( stocks, "stdevr", "startDate=" + date_20 + ";endDate=" + date_i + ";period=1;returnType=1") data1 = pd.DataFrame(rawdata1.Data).T rawdata2 = w.wss( stocks, "stdevr", "startDate=" + date_60 + ";endDate=" + date_i + ";period=1;returnType=1") data2 = pd.DataFrame(rawdata2.Data).T data = pd.concat([data1, data2], axis=1) data.index = stocks data.columns = ['std20', 'std60'] return data
def get_all_month_start_end_dates(start_date='', end_date=''): ''' format for start_date and end_date: 'yyyymmdd' :param start_date: :param end_date: :return: list of trading dates, with format 'yyyydddd' ''' # FIXME check the missing trade cal table # rows, cols = get_dates_statics(start_date, end_date) # return list(set([(item[6].strftime('%Y%m%d'), item[7].strftime('%Y%m%d')) for item in rows])) from WindPy import w w.start() _start_date = start_date[:6] + '01' _start_date = w.tdaysoffset(-1, _start_date).Data[0][0] data = w.tdays(_start_date, end_date, "Period=M").Data[0] ret = [] for item in data: _next_start = w.tdaysoffset(1, item).Data[0][0] ret.append(item.strftime('%Y%m%d')) ret.append(_next_start.strftime('%Y%m%d')) return ret[1:-1]
def _eval_seq_d(self, seq_d): if not w.isconnected(): w.start() sleep(3) seq = seq_d.copy() seq.pop(0) last = seq[-1] next_ = w.tdaysoffset( 1, last, f"TradingCalendar={self.calendar}").Data[0][0].strftime("%Y-%m-%d") seq.append(next_) return seq
def func6(): yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1)).strftime("%Y-%m-%d") df_closeB=pd.read_csv('closeB.csv') last_date_closeB = time.strftime("%Y-%m-%d",time.strptime(str(int(df_closeB.iloc[-1,0])),"%Y%m%d")) day_gap_closeB = w.tdayscount(last_date_closeB, yesterday).Data[0][0]-1 print 6 w_wsd_data={} stock_ls=[] for stock in universe: if stock =='150073': stock='150075.SZ' else: if stock[0]=='1': stock = str(int(stock[:6])+1) + '.SZ' else: stock = str(int(stock[:6])+1) + '.SH' stock_ls.append(stock) w_wsd_data[stock] = w.wsd(stock, 'close', (w.tdaysoffset(1,last_date_closeB).Data[0][0]).strftime("%Y-%m-%d"),yesterday) # print 1 print stock #if w_wsd_data[stock].Data[0][0]==None: for i in xrange(day_gap_closeB): this_day = w.tdaysoffset(i+1,last_date_closeB) ls = [] this_day_csv = (this_day.Data[0][0]).strftime("%Y%m%d") for stock in stock_ls: ls.append(w_wsd_data[stock].Data[0][i]) f=open('closeB.csv','a') f.write(this_day_csv) for stock_data in ls: f.write(",") f.write(str(stock_data)) f.write("\n") f.close() print 'finish'
def get_nearest_hrange(now, num_h, calendar): """ 根据当天需要确定下期持仓权重的时间,以及优化需要的历史K线个数,确定提取数据的开始和结束时间. :param now: str,当前时间. :param num_h: int,估计均值、方差需要的历史K线数. :return: str,str;开始时间,结束时间 """ dd, hh = now.split(" ") ft = max(filter(lambda x: x < hh, ["00"]+HOUR_BAR)) if ft == "00": ft = HOUR_BAR[-1] dd_ = w.tdaysoffset(-1, dd, f"TradingCalendar={calendar}").Data[0][0].strftime("%Y-%m-%d") idx_t = 0 else: idx_t = HOUR_BAR.index(ft) + 1 dd_ = dd days, idx_h = divmod(num_h-idx_t, 4) fh = HOUR_BAR[-idx_h] ddh = w.tdaysoffset(-days-int(idx_h > 0), dd, f"TradingCalendar={calendar}").Data[0][0].strftime("%Y-%m-%d") return " ".join([ddh, fh]), " ".join([dd_, ft])
def get_data(now_date): w.start() end_date = w.tdaysoffset(-1, now_date, "").Data[0][0].strftime('%Y-%m-%d') start_date = w.tdaysoffset(-241, now_date, "").Data[0][0].strftime('%Y-%m-%d') file_path = 'data\\in_trading\\data.csv' if os.path.exists(file_path): # 存在数据文件 df = pd.read_csv(file_path, index_col=0) index = df.index.values if index[0] != start_date or index[-1] != end_date: # 时间日期不符 os.remove(file_path) # 删除数据文件 data = w.wsd(SW1, "pct_chg", start_date, end_date, "PriceAdj=T") df = pd.DataFrame(data=np.array(data.Data).transpose(), index=data.Times, columns=SW1.split(',')) df.to_csv(file_path) else: # 不存在数据文件 data = w.wsd(SW1, "pct_chg", start_date, end_date, "PriceAdj=T") df = pd.DataFrame(data=np.array(data.Data).transpose(), index=data.Times, columns=SW1.split(',')) df.to_csv(file_path)
def _calculate_factor(self): date_list = self.date startDate = str( w.tdaysoffset(-self.N, "".join(date_list), "").Data[0][0]) # 区间数据 vol_data = np.array( w.wss( self.code_list, "avg_turn_per", "startDate=" + "".join(startDate) + ";endDate=" + "".join(date_list)).Data[0]) vol_data = vol_data / 100.0 VOL240 = pd.DataFrame(data=vol_data, index=self.code_list, columns=[self.factor_name]) return VOL240
def get_history(date_end, T): w.start() print('获取指数历史数据......') if type(T) == int: date_start = w.tdaysoffset(-T, date_end, '').Data[0][0].strftime('%Y-%m-%d') else: date_start = T Data = w.wsd(list(SW1.keys()), "pct_chg", date_start, date_end, "") return_d = np.array(Data.Data) date_list = Data.Times date_list = [d.strftime('%Y-%m-%d') for d in date_list] print('指数历史数据获取完毕') return return_d, date_list
def update_recorder(endDate=None, recordFile=None, holdListPath=None): endDate = dt.datetime.today().strftime( '%Y%m%d') if endDate is None else endDate recordFile = r'.\backtest_recorder.csv' if recordFile is None else recordFile holdListPath = r'.\holdLists' if holdListPath is None else holdListPath recordDF = pd.read_csv(recordFile) lastUpdt = recordDF['tradeDate'].values[-1] w.start() startDate = w.tdaysoffset(1, str(lastUpdt)).Data[0][0].strftime('%Y%m%d') if startDate > endDate: print('no new data to update') return betweenDays = w.tdays(startDate, endDate).Data[0] betweenDays = [int(tdt.strftime('%Y%m%d')) for tdt in betweenDays] print(betweenDays) outPut = { 'tradeDate': [], 'buyReturn': [], 'holdReturn': [], 'netReturn': [] } cols = ['stkcd', 'buyDate', 'ret', 'flag'] for tdt in betweenDays: retList = pd.read_csv(os.path.join( holdListPath, 'returns_tradeDate_{}.csv'.format(tdt)), encoding='gbk') retList = retList.loc[:, cols] validBuy = np.all( [retList['buyDate'] == tdt, np.isin(retList['flag'], (0, 3, 4))], axis=0) validHold = np.all( [retList['buyDate'] < tdt, np.isin(retList['flag'], (0, 2, 3, 4))], axis=0) outPut['tradeDate'].append(tdt) outPut['buyReturn'].append(retList.loc[validBuy, 'ret'].mean()) outPut['holdReturn'].append(retList.loc[validHold, 'ret'].mean()) outPut['netReturn'].append(retList.loc[validBuy | validHold, 'ret'].mean()) outPut = pd.DataFrame( outPut).loc[:, ['tradeDate', 'buyReturn', 'holdReturn', 'netReturn']] indices = ['000001.SH', '000300.SH', '000905.SH', '000016.SH'] idxRets = pd.DataFrame(w.wsd(','.join(indices), 'pct_chg', startDate, endDate).Data, columns=indices) idxRets = idxRets.loc[:] / 100 outPut = pd.concat([outPut, idxRets], axis=1) outPut.to_csv(recordFile, mode='a+', index=False, header=False) print('recorder updated till {}'.format(endDate))
def _calculate_factor(self): date_list = self.date startDate = str( w.tdaysoffset(-self.length, "".join(date_list), "").Data[0][0]) # 每个月22个交易日 beta_data = np.array( w.wss( self.code_list, "beta", "startDate=" + startDate + ";endDate=" + "".join(date_list) + ";period=2;returnType=1;index=" + self.refer_index).Data[0]) BETA = pd.DataFrame(data=beta_data, index=self.code_list, columns=[self.factor_name]) return BETA
def get_tdays_offset(self, begin_date, offset, cycle="", style=""): """ 获取偏移日期 输入参数: begin_date 开始日期 yyyymmdd 或 yyyy-mm-dd offset 偏移数量 -5表示往前5个日期;5表示往后5个日期 cycle和style同get_tdays函数中 函数返回: 返回偏移N个周期的日期 类型:yyyymmdd """ option = {"Days": style, "Period": cycle} td = w.tdaysoffset(offset, begin_date, **option) return td.Times[0].strftime("%Y%m%d")
def train_test_model(vol_df, short_term_days, features, model, train_date, test_date): predX = vol_df.ix[-short_term_days - 1:, features] pred_end_date = w.tdaysoffset(short_term_days, predX.index[-1]).Data[0][0] pred_dates = w.tdays(predX.index[-1].strftime("%Y-%m-%d"), pred_end_date.strftime("%Y-%m-%d")).Times predX.index = pred_dates vol_df[features] = vol_df[features].shift(short_term_days) vol_df.dropna(inplace=True) train_df = vol_df[vol_df.index <= test_date] test_df = vol_df[vol_df.index >= test_date] train_df = train_df.append(test_df.ix[0]) # 为了让图看上去连续 trainX, trainY = train_df[features], train_df['vol'] testX, testY = test_df[features], test_df['vol'] # 用Lasso来做feature selection lasso = linear_model.Lasso(alpha=0.0005) lasso.fit(trainX, trainY) sfm = SelectFromModel(lasso, prefit=True) fea_trainX = sfm.transform(trainX) fea_testX = sfm.transform(testX) fea_predX = sfm.transform(predX) if model == "LinearRegression": reg_model = linear_model.LinearRegression() elif model == "KernelRidgeRegression": reg_model = KernelRidge(kernel='rbf') elif model == "SupportVectorRegression": reg_model = SVR(kernel="linear") elif model == "Ridge": reg_model = linear_model.Ridge() elif model == "RandomForestRegression": reg_model = RandomForestRegressor() elif model == "AdaBoostRegression": reg_model = AdaBoostRegressor() else: return NotImplementedError reg_model.fit(fea_trainX, trainY) train_pred = reg_model.predict(fea_trainX) test_pred = reg_model.predict(fea_testX) pred_pred = reg_model.predict(fea_predX) return (pd.DataFrame({'pred': train_pred}, index=trainX.index), pd.DataFrame({'pred': test_pred}, index=testX.index), pd.DataFrame({'pred': pred_pred}, index=predX.index))
def generate_return_report(tradeDate, tradeListPath=None, holdListPath=None): tradeDate = str(tradeDate) holdListPath = r'.\holdLists' if holdListPath is None else holdListPath tradeListPath = r'.\buyLists' if tradeListPath is None else tradeListPath w.start() infoDate = w.tdaysoffset(-1, tradeDate).Data[0][0].strftime('%Y%m%d') retList = pd.read_csv(os.path.join( holdListPath, 'returns_tradeDate_{}.csv'.format(infoDate)), encoding='gbk') trdList = pd.read_csv(os.path.join( tradeListPath, 'stkNum50_tradeList_infoDate_{}.csv'.format(infoDate)), encoding='gbk') holdStkList = retList.loc[retList['buyDate'] == int(infoDate), ['stkcd', 'predictVal']].set_index(['stkcd']) buyStkList = trdList.loc[:, ['stkcd', 'predictVal']].set_index(['stkcd']) conn = cx_Oracle.connect(r'c##sensegain/[email protected]/wind') cursor = conn.cursor() sqlLines = 'SELECT TRADE_DT, S_INFO_WINDCODE, S_DQ_OPEN, S_DQ_CLOSE, S_DQ_PRECLOSE, S_DQ_PCTCHANGE/100, S_DQ_CLOSE/S_DQ_OPEN-1, S_DQ_TRADESTATUS ' \ 'FROM c##wind.AShareEODPrices WHERE TRADE_DT={0}'.format(tradeDate) rets = cursor.execute(sqlLines).fetchall() rets = pd.DataFrame(rets, columns=[ 'tradeDate', 'stkcd', 'open', 'close', 'preclose', 'retCC', 'retOC', 'trdStat' ]) rets['flagOC'] = 1 * (rets['trdStat'] == '停牌') + 2 * ( rets['open'] / rets['preclose'] >= 1 + 0.099) + 3 * (rets['open'] / rets['preclose'] <= 1 - 0.099) rets['flagCC'] = 1 * (rets['trdStat'] == '停牌') + 2 * ( rets['retCC'] >= 0.099) + 3 * (rets['retCC'] <= -0.099) rets['stkcd'] = rets['stkcd'].map(lambda x: int(x[:6])) rets.set_index(['stkcd'], inplace=True) holdStkList = holdStkList.join( rets.loc[:, ['tradeDate', 'close', 'retCC', 'flagCC']]) holdStkList.columns = ['predictVal', 'date', 'close', 'ret', 'flag'] holdStkList['buyDate'] = infoDate buyStkList = buyStkList.join( rets.loc[:, ['tradeDate', 'close', 'retOC', 'flagOC']]) buyStkList.columns = ['predictVal', 'date', 'close', 'ret', 'flag'] buyStkList['buyDate'] = tradeDate output = pd.concat([holdStkList, buyStkList], axis=0) output = output.loc[:, ['date', 'close', 'ret', 'flag', 'buyDate']] output.to_csv( os.path.join(holdListPath, 'returns_tradeDate_{}.csv'.format(tradeDate))) print('return report generated for trade date {}'.format(tradeDate))
def post(self): """ json str:{"offset": "1", "begin_time": "2017-3-31", "options": ""} :return: 返回万得返回数据dict """ args = tdays_offset_parser.parse_args() logger.info('/tdaysoffset/ args:%s', args) # offset = int(args['offset']) # begin_time = args['begin_time'] # options = args['options'] if args['options'] == "": args['options'] = None if not w.isconnected(): w.start() ret_data = None for nth in range(2): ret_data = w.tdaysoffset(**args) error_code = ret_data.ErrorCode if error_code != 0: if nth == 0 and error_code == -40521010: w.stop() w.start() logger.warning('尝试重新登陆成功,再次调用函数') continue msg = ERROR_CODE_MSG_DIC.setdefault(error_code, "") logger.error('tdaysoffset("%s") ErrorCode=%d %s' % (args, error_code, msg)) raise RequestError(msg, None, error_code) else: break else: if ret_data is None: msg = 'wst(%s) ret_data is None' % args logger.error(msg) raise RequestError(msg, None, 0) # 将 Data数据中所有 datetime date 类型的数据转换为 string if len(ret_data.Data) > 0 and len(ret_data.Data[0]) > 0: date_str = format_2_date_str(ret_data.Data[0][0]) else: logger.warning('tdaysoffset(%s) No value return' % args) date_str = '' ret_dic = {'Date': date_str} # print('offset:\n', ret_dic) return ret_dic
def get_backtest_first_date(self, num_d): """ 返回第一次回测所需要提取数据的最早日期. .. deprecated:: v.6.0.3 Use :func:`Mkv_data2.get_nearest_hrange` instead. :param num_d: 估计组合收益率统计量所需K线个数. :return: str, 开始时间. """ if not w.isconnected(): w.start() sleep(3) first = w.tdaysoffset( -(num_d - 1), self._start, f"TradingCalendar={self.calendar}").Data[0][0].strftime("%Y-%m-%d") return first
def _calculate_factor(self): date_list = self.date startDate = str( w.tdaysoffset(-self.N, "".join(date_list), "").Data[0][0]) # 区间数据 price_data = np.array( w.wss( self.code_list, "high_per,low_per,close_per", "startDate=" + "".join(startDate) + ";endDate=" + "".join(date_list) + ";priceAdj=T").Data) avg_price = np.sum(price_data, axis=0) / 3.0 volume = np.array( w.wss( self.code_list, "vol_per", "unit=1;startDate=" + "".join(startDate) + ";endDate=" + "".join(date_list)).Data[0]) result = avg_price * volume MoneyFlow20 = pd.DataFrame(data=result, index=self.code_list, columns=[self.factor_name]) return MoneyFlow20
def eval_returns_drange(self, codes, eval_begin, eval_end, get_t_seq=False): """ 获取"D"频率下,指定开始和结束日期内每个K线指定股票变量值. :param codes: list,股票代码. :param eval_begin: str, 开始日期. :param eval_end: str, 结束日期. :param get_t_seq: bool, 是否返回区间内日期. :return: list or DataFrame, list; 变量对象,日期. """ if not w.isconnected(): w.start() sleep(3) assert self._freq == "D", "ParameterError: method eval_returns_drange仅支持D为频率" # eval_begin = w.tdaysoffset(-1, eval_begin, # f"TradingCalendar={self.calendar}").Data[0][0].strftime( # "%Y-%m-%d") # res = w.wsd(codes, "close", eval_begin, eval_end, # f"showblank=0;PriceAdj=F;TradingCalendar={self.calendar}") # 转换为工作日 eval_begin = w.tdaysoffset( -1, eval_begin, "Days=Weekdays").Data[0][0].strftime("%Y-%m-%d") res = w.wsd(codes, "close", eval_begin, eval_end, "showblank=0;PriceAdj=F;Days=Weekdays") res.Data = close2return(res.Data, percentage=True, tolist=True, fillna_value=0.0) returns = res.Data res.Times = res.Times[1:] cash_days = {"M": 30, "W": 7, "D": 1} returns.append([self._cash_r * cash_days[self._freq]] * len(returns[0])) returns = list(zip(*returns)) if get_t_seq: returns = returns, list( map(lambda x: x.strftime("%Y-%m-%d"), res.Times)) return returns
def date_offset(day,sft=1,Days='T',Period='',MKT='A', tp=''): ''' wind get date :day: :sft: shift :Days: W weekday C calendar T tradeday :Period: W M Q S Y :MKT: HK A ''' from WindPy import w w.start() DaysD = {'W': 'Weekdays', 'C':'Alldays'} MarketD = {'HK': 'HKEX', 'A':''} suffix = '' if Days!='T': suffix += 'Days=%s;'%DaysD[Days] if Period!='': suffix += 'Period=%s;'%Period if MKT!='A': suffix += 'MKT=%s;'%MarketD[MKT] day0 = w.tdaysoffset(sft, day, suffix).Data[0][0] return __dtTrans(day0, tp)
def get_tdaysoffset(num, date, **options): ''' 获取日期端点数据。 Parameters ----------- num int,正为面向未来,负为面向过去 date str,'2018-05-10' Returns ------- datetime ''' options = dict_2_str(options) date = w.tdaysoffset(num, date, options) return date.Data[0][0]
__author__ = 'aming.tao' from WindPy import w from datetime import * w.start() data=w.wsd("600000.SH","close,amt","2013-04-30", datetime.today()-timedelta(1))#取浦发银行收盘价等信 data=w.wsd("600000.SH","close,amt", datetime.today()-timedelta(100))# data=w.wsi("600000.SH","close,amt","2015-10-01 9:00:00")#取浦发银行分钟收盘价等信息 data=w.wst("600000.SH","open", datetime.today()-timedelta(0,2*3600), datetime.now())#取浦发银行tick数据信息 data=w.wss("600000.SH,000001.SZ","eps_ttm,orps,surpluscapitalps","rptDate=20121231")#取浦发银行等财务数据信息 data=w.wset("SectorConstituent",u"date=20130608;sector=全部A股")#取全部A 股股票代码、名称信息 w.wset("IndexConstituent","date=20130608;windcode=000300.SH;field=wind_code,i_weight")#取沪深300 指数中股票代码和权重 w.wset("TradeSuspend","startdate=20130508;enddate=20130608;field=wind_code,sec_name,suspend_type,suspend_reason")#取停牌信息 w.wset("SectorConstituent",u"date=20130608;sector=风险警示股票;field=wind_code,sec_name")#取ST 股票等风险警示股票信息 w.tdays("2013-05-01","2013-06-08")#返回5 月1 日到6 月8 日之间的交易日序列 w.tdays("2013-05-01")#返回5 月1 日到当前时间的交易日序列 w.tdaysoffset(-5,"2013-05-01")#返回5 月1 日前推五个交易日的日期,返回2013-4-19 w.tdaysoffset(-5)#返回当前时间前推五个交易日的日期 w.tdayscount("2013-05-01","2013-06-08")#返回5 月1 日到6 月8 日之间的交易日序列长度,为27 w.stop()
def tdaysoffset(n, date): tmp = w.tdaysoffset(n, date) return tmp.Data[0][0]