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
Пример #3
0
 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}
Пример #4
0
 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()
Пример #5
0
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('回测结束')
Пример #6
0
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)
Пример #7
0
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')
Пример #8
0
    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