def get_rollYield_bar(type = 'symbol', var = 'RB',date= None, start = None, end = None, plot = False): """ 获取展期收益率 Parameters ------ type = 'symbol':获取某天某品种所有交割月合约的收盘价 type = 'var':获取某天所有品种两个主力合约的展期收益率(展期收益率横截面) type = ‘date’:获取某品种每天的两个主力合约的展期收益率(展期收益率时间序列) start: 开始日期 format:YYYYMMDD end: 结束数据 format:YYYYMMDD date: 某一天日期 format: YYYYMMDD var: 合约品种如RB、AL等 Return ------- DataFrame 展期收益率数据(DataFrame): ry 展期收益率 index 日期或品种 """ date = cons.convert_date(date) if date is not None else datetime.date.today() start = cons.convert_date(start) if start is not None else datetime.date.today() end = cons.convert_date(end) if end is not None else cons.convert_date(cons.get_latestDataDate(datetime.datetime.now())) if type == 'symbol': df = get_future_daily(start=date, end=date, market=symbolMarket(var)) df = df[df['variety'] == var] if plot: _plot_bar(df['close'].tolist(), df['symbol'].tolist()) return df if type == 'var': df = pd.DataFrame() for market in ['dce','cffex','shfe','czce']: df = df.append(get_future_daily(start=date, end=date, market=market)) varList = list(set(df['variety'])) ryList = [] for var in varList: ryList.append(get_rollYield(date, var, df=df)) df = pd.DataFrame(ryList,index = varList,columns = ['ry']) df = df.sort_values('ry') if plot: _plot_bar(df['ry'].tolist(), df.index) return df if type == 'date': dfL=pd.DataFrame() while start <= end: try: ry = get_rollYield(start, var) dfL = dfL.append(pd.DataFrame([ry], index=[start], columns=['ry'])) except: pass start += datetime.timedelta(days=1) if plot: _plot(pd.to_datetime(dfL.index), dfL['ry'].tolist()) return dfL
def get_future_daily(start=None, end=None, market='CFFEX', indexBar=False): """ 获取交易所日交易数据 Parameters ------ start: 开始日期 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 end: 结束数据 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 market: 'CFFEX' 中金所, 'CZCE' 郑商所, 'SHFE' 上期所, 'DCE' 大商所 之一。默认为中金所 indexBar: bool 是否合成指数K线 Return ------- DataFrame 中金所日交易数据(DataFrame): symbol 合约代码 date 日期 open 开盘价 high 最高价 low 最低价 close 收盘价 volume 成交量 open_interest 持仓量 turnover 成交额 settle 结算价 pre_settle 前结算价 variety 合约类别 或 None(给定日期没有交易数据) """ if market.upper() == 'CFFEX': f = get_cffex_daily elif market.upper() == 'CZCE': f = get_czce_daily elif market.upper() == 'SHFE': f = get_shfe_daily elif market.upper() == 'DCE': f = get_dce_daily else: print('Invalid market.') return start = cons.convert_date( start) if start is not None else datetime.date.today() end = cons.convert_date(end) if end is not None else cons.convert_date( cons.get_latestDataDate(datetime.datetime.now())) df_list = list() while start <= end: df = f(start) if df is not None: df_list.append(df) if indexBar: df_list.append(get_futureIndex(df)) start += datetime.timedelta(days=1) if len(df_list) > 0: return pd.concat(df_list).reset_index(drop=True)
def get_reciept(start=None, end=None, vars=cons.vars): """ 获取大宗商品注册仓单数量 Parameters ------ start: 开始日期 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 end: 结束数据 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 vars: 合约品种如RB、AL等列表 为空时为所有商品 Return ------- DataFrame 展期收益率数据(DataFrame): var 商品品种 string reciept 仓单数量 int date 日期 string YYYYMMDD """ start = cons.convert_date( start) if start is not None else datetime.date.today() end = cons.convert_date(end) if end is not None else cons.convert_date( cons.get_latestDataDate(datetime.datetime.now())) records = pd.DataFrame() while start <= end: if start.strftime('%Y%m%d') not in calendar: print('%s非交易日' % start.strftime('%Y%m%d')) else: print(start) for market, marketVars in cons.market_var.items(): if market == 'dce': f = get_dce_reciept elif market == 'shfe': if start <= datetime.date(2014, 5, 16): f = get_shfe_reciept_1 else: f = get_shfe_reciept_2 elif market == 'czce': if start <= datetime.date(2010, 8, 24): f = get_czce_reciept_1 elif start <= datetime.date(2015, 11, 11): f = get_czce_reciept_2 else: f = get_czce_reciept_3 get_vars = [var for var in vars if var in marketVars] if market != 'cffex' and get_vars != []: records = records.append(f(start, get_vars)) start += datetime.timedelta(days=1) return records.reset_index(drop=True)
def get_rank_sum_daily(start=None, end=None, vars=cons.vars): """ 抓取四个期货交易所前5、前10、前15、前20会员持仓排名数据 注1:由于上期所和中金所只公布每个品种内部的标的排名,没有公布品种的总排名; 所以函数输出的品种排名是由品种中的每个标的加总获得,并不是真实的品种排名列表 注2:大商所只公布了品种排名,未公布标的排名 Parameters ------ start: 开始日期 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 end: 结束数据 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 vars: 合约品种如RB、AL等列表 为空时为所有商品 Return ------- DataFrame: 展期收益率数据(DataFrame): symbol 标的合约 string var 商品品种 string vol_top5 成交量前5会员成交量总和 int vol_chg_top5 成交量前5会员成交量变化总和 int long_openIntr_top5 持多单前5会员持多单总和 int long_openIntr_chg_top5 持多单前5会员持多单变化总和 int short_openIntr_top5 持空单前5会员持空单总和 int short_openIntr_chg_top5 持空单前5会员持空单变化总和 int vol_top10 成交量前10会员成交量总和 int ... date 日期 string YYYYMMDD """ start = cons.convert_date( start) if start is not None else datetime.date.today() end = cons.convert_date(end) if end is not None else cons.convert_date( cons.get_latestDataDate(datetime.datetime.now())) records = pd.DataFrame() while start <= end: print(start) if start.strftime('%Y%m%d') in calendar: records = records.append(get_rank_sum(start, vars)) else: print('%s非交易日' % start.strftime('%Y%m%d')) start += datetime.timedelta(days=1) return records.reset_index(drop=True)
def get_spotPrice_daily(start=None, end=None, vars=cons.vars): """ 获取大宗商品现货价格,及相应基差 Parameters ------ start: 开始日期 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 end: 结束数据 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天 vars: 合约品种如RB、AL等列表 为空时为所有商品 Return ------- DataFrame 展期收益率数据(DataFrame): var 商品品种 string SP 现货价格 float nearSymbol 临近交割合约 string nearPrice 临近交割合约结算价 float domSymbol 主力合约 string domPrice 主力合约结算价 float nearBasis 临近交割合约相对现货的基差 float domBasis 主力合约相对现货的基差 float nearBasisRate 临近交割合约相对现货的基差率 float domBasisRate 主力合约相对现货的基差率 float date 日期 string YYYYMMDD """ start = cons.convert_date( start) if start is not None else datetime.date.today() end = cons.convert_date(end) if end is not None else cons.convert_date( cons.get_latestDataDate(datetime.datetime.now())) df_list = [] while start <= end: print(start) df = get_spotPrice(start, vars) if df is False: return pd.concat(df_list).reset_index(drop=True) elif df is not None: df_list.append(df) start += datetime.timedelta(days=1) if len(df_list) > 0: return pd.concat(df_list).reset_index(drop=True)