Exemplo n.º 1
0
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'
Exemplo n.º 2
0
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'
Exemplo n.º 3
0
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'
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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))
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
 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
Exemplo n.º 12
0
 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
Exemplo n.º 13
0
 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
Exemplo n.º 14
0
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
Exemplo n.º 15
0
 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]
Exemplo n.º 16
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
Exemplo n.º 17
0
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]
Exemplo n.º 18
0
 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
Exemplo n.º 19
0
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'
Exemplo n.º 20
0
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)
Exemplo n.º 22
0
 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
Exemplo n.º 23
0
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
Exemplo n.º 24
0
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))
Exemplo n.º 25
0
 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
Exemplo n.º 26
0
    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")
Exemplo n.º 27
0
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))
Exemplo n.º 28
0
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))
Exemplo n.º 29
0
    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
Exemplo n.º 30
0
    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
Exemplo n.º 31
0
 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
Exemplo n.º 32
0
    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
Exemplo n.º 33
0
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)
Exemplo n.º 34
0
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]
Exemplo n.º 35
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()
Exemplo n.º 36
0
def tdaysoffset(n, date):
    tmp =  w.tdaysoffset(n, date)
    return tmp.Data[0][0]