def ShiftTradingDay(date,shift=5):
    # 获取所有的交易日,返回一个包含所有交易日的 list,元素值为 datetime.date 类型.
    tradingday = jqdata.get_all_trade_days()
    # 得到date之后shift天那一天在列表中的行标号 返回一个数
    shiftday_index = list(tradingday).index(date)+shift
    # 根据行号返回该日日期 为datetime.date类型
    return tradingday[shiftday_index]  
Esempio n. 2
0
    def get_bonds_history_factors(self, interval=1):
        """
        获取任意指数一段时间的历史转债指数算术平均价格、转债指数溢价率 估值列表,通过计算当前的估值在历史估值的百分位,来判断当前市场的估值高低。
        由于加权方式可能不同,可能各个指数公开的估值数据有差异,但用于判断估值相对高低没有问题

        input:
            interval: 计算指数估值的间隔天数,增加间隔时间可提高计算性能

        output:
            result:  指数历史估值的 DataFrame,index 为时间,列为市场总量,低估转债总量,平均价格, 溢价率
        """
        all_days = get_all_trade_days()

        total_markets = []
        underrate_markets = []
        avg_prices = []
        avg_premium_ratios = []

        days = []

        begin = datetime.strptime(self._begin_date, '%Y-%m-%d').date()
        end = datetime.strptime(self._end_date, '%Y-%m-%d').date()
        i = 0
        for day in all_days:
            if (day < begin or day > end):
                continue

            i += 1

            if (i % interval != 0):
                continue

            logging.info("======统计历史:{}================".format(
                day.strftime("%Y-%m-%d")))
            bond_list = self.get_bonds(day.strftime("%Y-%m-%d"))
            total_market, underrate_market, avg_price, avg_premium_ratio = self.get_bonds_factors(
                bond_list)
            #debug_msg = "当前转债存量:{:.2f}, 低估转债存量:{:.2f}, 当前平均价格:{:.2f}, 当前溢价率{:.2f}".format(
            #            total_market, underrate_market, avg_price, avg_premium_ratio)

            avg_prices.append(avg_price)
            avg_premium_ratios.append(avg_premium_ratio)
            total_markets.append(total_market)
            underrate_markets.append(underrate_market)
            days.append(day)

        result = pd.DataFrame(
            {
                'total_markets': total_markets,
                'underrate_markets': underrate_markets,
                'avg_prices': avg_prices,
                'avg_premium_ratios': avg_premium_ratios
            },
            index=days)
        print(result)

        return result
def initialize(context):
    set_benchmark('000300.XSHG')  # 设定比较基准指数
    set_option('use_real_price', True)  # 默认复权模式

    # 设定融资/融券账户
    set_subportfolios(
        [SubPortfolioConfig(cash=context.portfolio.cash, type='stock_margin')])

    # 设定交易成本
    # set_order_cost(OrderCost(open_tax=0, close_tax=0.000, open_commission=0.0000, close_commission=0.0000, close_today_commission=0, min_commission=0), type='stock')
    set_order_cost(OrderCost(open_tax=0,
                             close_tax=0.001,
                             open_commission=0.0003,
                             close_commission=0.0003,
                             close_today_commission=0,
                             min_commission=5),
                   type='stock')

    # 设定融资/融券的利率和保证金比例
    """
    set_option('margincash_interest_rate', 0.00)
    set_option('margincash_margin_rate', 1.0)
    set_option('marginsec_interest_rate', 0.00)
    set_option('marginsec_margin_rate', 1.0)
    """
    set_option('margincash_interest_rate', 0.00)  # 事实上做多可以直接使用普通账户,所以不计这部分利率
    set_option('margincash_margin_rate', 1.0)
    set_option('marginsec_interest_rate', 0.10)
    set_option('marginsec_margin_rate', 1.5)

    # 设置定时运行函数
    run_daily(before_market_open,
              time='before_open',
              reference_security='000300.XSHG')
    run_daily(market_open, time='open', reference_security='000300.XSHG')
    run_daily(after_market_close,
              time='after_close',
              reference_security='000300.XSHG')

    # 记录交易日期及其索引
    g.all_tdays = jqdata.get_all_trade_days()
    g.date_xlat = dict([(doc[1], doc[0]) for doc in enumerate(g.all_tdays)])

    # 设定若干全局变量
    g.elapsed_days = 0
    g.rebalance_today = False
    g.new_long_pos = {}
    g.new_short_pos = {}
