示例#1
0
    def handle_data(self, data):
        from zipline.api import (
            order_percent,
            order_target,
            order_target_percent,
            order_target_value,
            order_value,
        )

        for style in [
                MarketOrder(),
                LimitOrder(10),
                StopOrder(10),
                StopLimitOrder(10, 10)
        ]:

            with assert_raises(UnsupportedOrderParameters):
                order(self.asset, 10, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order(self.asset, 10, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_value(self.asset, 300, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_value(self.asset, 300, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_percent(self.asset, .1, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_percent(self.asset, .1, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target(self.asset, 100, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target(self.asset, 100, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_value(self.asset,
                                   100,
                                   limit_price=10,
                                   style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_value(self.asset, 100, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_percent(self.asset,
                                     .2,
                                     limit_price=10,
                                     style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_percent(self.asset,
                                     .2,
                                     stop_price=10,
                                     style=style)
示例#2
0
def rebalance(context, data):
    """
    Execute orders according to our schedule_function() timing.
    """

    # calculate intraday returns for our winners
    current_prices = data.current(context.winners, "price")
    prior_closes = data.history(context.winners, "close", 2, "1d").iloc[0]
    intraday_returns = (current_prices - prior_closes) / prior_closes

    positions = context.portfolio.positions

    # Exit positions we no longer want to hold
    for asset, position in positions.items():
        if asset not in context.winners:
            algo.order_target_value(asset, 0, style=MarketOrder())

    # Enter long positions
    for asset in context.winners:

        # if already long, nothing to do
        if asset in positions:
            continue

        # if the stock is up for the day, don't enter
        if intraday_returns[asset] > 0:
            continue

        # otherwise, buy a fixed $100K position per asset
        algo.order_target_value(asset, 100e3, style=MarketOrder())
示例#3
0
def rebalance(context, data):
    history = data.history(assets=context.asset,
                           fields=['close'],
                           bar_count=10,
                           frequency='1d')
    date = history.index.values[-1]
    close = history['close'].values
    print("===============================================================")
    print("持仓数 amount=", context.portfolio.positions[symbol('IBM')].amount)
    print("每股成本 cost_basis=",
          context.portfolio.positions[symbol('IBM')].cost_basis)
    print("最新价格 last_sale_price=",
          context.portfolio.positions[symbol('IBM')].last_sale_price)
    print("能否交易 can_trade=", data.can_trade(context.asset))
    print("current price=", data.current(context.asset, 'close'))

    print("使用现金 capital_used=", context.portfolio.capital_used)
    print("剩余现金 cash=", context.portfolio.cash)
    print("今日收益 pnl=", context.portfolio.pnl)
    print("收益率 returns=", context.portfolio.returns)
    print("起始现金 starting_cash=", context.portfolio.starting_cash)
    print("总市值 portfolio_value=", context.portfolio.portfolio_value)
    print("持仓市值 positions_value=", context.portfolio.positions_value)

    amount = context.portfolio.positions[symbol('IBM')].amount
    if amount == 0:
        order_id = order_target_value(context.asset, 200)
    else:
        order_id = order_target_value(context.asset, 400)
    print("order_id==>", order_id)
示例#4
0
    def handle_data(self, data):
        from zipline.api import (
            order_percent,
            order_target,
            order_target_percent,
            order_target_value,
            order_value,
        )

        for style in [MarketOrder(), LimitOrder(10),
                      StopOrder(10), StopLimitOrder(10, 10)]:

            with assert_raises(UnsupportedOrderParameters):
                order(self.asset, 10, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order(self.asset, 10, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_value(self.asset, 300, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_value(self.asset, 300, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_percent(self.asset, .1, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_percent(self.asset, .1, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target(self.asset, 100, limit_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target(self.asset, 100, stop_price=10, style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_value(self.asset, 100,
                                   limit_price=10,
                                   style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_value(self.asset, 100,
                                   stop_price=10,
                                   style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_percent(self.asset, .2,
                                     limit_price=10,
                                     style=style)

            with assert_raises(UnsupportedOrderParameters):
                order_target_percent(self.asset, .2,
                                     stop_price=10,
                                     style=style)
def handle_data(context, data):
    c = context
    for position in c.portfolio.positions.itervalues():
        if position.amount == 0:
            if position.asset.symbol in c.stops:
                del c.stops[position.asset.symbol]
            continue
        elif position.asset.symbol not in c.stops:
            stoploss = c.stoploss if position.amount > 0 else -c.stoploss
            c.stops[position.asset.symbol] = position.last_sale_price * (
                1 - stoploss)
            # log.info(' ! I have added '+str(position.asset.symbol)+' to Stops @ '+str((position.last_sale_price)*(1-stoploss)))
        elif c.stops[
                position.asset.
                symbol] > position.last_sale_price and position.amount > 0:
            # sell
            log.info(' ! ' + str(position.asset.symbol) +
                     '- (Long) has hit stoploss @ ' +
                     str(position.last_sale_price))
            if not get_open_orders(position.sid):
                order_target_value(position.sid, 0.0)
                c.stoppedout.append(position.asset.symbol)
                del c.stops[position.asset.symbol]
        elif c.stops[
                position.asset.
                symbol] < position.last_sale_price and position.amount < 0:
            # sell
            log.info(' ! ' + str(position.asset.symbol) +
                     '- (Short) has hit stoploss @ ' +
                     str(position.last_sale_price))
            if not get_open_orders(position.sid):
                order_target_value(position.sid, 0.0)
                c.stoppedout.append(position.asset.symbol)
                del c.stops[position.asset.symbol]
        elif c.stops[position.asset.symbol] < position.last_sale_price * (
                1 - c.stoploss) and position.amount > 0:
            c.stops[position.asset.symbol] = position.last_sale_price * (
                1 - c.stoploss)
            # log.info(' ! I have updated '+str(position.asset.symbol)+'- (Long) to stop @ '+str((position.last_sale_price)*(1- c.stoploss)))
        elif c.stops[position.asset.symbol] > position.last_sale_price * (
                1 + c.stoploss) and position.amount < 0:
            c.stops[position.asset.symbol] = position.last_sale_price * (
                1 + c.stoploss)
示例#6
0
def bonds(context, data):
    logger.debug('buying bonds on: %s', algo.get_datetime())
    logger.debug('num open orders: %s', len(algo.get_open_orders()))
    logger.debug('len existing portfolio (afer ejection): %s',
                 len(context.portfolio.positions))
    logger.debug('cash: %s', context.portfolio.cash)
    logger.debug('portfolio_value: %s', context.portfolio.portfolio_value)
    logger.debug('num_positions: %s', len(context.portfolio.positions))
    logger.debug('positions: %s', context.portfolio.positions)

    if logger.level is logging.DEBUG:
        for equity, values in context.portfolio.positions.items():
            logger.debug(
                'context.portfolio.positions - equity: %s, amount: %s, cost_basis: %s, sold_on: %s, sold_at_price: %s',
                equity, values.amount, values.cost_basis,
                values.last_sale_date, values.last_sale_price)

    if context.portfolio.cash > 0 and context.trend_filter is False:
        logger.debug('converting all cash to bonds')
        order_target_value(algo.sid('FIBBG000NTFYM5'), context.portfolio.cash)
示例#7
0
def rebalance(context, data):
    history = data.history(context.asset, ['close', 'high', 'low', 'open'],
                           context.T + 1, '1d')

    # 获取当前持仓数
    current_position = context.portfolio.positions[context.asset].amount
    print("当前持仓数==>%d" % current_position)

    # 获取当前行情数据
    price = data.current(context.asset, 'close')
    record(price=price)

    # 1 计算ATR
    atr = calc_atr(history.iloc[:len(history) - 1])

    # 2 判断加仓或止损
    if context.hold_flag is True and current_position > 0:  # 先判断是否持仓
        temp = add_or_stop(price, context.last_buy_price, atr, context)
        if temp == 1:  # 判断加仓
            if context.add_time < context.limit_unit:  # 判断加仓次数是否超过上限
                print("产生加仓信号")
                cash_amount = min(context.portfolio.cash,
                                  context.unit * price)  # 不够1unit时买入剩下全部
                context.last_buy_price = price
                if cash_amount >= price:
                    context.add_time += 1
                    print("正在买入 %s" % context.asset)
                    print("下单金额为 %s 元" % cash_amount)
                    order_target_value(
                        context.asset,
                        context.portfolio.positions_value + cash_amount)
                else:
                    print("订单无效,下单金额小于交易所最小交易金额")
            else:
                print("加仓次数已经达到上限,不会加仓")
        elif temp == -1:  # 判断止损
            # 重新初始化参数!重新初始化参数!重新初始化参数!非常重要!
            init_local_context(context)
            # 卖出止损
            print("产生止损信号")
            print("正在卖出 %s" % context.asset)
            print("卖出数量为 %s" % current_position)
            order_target_percent(context.asset, 0.0)

    # 3 判断入场离场
    else:
        out = in_or_out(context, history.iloc[:len(history) - 1], price,
                        context.T)
        if out == 1:  # 入场
            if context.hold_flag is False:
                value = context.portfolio.cash * 0.01
                context.unit = calc_unit(value, atr)
                print('unit===>%d, atr===>%d' % (context.unit, atr))
                context.add_time = 1
                context.hold_flag = True
                context.last_buy_price = price
                cash_amount = min(context.portfolio.cash, context.unit * price)
                # 有买入信号,执行买入
                print("产生入场信号")
                print("正在买入 %s" % context.asset)
                print("下单金额为 %s 元" % cash_amount)
                order_target_value(context.asset, cash_amount)
            else:
                print("已经入场,不产生入场信号")
        elif out == -1:  # 离场
            if context.hold_flag is True:
                if current_position >= 1:
                    print("产生止盈离场信号")
                    # 重新初始化参数
                    init_local_context(context)
                    # 有卖出信号,且持有仓位,则市价单全仓卖出
                    print("正在卖出 %s" % context.asset)
                    print("卖出数量为 %s" % current_position)
                    order_target_percent(context.asset, 0.0)
            else:
                print("尚未入场或已经离场,不产生离场信号")
示例#8
0
def rebalance(context, data):
    current_position = context.portfolio.positions[context.asset].amount

    if context.stop_loss_triggered:
        print("已触发止损线, 此bar不会有任何指令 ... ")
        return

    if context.stop_win_triggered:
        print("已触发止盈线, 此bar不会有任何指令 ... ")
        return

    # 检查是否到达止损线或者止盈线,如果是,强制平仓,并结束所有操作
    if context.portfolio.portfolio_value < context.portfolio_stop_loss * context.portfolio.starting_cash or context.portfolio.portfolio_value > context.portfolio_stop_win * context.portfolio.starting_cash:
        should_stopped = True
    else:
        should_stopped = False

    # 如果有止盈/止损信号,则强制平仓,并结束所有操作
    if should_stopped:
        # 低于止损线,需要止损
        if context.portfolio.portfolio_value < context.portfolio_stop_loss * context.portfolio.starting_cash:
            print(
                "当前净资产:%.2f 位于止损线下方 (%f), 初始资产:%.2f, 触发止损动作" %
                (context.portfolio.portfolio_value, context.portfolio_stop_loss,
                context.portfolio.starting_cash))
            context.stop_loss_triggered = True
        # 高于止盈线,需要止盈
        else:
            print(
                "当前净资产:%.2f 位于止盈线上方 (%f), 初始资产:%.2f, 触发止盈动作" %
                (context.portfolio.portfolio_value, context.portfolio_stop_win,
                context.portfolio.starting_cash))
            context.stop_win_triggered = True

        if context.stop_loss_triggered:
            print("设置 stop_loss_triggered(已触发止损信号)为真")
        else:
            print("设置 stop_win_triggered (已触发止损信号)为真")

        # 有止盈/止损,且当前有仓位,则强平所有仓位
        if current_position > 0:
            print("正在卖出 %s" % context.asset)
            order_target_percent(context.asset, 0.0)
        return

    # 获取当前价格
    price = data[context.asset].price
    record(price=price)

    # 设置网格策略基础价格(base_price)
    if context.base_price is None:
        # 获取历史数据, 取后sma_window_size根bar
        history = data.history(context.asset, ['close'], context.sma_window_size, '1d')
        if len(history.index) < context.sma_window_size:
            print("bar的数量不足, 等待下一根bar...")
            return
        # 计算sma均线值
        sma = ta.SMA(history['close'].values, timeperiod=context.sma_window_size)[-1]
        # 若当前价格满足条件,则设置当前价格为基础价
        if price < context.price_to_sma_threshold * sma and context.base_price is None:
            context.base_price = price
            # 在基础价格位置建仓,仓位为50%
            print("建仓中...")
            cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0.5, context.portfolio.cash)
            print("正在买入 %s" % context.asset)
            print("下单金额为 %s 元" % cash_to_spent)
            order_target_value(context.asset, cash_to_spent)
            return

    # 还没有找到base_price,则继续找,不着急建仓
    if context.base_price is None:
        print("尚未找到合适的基准价格,进入下一根bar")
        return

    cash_to_spent = 0

    # 计算为达到目标仓位需要买入/卖出的金额
    # 价格低于buy4所对应的价格时,仓位调至100%
    if price / context.base_price < context.buy4:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 1, context.portfolio.cash)
    # 价格大于等于buy4对应的价格,低于buy3所对应的价格时,仓位调至90%
    elif price / context.base_price < context.buy3:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0.9, context.portfolio.cash)
    # 价格大于等于buy3对应的价格,低于buy2所对应的价格时,仓位调至70%
    elif price / context.base_price < context.buy2:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0.7, context.portfolio.cash)
    # 价格大于等于buy2对应的价格,低于buy1所对应的价格时,仓位调至60%
    elif price / context.base_price < context.buy1:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0.6, context.portfolio.cash)
    # 价格大于sell4对应的价格,仓位调至0%
    elif price / context.base_price > context.sell4:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0, context.portfolio.cash)
    # 价格小于等于sell4对应的价格,大于sell3所对应的价格时,仓位调至10%
    elif price / context.base_price > context.sell3:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0.1, context.portfolio.cash)
    # 价格小于等于sell3对应的价格,大于sell2所对应的价格时,仓位调至30%
    elif price / context.base_price > context.sell2:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0.3, context.portfolio.cash)
    # 价格小于等于sell2对应的价格,大于sell1所对应的价格时,仓位调至40%
    elif price / context.base_price > context.sell1:
        cash_to_spent = cash_to_spent_fn(context.portfolio.portfolio_value, 0.4, context.portfolio.cash)

    # 根据策略调整仓位
    if cash_to_spent > price:
        #  市价单买入一定金额
        print("正在买入 %s" % context.asset)
        print("下单金额为 %s 元" % str(cash_to_spent))
        order_target_value(context.asset, context.portfolio.positions_value + cash_to_spent)
    elif cash_to_spent < 0:
        #  计算需要卖出的数量,并已市价单卖出
        quantity = min(current_position, -1 * cash_to_spent / price)
        if quantity > 1:
            print("正在卖出 %d 股" % int(quantity))
            order_target(context.asset, current_position - int(quantity))