ricequant / rqalpha

A extendable, replaceable Python algorithmic backtest && trading framework supporting multiple securities
http://rqalpha.io
Other
5.39k stars 1.62k forks source link

如何设置同时购物股票和期货,另外期货购买如何进行回测 #93

Closed cnmike closed 7 years ago

cnmike commented 7 years ago

"securities": ["stock", "future"],设置了,但是只生效期货,股票就没办法交易

wh1100717 commented 7 years ago

@cnmike 请贴一下配置信息和简易可复现问题的策略代码,我们好查询问题

cnmike commented 7 years ago
from rqalpha.api import *

# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
    logger.info("init")
    context.s1 = "000300.XSHG"
    context.s2 = "AU1702"
    context.s3 = "FU1702"
    update_universe(context.s1)
    subscribe(context.s2)
    subscribe(context.s3)
    # 是否已发送了order
    context.fired = False

def before_trading(context):
    pass

# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
    # 开始编写你的主要的算法逻辑

    # bar_dict[order_book_id] 可以拿到某个证券的bar信息
    # context.portfolio 可以拿到现在的投资组合状态信息

    # 使用order_shares(id_or_ins, amount)方法进行落单

    # TODO: 开始编写你的算法吧!
    if not context.fired:
        # order_percent并且传入1代表买入该股票并且使其占有投资组合的100%
        order_percent(context.s1, 1)
        buy_open(context.s2, 1)
        buy_open(context.s3, 1)
        context.fired = True

__config__ = {
    "base": {
        "securities": ["future","stock"],
        "start_date": "2016-06-01",
        "end_date": "2017-01-01",
        "frequency": "1d",
        "stock_starting_cash":  1000000,
        "future_starting_cash": 1000000,
        "benchmark": "000300.XSHG",
    },
    "extra": {
        "log_level": "debug",
    },
    "mod": {
        "sys_progress": {
            "enabled": True,
            "show": True,
        },
        "sys_simulation": {
            "commission_multiplier": 0.01,
            "matching_type": "next_bar",
        }
    },
}
wh1100717 commented 7 years ago

@cnmike 我在本地测试是没问题的啊。你在 handle_bar 输出一下 positions 查看一下

def handle_bar(context, bar_dict):
    if not context.fired:
        # order_percent并且传入1代表买入该股票并且使其占有投资组合的100%
        order_percent(context.s1, 1)
        buy_open(context.s2, 1)
        buy_open(context.s3, 1)
        context.fired = True
    logger.info(context.portfolio.positions.keys())

我这边的输出结果:

image

cnmike commented 7 years ago

这里就有问题,为什么2016-06-01号打出来的context.portfolio.positions.keys()),只有一支股票

hzliu commented 7 years ago

2016-06-01打印只有一只股票,但是数量是0,实际上是没有仓位的。因为你设置的是 next_bar 撮合。develop 分支去掉了这个0仓位

wh1100717 commented 7 years ago

@cnmike 我只是举个例子 说明的是可以同时交易股票和期货的。你自己测试一下就知道了。这个不算是Bug,如果选择next_bar 的撮合方式,当前创建订单以后中会生成持仓为0的Position, 所以logger.info(context.portfolio.positions.keys()) 会输出股票的key。

你的主要问题不是只能购买期货,不能交易股票吗?

cnmike commented 7 years ago

主要问题是购买期货和交易股票,但是没办法出回测结果

wh1100717 commented 7 years ago

无法复现,关闭此issue