Esempio n. 4
0
    def get_stock_beta_history_factors(self, interval=7):
        """
        获取任意指数一段时间的历史 pe,pb 估值列表,通过计算当前的估值在历史估值的百分位,来判断当前市场的估值高低。
        由于加权方式可能不同,可能公开的估值数据有差异,但用于判断估值相对高低没有问题

        input:
            interval: 计算指数估值的间隔天数,增加间隔时间可提高计算性能

        output:
            result:  指数历史估值的 DataFrame,index 为时间,列为pe,pb,roe
        """
        all_days = get_all_trade_days()

        pes = []
        roes = []
        pbs = []
        days = []

        begin = datetime.strptime(self._begin_date, '%Y-%m-%d').date()
        end = datetime.strptime(self._end_date, '%Y-%m-%d').date()
        i = 0
        for day in all_days:
            if (day <= begin or day >= end):
                continue

            i += 1

            if (i % interval != 0):
                continue

            pe, pb, roe = self.get_stock_beta_factor(day)
            if pe and pb and roe:
                pes.append(pe)
                pbs.append(pb)
                roes.append(roe)
                days.append(day)

        result = pd.DataFrame({'pe': pes, 'pb': pbs, 'roe': roes}, index=days)
        return result
Esempio n. 5
0
    set_option('margincash_margin_rate', 1.0)
    set_option('marginsec_interest_rate', 0.00)
    set_option('marginsec_margin_rate', 1.0)
    """
    set_option('margincash_interest_rate', 0.00)  # 事实上做多可以直接使用普通账户,所以不计这部分利率
    set_option('margincash_margin_rate', 1.5)
    set_option('marginsec_interest_rate', 0.10)
    set_option('marginsec_margin_rate', 1.5)
    
    # 设置定时运行函数
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') 
    run_daily(market_open, time='open', reference_security='000300.XSHG')
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')

    # 记录交易日期及其索引
    g.all_tdays = jqdata.get_all_trade_days()
    g.date_xlat = dict([(doc[1], doc[0]) for doc in enumerate(g.all_tdays)])

    # 设定若干全局变量
    g.elapsed_days = 0
    g.rebalance_today = False
    g.new_long_pos = {}
    g.new_short_pos = {}

# 在每个交易日开盘前运行
def before_market_open(context):
    cur_dt = context.current_dt.date()  # 当前日期
    if g.elapsed_days % ADJUST_INTERVAL == 0:  # 是否是调仓日
        log.info("Rebalance at %s", cur_dt)
        g.rebalance_today = True
        idx = g.date_xlat[cur_dt]
Esempio n. 6
0
def prepare_data(start_date, end_date, cut_date):

    # 用沪深300做测试
    test_stock = '000300.XSHG'

    # 测试开始日期和终止日期
    #start_date = datetime.date(2007, 1, 4)
    #end_date = datetime.date(2017, 1, 3)

    # 所有的交易日期
    trading_days = jqdata.get_all_trade_days()
    start_date_index = trading_days.tolist().index(start_date)
    end_date_index = trading_days.tolist().index(end_date)
    cut_date_index = trading_days.tolist().index(cut_date)

    all_data = []
    training_data = []
    testing_data = []

    feature_list = []
    label_list = []
    # 获取所有的数据
    for index in range(start_date_index, end_date_index):

        #计算特征值
        start_day = trading_days[index - 35]
        end_day = trading_days[index]
        stock_data = get_price(test_stock,
                               start_date=start_day,
                               end_date=end_day,
                               frequency='daily',
                               fields=['close', 'high', 'low', 'volume'])
        close_prices = stock_data['close'].values
        high_prices = stock_data['high'].values
        low_prices = stock_data['low'].values
        volumes = stock_data['volume'].values
        #通过数据计算指标
        sma_data = talib.SMA(close_prices)[-1]
        wma_data = talib.WMA(close_prices)[-1]
        mom_data = talib.MOM(close_prices)[-1]
        stck, stcd = talib.STOCH(high_prices, low_prices, close_prices)
        stck_data = stck[-1]
        stcd_data = stcd[-1]

        macd, macdsignal, macdhist = talib.MACD(close_prices)
        macd_data = macd[-1]
        rsi_data = talib.RSI(close_prices, timeperiod=10)[-1]
        willr_data = talib.WILLR(high_prices, low_prices, close_prices)[-1]
        cci_data = talib.CCI(high_prices, low_prices, close_prices)[-1]

        mfi_data = talib.MFI(high_prices, low_prices, close_prices,
                             volumes)[-1]
        obv_data = talib.OBV(close_prices, volumes)[-1]
        roc_data = talib.ROC(close_prices)[-1]
        cmo_data = talib.CMO(close_prices)[-1]

        # 训练数据或者测试数据的输入特征
        features = []
        features.append([sma_data])  #0
        features.append([0])
        features.append([wma_data])  #2
        features.append([0])
        features.append([mom_data])  #4
        features.append([0])
        features.append([stck_data])  #6
        features.append([0])
        features.append([stcd_data])  #8
        features.append([0])
        features.append([macd_data])  #10
        features.append([0])
        features.append([rsi_data])  #12
        features.append([0])
        features.append([willr_data])  #14
        features.append([0])
        features.append([cci_data])  #16
        features.append([0])
        features.append([mfi_data])  #18
        features.append([0])
        features.append([obv_data])  #20
        features.append([0])
        features.append([roc_data])  #22
        features.append([0])
        features.append([cmo_data])  #24
        features.append([0])
        features.append([close_prices[-1]])
        features = np.array(features)

        # 训练数据或者测试的标签数据,就是涨或者跌,涨用[1,0],平或者跌用[0,1]
        label = [[0], [1]]
        if close_prices[-1] > close_prices[-2]:
            label = [[1], [0]]
        elif close_prices[-1] < close_prices[-2]:
            label = [[0], [1]]
        label = np.array(label)

        feature_list.append(features)
        label_list.append(label)

    # 连续数值离散化
    # 从后面开始向前面遍历,第一行数据需要舍弃,range只包含第一个元素,不包含第二个元素
    for index in range(len(feature_list) - 1, 0, -1):
        # SMA
        if feature_list[index][0][0] < feature_list[index][-1][0]:
            feature_list[index][0][0] = 1
            feature_list[index][1][0] = 0
        else:
            feature_list[index][0][0] = 0
            feature_list[index][1][0] = 1
        # WMA
        if feature_list[index][2][0] < feature_list[index][-1][0]:
            feature_list[index][2][0] = 1
            feature_list[index][3][0] = 0
        else:
            feature_list[index][2][0] = 0
            feature_list[index][3][0] = 1
        # MOM
        if feature_list[index][4][0] > 0:
            feature_list[index][4][0] = 1
            feature_list[index][5][0] = 0
        else:
            feature_list[index][4][0] = 0
            feature_list[index][5][0] = 1
        # STCK
        if feature_list[index][6][0] > feature_list[index - 1][6][0]:
            feature_list[index][6][0] = 1
            feature_list[index][7][0] = 0
        else:
            feature_list[index][6][0] = 0
            feature_list[index][7][0] = 1
        # STCD
        if feature_list[index][8][0] > feature_list[index - 1][8][0]:
            feature_list[index][8][0] = 1
            feature_list[index][9][0] = 0
        else:
            feature_list[index][8][0] = 0
            feature_list[index][9][0] = 1
        # MACD
        if feature_list[index][10][0] > feature_list[index - 1][10][0]:
            feature_list[index][10][0] = 1
            feature_list[index][11][0] = 0
        else:
            feature_list[index][10][0] = 0
            feature_list[index][11][0] = 1

        # RSI
        if feature_list[index][12][0] > 70:
            feature_list[index][12][0] = 0
            feature_list[index][13][0] = 1
        elif feature_list[index][12][0] < 30:
            feature_list[index][12][0] = 1
            feature_list[index][13][0] = 0
        else:
            if feature_list[index][12][0] > feature_list[index - 1][12][0]:
                feature_list[index][12][0] = 1
                feature_list[index][13][0] = 0
            else:
                feature_list[index][12][0] = 0
                feature_list[index][13][0] = 1
        # WILLR
        if feature_list[index][14][0] > feature_list[index - 1][14][0]:
            feature_list[index][14][0] = 1
            feature_list[index][15][0] = 0
        else:
            feature_list[index][14][0] = 0
            feature_list[index][15][0] = 1
        # CCI
        if feature_list[index][16][0] > 200:
            feature_list[index][16][0] = 0
            feature_list[index][17][0] = 1
        elif feature_list[index][16][0] < -200:
            feature_list[index][16][0] = 1
            feature_list[index][17][0] = 0
        else:
            if feature_list[index][16][0] > feature_list[index - 1][16][0]:
                feature_list[index][16][0] = 1
                feature_list[index][17][0] = 0
            else:
                feature_list[index][16][0] = 0
                feature_list[index][17][0] = 1

        # MFI
        if feature_list[index][18][0] > 90:
            feature_list[index][18][0] = 0
            feature_list[index][19][0] = 1
        elif feature_list[index][18][0] < 10:
            feature_list[index][18][0] = 1
            feature_list[index][19][0] = 0
        else:
            if feature_list[index][18][0] > feature_list[index - 1][18][0]:
                feature_list[index][18][0] = 1
                feature_list[index][19][0] = 0
            else:
                feature_list[index][18][0] = 0
                feature_list[index][19][0] = 1
        # OBV
        if feature_list[index][20][0] > feature_list[index - 1][20][0]:
            feature_list[index][20][0] = 1
            feature_list[index][21][0] = 0
        else:
            feature_list[index][20][0] = 0
            feature_list[index][21][0] = 1
        # ROC
        if feature_list[index][22][0] > 0:
            feature_list[index][22][0] = 1
            feature_list[index][23][0] = 0
        else:
            feature_list[index][22][0] = 0
            feature_list[index][23][0] = 1
        # CMO
        if feature_list[index][24][0] > 50:
            feature_list[index][24][0] = 0
            feature_list[index][25][0] = 1
        elif feature_list[index][24][0] < -50:
            feature_list[index][24][0] = 1
            feature_list[index][25][0] = 0
        else:
            if feature_list[index][24][0] > feature_list[index - 1][24][0]:
                feature_list[index][24][0] = 1
                feature_list[index][25][0] = 0
            else:
                feature_list[index][24][0] = 0
                feature_list[index][25][0] = 1
        # 删除价格
        feature_list[index] = np.delete(feature_list[index], -1, axis=0)

    for i in range(1, len(feature_list)):
        sample_term = (feature_list[i], label_list[i])
        if 1 + i + start_date_index < cut_date_index:
            training_data.append(sample_term)
        elif 1 + i + start_date_index >= cut_date_index:
            testing_data.append(sample_term)

    print("Data prepared. training data size: {0}, testing data size: {1}".
          format(len(training_data), len(testing_data)))
    return training_data, testing_data