ricequant / rqalpha

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

关于账户(Account)资金计算逻辑的一个疑问 #864

Closed chechi closed 7 months ago

chechi commented 8 months ago

1. RQAlpha的版本 github master

2. Python的版本 3.10

3. 是Windows/Linux/MacOS or others? mac

在Account类中有出入金的逻辑 account.py 318 行

    def _on_before_trading(self, _):
        for order_book_id, positions in list(self._positions.items()):
            if all(p.quantity == 0 and p.equity == 0 for p in six.itervalues(positions)):
                del self._positions[order_book_id]

        trading_date = self._env.trading_dt.date()
        while self._pending_deposit_withdraw and self._pending_deposit_withdraw[0][0].date() <= trading_date:
            _, amount = self._pending_deposit_withdraw.pop(0)
            self._total_cash += amount

        for position in self._iter_pos():
            self._total_cash += position.before_trading(trading_date)

        # 负债自增利息
        if self._cash_liabilities > 0:
            self._cash_liabilities += self.cash_liabilities_interest

account 281 行

    @property
    def total_value(self) -> float:
        """
        账户总权益
        """
        total_value = self._total_cash + self.position_equity - self.cash_liabilities - self.cash_liabilities_interest
        if self._pending_deposit_withdraw:
            total_value += sum(amount for _, amount in self._pending_deposit_withdraw)
        return total_value

这是连个开发人员写的程序,在计算回测指标的时候,比如on_bar 事件中 有出入金操作,在计算回报率的时候出入金没有加入到self._total_cash 账户总资金中,而在计算 _total_cash 的收通过_on_before_trading 事件计算,如果不按照严格的时间事件的顺序执行,涉及到 账户总资金(_total_cash )和账户总权益的计算 total_value 会不会有业务上的计算错误,如果按照时间事件顺序严格执行,保证执行顺序,是否可以把两个计算业务合并在一起?

chechi commented 8 months ago

连个计算业务是独立,需要记录出入金的记录吧?实盘操作没有记录,造成资金进出不清晰,复盘的时候没有记录,框架用来起不方便。或者增加例如zipline的交易记录API也可以。查看回测报告比较直观

Cuizi7 commented 7 months ago

没完全理解你的疑问在哪里。 调用出入金的时候要么直接调整资金、要么调整_pending_deposit_withdraw(延迟到账的情况),这两种情况下份额和净资产都会同时的变化,不影响收益率。 对于延迟到账的情况_on_before_trading中会把“钱”从_pending_deposit_withdraw挪到 total_cash 中,不改变净资产,亦不会影响收益率。