New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重构 RQAlpha 支持通过 Mod 扩展账户和持仓交易类型 #160

Closed
wh1100717 opened this Issue Jun 17, 2017 · 0 comments

Comments

Projects
None yet
1 participant
@wh1100717
Member

wh1100717 commented Jun 17, 2017

通过重构 RQAlpha 实现如下目标:

可以扩展账户类型

在 RQAlpha 中存在 ACCOUNT_TYPE 的 Enum 作为账户类型,但这种方式使得账户类型已经固定,不能进行扩展,因此进行如下修改.

  • 修改 ACCOUNT_TYPEDEFAULT_ACCOUNT_TYPE
  • 所有涉及到账户类型的字典数据中,不再使用 Enum 类型作为 key,而是使用对应的 name 作为 key
  • 增加 Environment.get_instance().account_type_dict 用于存储所有的 ACCOUNT_TYPE 及对应的 value
  • 增加 Environment.get_instance().register_account_type(account_type, value) 函数用于注册账户类型

比如,进行火币网账户扩展,我们可以通过构建一个 Mod 来实现对应的账户扩展

from rqalpha.interface import AbstractMod
from rqalpha.const import CustomEnum


class CUSTOM_ACCOUNT_TYPE(CustomEnum):
    HUOBI = 200


class CustomAccountMod(AbstractMod):
    def start_up(self, env, mod_config):
        # 扩展账户
        env.register_account_type(CUSTOM_ACCOUNT_TYPE.HUOBI.name, CUSTOM_ACCOUNT_TYPE.HUOBI.value)

可以扩展 AccountModel 和 PositionModel

不同标的类型的账户,其计算逻辑可能并不相同,因此进行如下修改,是您可以构建自定义的账户和持仓来满足定制化的业务需求。

  • 定义 AbstractAccountAbstractPosition 接口, 您扩展的 Account 和 Position 需要实现对应接口,从而保证 RQAlpha 可以争取而处理
  • 增加 Environment.get_instance().set_account_model(account_type, AccountModel) 来注册 AccountModel
  • 增加 Environment.get_instance().set_position_model(account_type, PositionModel) 来注册 PositionModel
  • 您可以通过 Environment.get_instance().get_account_model(account_type)/get_position_model(account) 来获取对应的 Model

比如,扩展火币网账户和持仓

from rqalpha.interface import AbstractMod, AbstractAccount, AbstractPosition
from rqalpha.const import CustomEnum


class CUSTOM_ACCOUNT_TYPE(CustomEnum):
    HUOBI = 200


class HUOBIAccount(AbstractAccount):
    ...


class HUOBIPosition(AbstractPosition):
    ...


class CustomAccountMod(AbstractMod):
    def start_up(self, env, mod_config):
        # 扩展 account_type
        env.register_account_type(CUSTOM_ACCOUNT_TYPE.HUOBI.name, CUSTOM_ACCOUNT_TYPE.HUOBI.value)
        # 扩展 AccountModel
        env.set_account_model(CUSTOM_ACCOUNT_TYPE.HUOBI.name, HUOBIAccount)
        # 扩展 PositionModel
        env.set_position_model(CUSTOM_ACCOUNT_TYPE.HUOBI.name, HUOBIPosition)

orderorder_to 函数可以支持该账户的下单操作

RQAlpha 提供了 orderorder_to 作为通用性的下单函数,如果要进行了自定义账户的话,需要提供对应的下单逻辑支持。

鉴于此,增加 Environment.get_instance().set_smart_order(account_type, smart_order) 函数,orderorder_to 会根据 order_book_id 自动选择对应 account_typesmart_order 函数来执行下单逻辑

如下示例

from rqalpha.const import SIDE, ORDER_TYPE
from rqalpha.environment import Environment
from rqalpha.model.order import Order, MarketOrder, LimitOrder
from rqalpha.interface import AbstractMod, AbstractAccount, AbstractPosition
from rqalpha.const import CustomEnum


class CUSTOM_ACCOUNT_TYPE(CustomEnum):
    HUOBI = 200


class HUOBIAccount(AbstractAccount):
    def order(self, order_book_id, quantity, style, target=False):
        position = self.positions[order_book_id]
        env = Environment.get_instance()
        position = env.portfolio.positions[order_book_id]
        if target:
            # For order_to
            quantity = quantity - position.quantity

        if quantity == 0:
            return None
        elif quantity > 0:
            side = SIDE.BUY
        else:
            side = SIDE.SELL

        price = env.get_last_price(order_book_id)

        r_order = Order.__from_create__(order_book_id, quantity, side, style)

        if r_order.type == ORDER_TYPE.MARKET:
            r_order.set_frozen_price(price)
        if env.can_submit_order(r_order):
            env.broker.submit_order(r_order)

        return r_order
    ...


class HUOBIPosition(AbstractPosition):
    ...


class CustomAccountMod(AbstractMod):
    def start_up(self, env, mod_config):
        # 扩展 account_type
        env.register_account_type(CUSTOM_ACCOUNT_TYPE.HUOBI.name, CUSTOM_ACCOUNT_TYPE.HUOBI.value)
        # 扩展 AccountModel
        env.set_account_model(CUSTOM_ACCOUNT_TYPE.HUOBI.name, HUOBIAccount)
        # 扩展 PositionModel
        env.set_position_model(CUSTOM_ACCOUNT_TYPE.HUOBI.name, HUOBIPosition)

增加对应自定义账户及其初始资金的配置支持

RQAlpha 通过 --security 以及 --stock-starting-cash | --future-starting-cash 来设置策略交易标的及对应的初始资金。

或者通过如下配置进行

__config__ = {
  "securities": ['stock', 'future'],
  "stock_starting_cash": 100000,
  "future_starting_cash": 200000
}

这种方式的设置无法进行自定义账户的扩展,因此更改设置方式如下:

  • 命令行放弃使用 --security | --stock-starting-cash | --future-starting-cash, 改为使用 -a/--account account_type starting_cash, 具体使用方式如下:
rqalpha run --acount stock 100000 --account future 200000 --account huobi 300000
  • 配置文件或者直接在策略中进行配置取消 securities | stock_starting_cash | future_starting_cash, 改为使用 accounts, 具体配置如下:
__config__ = {
    "base": {
        "start_date": "2015-01-09",
        "end_date": "2015-03-09",
        "frequency": "1d",
        "matching_type": "current_bar",
        "benchmark": None,
        "accounts": {
            "stock": 20000,
            "future": 1000000
        }
    }
}

以上的修改内容 会对已存在的 Mod 产生比较大影响,甚至可能导致运行失败,但为了获得更好的扩展性,建议了解 breaking change 并进行升级。

以上更改目前还在 develop 分支开发和测试,最终 Release 版本 为 3.0.0

@wh1100717 wh1100717 self-assigned this Jun 17, 2017

@wh1100717 wh1100717 added this to the 3.0.0 milestone Jun 17, 2017

@wh1100717 wh1100717 closed this Jul 10, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment