def get_zz_quote(code, end_date=None, count=None, start_date=None): '''获取中证指数行情,返回panel结构''' if isinstance(code, str): code = [code] code.sort() code = [x[:6] for x in code] days = get_trade_days(start_date, end_date, count) code_df = jy.run_query( query(jy.SecuMain.InnerCode, jy.SecuMain.SecuCode, jy.SecuMain.ChiName).filter( jy.SecuMain.SecuCode.in_(code)).order_by( jy.SecuMain.SecuCode)) df = jy.run_query( query(jy.QT_CSIIndexQuote).filter( jy.QT_CSIIndexQuote.IndexCode.in_(code_df.InnerCode), jy.QT_CSIIndexQuote.TradingDay.in_(days), )) df2 = pd.merge(code_df, df, left_on='InnerCode', right_on='IndexCode').set_index(['TradingDay', 'SecuCode']) df2.drop([ 'InnerCode', 'IndexCode', 'ID', 'UpdateTime', 'JSID', 'OpenInterest', 'SettleValue', 'IndexCSIType' ], axis=1, inplace=True) return df2.to_panel()
def get_SW_index(SW_index = 801010,start_date = '2017-01-31',end_date = '2018-01-31'): index_list = ['PrevClosePrice','OpenPrice','HighPrice','LowPrice','ClosePrice','TurnoverVolume','TurnoverValue','TurnoverDeals','ChangePCT','UpdateTime'] jydf = jy.run_query(query(jy.SecuMain).filter(jy.SecuMain.SecuCode==str(SW_index))) link=jydf[jydf.SecuCode==str(SW_index)] rows=jydf[jydf.SecuCode==str(SW_index)].index.tolist() result=link['InnerCode'][rows] df = jy.run_query(query(jy.QT_SYWGIndexQuote).filter(jy.QT_SYWGIndexQuote.InnerCode==str(result[0]),\ jy.QT_SYWGIndexQuote.TradingDay>=start_date,\ jy.QT_SYWGIndexQuote.TradingDay<=end_date )) df.index = df['TradingDay'] df = df[index_list] return df
def future_basic_info(self, future): # 这个后续改成从本地的meta数据中拿metadata数据的方法,暂时先这么使用 if "9999" in future or "8888" in future: match = re.match(r"(?P<underlying_symbol>[A-Z]{1,})", future) if not match: raise ValueError("未知期货标的:{}".format(future)) else: future = get_dominant_future( match.groupdict()["underlying_symbol"]) code = future.split(".")[0] q = query(jy.Fut_ContractMain).filter( jy.Fut_ContractMain.ContractCode == code) result = jy.run_query(query_object=q).to_dict("record") if result: result = result.pop() min_point = re.match( "(?P<value>^[0-9]+([.]{1}[0-9]+){0,1})", result["LittlestChangeUnit"]).groupdict(nan)["value"] return { "ContractUnit": result["CMValue"], "PriceScale": float(str(min_point)[:-1] + "1") if float(min_point) < 1 else 1, "MinPoint": float(min_point) } else: cu = nan current_code = code[:-4].upper() if trade_units.get(current_code): cu = trade_units.get(current_code) return {"ContractUnit": cu, "PriceScale": nan, "MinPoint": nan}
def __secu_to_jy(cls, codes, category=1): df = pd.DataFrame() # 因jy每次最多返回3000条数据,所以要多次查询 # 偏移值 offset = 0 while True: q = query( # 内部代码 jy.SecuMain.InnerCode, ).filter( # 去除聚宽代码后缀 jy.SecuMain.SecuCode.in_(codes), # 限定查询股票 jy.SecuMain.SecuCategory == category # 偏移 ).offset(offset) # 查询 temp_df = jy.run_query(q) # 无数据时退出 if len(temp_df) == 0: break # 追加数据 df = df.append(temp_df) # 偏移值每次递增3000 offset += 3000 # 返回代码list return df.InnerCode.tolist()
def on_strategy_end(context): trade_list = ['399006'] incode = jy.run_query( query( jy.SecuMain.SecuCode, jy.SecuMain.InnerCode, ).filter(jy.SecuMain.SecuCode.in_(trade_list), )) q = query( jy.LC_Dividend.InnerCode, # 证券内部编码 jy.LC_Dividend.ExDiviDate, # 除权除息日 ).filter(jy.LC_Dividend.InnerCode.in_(incode['InnerCode']), ).order_by( jy.LC_Dividend.ExDiviDate.desc()) df = jy.run_query(q).fillna(value=0, method=None, axis=0) df2 = pd.merge(incode, df, on='InnerCode') print(df2) # 策略运行结束时调用(可选) print('回测结束')
def get_market_news(news_type): #今天日期 today = pd.datetime.today().strftime('%Y-%m-%d') #三个时间段 morning_time = today + ' 09:30:00' afternoon_time = today + ' 13:00:00' evening_time = today + ' 22:00:00' #查询聚源数据库ED_GilBroadcast q = query( #具体时间 jy.ED_GilBroadcast.InfoPublTime, #标题 jy.ED_GilBroadcast.InfoTitle, #正文 jy.ED_GilBroadcast.Content, ).filter( #按照发布日期过虑 jy.ED_GilBroadcast.InfoPublDate == today).order_by( #按照发布时间排序 jy.ED_GilBroadcast.InfoPublTime.desc()) df = jy.run_query(q) #筛选、组织数据 title = '市场快讯(%s DGCIdea)' % (today) if news_type == 'morning': df = df[(df.InfoPublTime <= morning_time)] title = '早报:%s' % title elif news_type == 'afternoon': df = df[(df.InfoPublTime > morning_time) & (df.InfoPublTime <= afternoon_time)] title = '午报:%s' % title elif news_type == 'evening': df = df[(df.InfoPublTime > afternoon_time) & (df.InfoPublTime <= evening_time)] title = '晚报:%s' % title #生成html if len(df) == 0: return ('', '') else: news = '' for i in range(len(df)): news = news + '<hr />' news = news + '<p>' news = news + df.iloc[i].InfoTitle + '<br/>' news = news + df.iloc[i].InfoPublTime.strftime( '%Y-%m-%d %H:%M:%S') + '<br/>' news = news + df.iloc[i].Content.decode('gbk').replace( '\n', '<br/>') + '<br/>' news = news + '<br/></p>' return (title, news)
def __get_jy_divid(code, end_date): """ 指定日期股息率,jy版本 code:股票代码,list or str end_date:截至日期 返回:股息率、市值 """ # 判断代码是str还是list if not type(code) is list: code = [code] # 聚宽代码转换为jy内部代码 InnerCodes = Code.stk_to_jy(code) # 获取所有成份股派息总额 # 数据表 df = pd.DataFrame() # 因jy每次最多返回3000条数据,所以要多次查询 # 偏移值 offset = 0 while True: # 查询语句 q = query( # 内部代码 jy.LC_Dividend.InnerCode, # 派息日期 jy.LC_Dividend.ToAccountDate, # 派息总额 jy.LC_Dividend.TotalCashDiviComRMB, ).filter( # 已分红 jy.LC_Dividend.IfDividend == 1, # 获取指定日期前所有分红 jy.LC_Dividend.ToAccountDate <= end_date, jy.LC_Dividend.InnerCode.in_(InnerCodes) # 偏移 ).offset(offset) # 查询 temp_df = jy.run_query(q) if len(temp_df) == 0: break # 追加数据 df = df.append(temp_df) # 偏移值每次递增3000 offset += 3000 if len(df) == 0: div = float('NaN') else: # 生成排序字段 df['sort'] = df['InnerCode'].astype( 'str') + df['ToAccountDate'].astype('str').str[0:10] df = df.sort('sort') # 只保留最后一次派息数据 df = df.drop_duplicates('InnerCode', take_last=True) # keep='last' # 返回合计的派息数 div = df['TotalCashDiviComRMB'].sum() # 获取指数总市值 q = query( # 市值 valuation.market_cap).filter(valuation.code.in_(code)) # 获取各成份股市值(亿元) df = get_fundamentals(q, end_date) # 返回合计的成份股总市值(亿元) cap = df['market_cap'].sum() try: # 返回股息率 return div / cap / 100000000 * 100.0, cap except: return float('NaN'), float('NaN')
def fun_get_Dividend_yield(self, stocks, statsDate): # 按照派息日计算,计算过去 12个月的派息率(TTM) start_date = statsDate - dt.timedelta(365) end_date = statsDate year = statsDate.year #将当前股票池转换为聚源的6位股票池 stocks_symbol = [] for s in stocks: stocks_symbol.append(s[0:6]) #查找聚源的内部编码 df_code = jy.run_query( query( jy.SecuMain.InnerCode, #证券内部编码 jy.SecuMain.SecuCode #证券代码 )) df_code = df_code[df_code.SecuCode.isin(stocks_symbol)] list_InnerCode = list(set(list(df_code['InnerCode']))) # 按派息日,查找过去12个月的分红记录 #查找有分红的(受派息日约束); df = jy.run_query( query( jy.LC_Dividend.InnerCode, #证券内部编码 jy.LC_Dividend. CashDiviRMB, #派现(含税/人民币元)(***说明文档没说明分红单位是每股,还是每十股) jy.LC_Dividend.DiviBaseBeforeChange, #变更前分红股本基数(股)(***又是不提单位) ).filter( jy.LC_Dividend.ToAccountDate <= end_date, jy.LC_Dividend.ToAccountDate >= start_date, jy.LC_Dividend.IfDividend == 1 #不考虑特殊分红和其他分红 )).fillna(value=0, method=None, axis=0) df = df[df.InnerCode.isin(list_InnerCode)] df = df.reset_index(drop=True) df.index = df['InnerCode'] df_code = df_code[df_code.InnerCode.isin( list(set(list(df['InnerCode']))))] df = df.drop(['InnerCode'], axis=1) df_code.index = df_code['InnerCode'] df = df.join([df_code]) df['SecuCode'] = map(normalize_code, list(df['SecuCode'])) # 获取最新股本 q = query(valuation.code, valuation.capitalization) df2 = get_fundamentals(q).fillna(value=0) df2 = df2[df2.code.isin(df.SecuCode)] df2['SecuCode'] = df2['code'] df2 = df2.drop(['code'], axis=1) # 合并成一个 dataframe df = df.merge(df2, on='SecuCode') df.index = list(df['SecuCode']) df = df.drop(['SecuCode'], axis=1) # 转换成 float df['DiviBaseBeforeChange'] = map(float, df['DiviBaseBeforeChange']) # 计算股份比值 # *** 因为聚源的 DiviBaseBeforeChange 数据全数为 0,也就是没有记录分红时的股份基数,所以暂时默认都是 1.0 # 实际市场里,因为送股/配股转股的缘故,分红时的股份基数,往往会与当下的股份不一致 #df['CAP_RATIO'] = df['DiviBaseBeforeChange'] / (df['capitalization'] * 10000) df['CAP_RATIO'] = 1.0 df['CashDiviRMB'] = map(float, df['CashDiviRMB']) # 计算相对于目前股份而言的分红额度 df['CashDiviRMB'] = df['CashDiviRMB'] * df['CAP_RATIO'] df = df.drop(['DiviBaseBeforeChange', 'capitalization', 'CAP_RATIO'], axis=1) #接下来这一步是考虑多次分红的股票,因此需要累加股票的多次分红 df = df.groupby(df.index).sum() #得到当前股价 Price = history(1, unit='1d', field='close', security_list=list(df.index), df=True, skip_paused=False, fq='pre') Price = Price.T df['pre_close'] = Price #计算股息率 = 股息/股票价格,* 10 是因为取到的是每 10 股分红 df['divpercent'] = df['CashDiviRMB'] / (df['pre_close'] * 10) df = df.drop(['pre_close', 'CashDiviRMB'], axis=1) df = df[df.divpercent > 0] #print df return df