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

关于stock_account.py->_handle_dividend_book_closure函数中的dividend_reinvestment #286

Closed tiandian closed 6 years ago

tiandian commented 6 years ago

在stock_account.py中的197行:_handle_dividend_book_closure函数中的通过dividend_reinvestment模拟股票分红再投资, 其代码如下:

    def _handle_dividend_book_closure(self, trading_date):
...
            if config.extra.dividend_reinvestment:
                last_price = Environment.get_instance().data_proxy.get_bar(order_book_id, trading_date).close
                shares = position.quantity * dividend_per_share / last_price
                position._quantity += shares
            else:
...

在上述代码中, 分红再投资是用未复权的昨日收盘价购来买股票, 这是否不太准确的? 是否应该用今日的昨收盘价购买更准确?

Cuizi7 commented 6 years ago

注意上述 trading_date 为股权登记日(book_closure_date),其下一个交易日为除权除息日。 当然真实情况是股息根据交易市场不同到账日期有所不同,但是除权除息日股票价格会发生变化,此处在除权除息日进行再投资也是应该也是一种近似。

tiandian commented 6 years ago

trading_date是股权登记日(昨天), 也就是今天(除权除息日)的前一天.

举个例子: 假设股权登记日帐号情况如下: 1000股, 每股10元, 因此除权除息前总市值是1000*10=10000元

假设分红计划是: 每股分红1元.

那么按照当前rqalpha的计算方式, 到了今天(除权除息日): 总股数是 1000 + 1000 1/10 = 1100股, 除权价格是: 10-1 = 9元, 所以总市值只有11009 = 9900元, 导致除权除息后少了100元. 基本上是相当于市值缩水1%, 这个误差有些大呀.

Cuizi7 commented 6 years ago

按照你说的使用trading_date的昨收也有同样的问题呀。 有更好的处理方式欢迎提出讨论~

tiandian commented 6 years ago

不是使用trading_date的昨收, 而是使用今天(除权除息日)的昨收。

如果使用今日的昨收盘价购买结果如下: 总股数是 1000 + 1000 1/9 = 1111.11...股, 除权价格是: 10-1 = 9元, 所以总市值只有1111.119 = 9999.99..元, 市值没有变化, 所以使用今天(除权除息日)的昨收价购买市值是没有发生变化的。