ricequant / rqalpha

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

order_target_percent表现与文档不符,即便资金不足也会按最大限度下单 #659

Open LawrentChen opened 3 years ago

LawrentChen commented 3 years ago

1. RQAlpha的版本

4.5.1

2. Python的版本

3.9

3. 是Windows/Linux/MacOS or others?

MacOS

4. 您出现问题对应的源码/或者能复现问题的简易代码 以及对应的配置

# !usr/bin/env python3
# -*- coding: utf-8 -*-

from rqalpha.apis import *

__config__ = {
    "base": {
        "start_date": "2021-01-01",
        "end_date": "2021-01-31",
        "frequency": "1d",
        "accounts": {
            "stock": 10000000
        },
    }
}

def init(context):
    """
    策略初始化
    """
    pass

def handle_bar(context, bar_dict):
    """
    K线数据更新
    """
    order_target_percent('000001.XSHE', 0.5)
    order_target_percent('000002.XSHE', 0.7)

5. 您出现的错误堆栈日志信息

上述代码分别买入两只股票,仓位比例加总已经超过了 1,在准备购入 000002.XSHE 时已没有足够资金。但实际上它仍会将剩余的 50% 资金全部下单,而且这一过程没有任何显式的提示信息。 这与关于order-target-percent的文档中需要注意,如果资金不足,该API将不会创建发送订单 的描述不符。


另外我发现这一 api 在用于调仓时,还是需要遵循先卖出再买入的顺序以保证资金充足。 比如我第一期分别持有 50% 的 000001.XSHE 和 000002.XSHE,第二期我希望调整至 30% 的 000001.XSHE 和 70% 的000002.XSHE,那第二期的操作就必须是

order_target_percent('000001.XSHE', 0.3)
order_target_percent('000002.XSHE', 0.7)

而不能是

order_target_percent('000002.XSHE', 0.7)
order_target_percent('000001.XSHE', 0.3)

后者不会买入 000002.XSHE,只会卖掉 000001.XSHE

这样比较麻烦,用户就必须每次都逐一判断自己当前持仓比例是高是低,并且显式输入交易顺序,不能单单只是给出下一期的目标比例。

我尝试使用

order_target_portfolio({
            '000002.XSHE': 0.7,
            '000001.XSHE': 0.3
        })

结果也是一样的不会买入 000002.XSHE,只会卖掉 000001.XSHE。希望能有个便捷的 api。

Cheers🍺

Cuizi7 commented 3 years ago

感谢提醒,此处是文档的bug,order_target_percent 的行为如您所见,资金不足时会按最大可用资金下单。 文档已在 develop 分支修复,可查看 https://rqalpha.readthedocs.io/zh_CN/develop/api/base_api.html#order-target-percent

Cuizi7 commented 3 years ago

order_target_portfolio 按您的尝试结果看起来是有 bug。待修复

LawrentChen commented 3 years ago

感谢迅速的反馈,中秋快乐!

LawrentChen commented 3 years ago

额....我又发现 order_value 也是类似的,资金不足的时候是按最大可用资金下单。

mar-heaven commented 2 years ago

@Cuizi7 order_target_percent('000002.XSHE', 0.7) order_target_percent('000001.XSHE', 0.3) 关于这种情况可以加一个api,优先执行卖出,场景也说得过去 ~