Commit f1d06bf7 authored by wenwen.tang's avatar wenwen.tang 😕

回测nav的计算用复权净值

parent 4ca198df
import datetime
import json import json
import logging import logging
from datetime import datetime as dt, date from datetime import datetime as dt, date
...@@ -199,13 +200,16 @@ class DividendPortfoliosHolder(PortfoliosHolder): ...@@ -199,13 +200,16 @@ class DividendPortfoliosHolder(PortfoliosHolder):
}) })
def get_navs_and_div(self, day, fund_ids): def get_navs_and_div(self, day, fund_ids):
navs = pd.DataFrame(self._navs.get_fund_navs(fund_ids=fund_ids, max_date=day)) navs = pd.DataFrame(
self._navs.get_fund_navs(fund_ids=fund_ids, max_date=day, min_date=day - datetime.timedelta(22)))
dividend = navs.pivot_table(index='nav_date', columns='fund_id', values='dividend') dividend = navs.pivot_table(index='nav_date', columns='fund_id', values='dividend')
nav_cal = navs.pivot_table(index='nav_date', columns='fund_id', values='nav_cal')
navs = navs.pivot_table(index='nav_date', columns='fund_id', values='av') navs = navs.pivot_table(index='nav_date', columns='fund_id', values='av')
navs.fillna(method='ffill', inplace=True) navs.fillna(method='ffill', inplace=True)
nav_cal.fillna(method='ffill', inplace=True)
dividend.fillna(value=0, inplace=True) dividend.fillna(value=0, inplace=True)
dividend = dividend.reindex(pd.date_range(start=dividend.index.min(), end=day, freq='D'), fill_value=0) dividend = dividend.reindex(pd.date_range(start=dividend.index.min(), end=day, freq='D'), fill_value=0)
return dict(navs.iloc[-1]), dict(dividend.iloc[-1]) return dict(navs.iloc[-1]), dict(dividend.iloc[-1]), dict(nav_cal.iloc[-1])
def clear(self, day=None, risk: PortfoliosRisk = None): def clear(self, day=None, risk: PortfoliosRisk = None):
rhp.delete(min_date=day, risk=risk) rhp.delete(min_date=day, risk=risk)
...@@ -245,12 +249,14 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -245,12 +249,14 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(set(weight) | set(share)), day=day) fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(set(weight) | set(share)), day=day)
navs = fund_div_tuple[0] navs = fund_div_tuple[0]
fund_dividend = fund_div_tuple[1] fund_dividend = fund_div_tuple[1]
nav_cals = fund_div_tuple[2]
fund_dividend_nav = sum( fund_dividend_nav = sum(
map(lambda k: share_nav[k] * fund_dividend[k], filter(lambda k: k in fund_dividend, share_nav.keys()))) map(lambda k: share_nav[k] * fund_dividend[k], filter(lambda k: k in fund_dividend, share_nav.keys())))
fund_dividend = sum( fund_dividend = sum(
map(lambda k: share[k] * fund_dividend[k], filter(lambda k: k in fund_dividend, share.keys()))) map(lambda k: share[k] * fund_dividend[k], filter(lambda k: k in fund_dividend, share.keys())))
dividend_acc = last_nav['div_acc'] + fund_dividend dividend_acc = last_nav['div_acc'] + fund_dividend
fund_av = round(sum([navs[x] * y for x, y in share.items()]), 4) fund_av = round(sum([navs[x] * y for x, y in share.items()]), 4)
nav = round(sum([nav_cals[x] * y for x, y in share.items()]), 4)
fund_nav = round(sum([navs[x] * y for x, y in share_nav.items()]), 4) fund_nav = round(sum([navs[x] * y for x, y in share_nav.items()]), 4)
fund_nav += fund_dividend_nav fund_nav += fund_dividend_nav
asset_nav = fund_av asset_nav = fund_av
...@@ -262,6 +268,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -262,6 +268,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
else: else:
fund_av = self.init_nav fund_av = self.init_nav
asset_nav = self.init_nav asset_nav = self.init_nav
nav = self.init_nav
fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(weight), day=day) fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(weight), day=day)
navs = fund_div_tuple[0] navs = fund_div_tuple[0]
# 首次配息金额,做记录 # 首次配息金额,做记录
...@@ -291,7 +298,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -291,7 +298,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
}, },
'fund_av': fund_av, 'fund_av': fund_av,
'fund_nav': fund_nav, 'fund_nav': fund_nav,
'nav': 0, 'nav': nav,
'port_div': 0, 'port_div': 0,
'asset_nav': asset_nav, 'asset_nav': asset_nav,
}) })
...@@ -310,6 +317,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -310,6 +317,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(share), day=day) fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(share), day=day)
navs = fund_div_tuple[0] navs = fund_div_tuple[0]
fund_dividend = fund_div_tuple[1] fund_dividend = fund_div_tuple[1]
nav_cals = fund_div_tuple[2]
# 配息当天配股 # 配息当天配股
for k in share_nav.keys(): for k in share_nav.keys():
if k in fund_dividend: if k in fund_dividend:
...@@ -325,6 +333,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -325,6 +333,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
map(lambda k: share[k] * fund_dividend[k], filter(lambda k: k in fund_dividend, share.keys()))) map(lambda k: share[k] * fund_dividend[k], filter(lambda k: k in fund_dividend, share.keys())))
dividend_acc = dividend_acc + port_div + fund_dividend dividend_acc = dividend_acc + port_div + fund_dividend
fund_av = round(sum([navs[x] * y for x, y in share.items()]), 4) fund_av = round(sum([navs[x] * y for x, y in share.items()]), 4)
nav = round(sum([nav_cals[x] * y for x, y in share.items()]), 4)
fund_nav = round(sum([navs[x] * y for x, y in share_nav.items()]), 4) fund_nav = round(sum([navs[x] * y for x, y in share_nav.items()]), 4)
weight = {x: round(y * navs[x] / fund_av, 2) for x, y in share.items()} weight = {x: round(y * navs[x] / fund_av, 2) for x, y in share.items()}
weight_nav = {x: round(y * navs[x] / fund_av, 2) for x, y in share_nav.items()} weight_nav = {x: round(y * navs[x] / fund_av, 2) for x, y in share_nav.items()}
...@@ -350,7 +359,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -350,7 +359,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
}, },
'fund_av': fund_av, 'fund_av': fund_av,
'fund_nav': fund_nav, 'fund_nav': fund_nav,
'nav': 0, 'nav': nav,
'port_div': port_div, 'port_div': port_div,
'asset_nav': asset_nav, 'asset_nav': asset_nav,
}) })
...@@ -380,7 +389,6 @@ class DivHoldReportor(RoboReportor): ...@@ -380,7 +389,6 @@ class DivHoldReportor(RoboReportor):
if not holds.empty: if not holds.empty:
holds['signal_type'] = 'INIT' holds['signal_type'] = 'INIT'
holds['real_av'] = holds['asset_nav'] holds['real_av'] = holds['asset_nav']
holds['nav'] = holds['acc_av']
holds = holds[ holds = holds[
['date', 'signal_type', 'fund_av', 'fund_nav', 'fund_div', 'cash', 'real_av', 'port_div', 'div_acc', ['date', 'signal_type', 'fund_av', 'fund_nav', 'fund_div', 'cash', 'real_av', 'port_div', 'div_acc',
'acc_av', 'nav']] 'acc_av', 'nav']]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment