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

回测nav的计算用复权净值

parent 4ca198df
import datetime
import json
import logging
from datetime import datetime as dt, date
......@@ -199,13 +200,16 @@ class DividendPortfoliosHolder(PortfoliosHolder):
})
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')
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.fillna(method='ffill', inplace=True)
nav_cal.fillna(method='ffill', 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)
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):
rhp.delete(min_date=day, risk=risk)
......@@ -245,12 +249,14 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(set(weight) | set(share)), day=day)
navs = fund_div_tuple[0]
fund_dividend = fund_div_tuple[1]
nav_cals = fund_div_tuple[2]
fund_dividend_nav = sum(
map(lambda k: share_nav[k] * fund_dividend[k], filter(lambda k: k in fund_dividend, share_nav.keys())))
fund_dividend = sum(
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
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 += fund_dividend_nav
asset_nav = fund_av
......@@ -262,6 +268,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
else:
fund_av = 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)
navs = fund_div_tuple[0]
# 首次配息金额,做记录
......@@ -291,7 +298,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
},
'fund_av': fund_av,
'fund_nav': fund_nav,
'nav': 0,
'nav': nav,
'port_div': 0,
'asset_nav': asset_nav,
})
......@@ -310,6 +317,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
fund_div_tuple = self.get_navs_and_div(fund_ids=tuple(share), day=day)
navs = fund_div_tuple[0]
fund_dividend = fund_div_tuple[1]
nav_cals = fund_div_tuple[2]
# 配息当天配股
for k in share_nav.keys():
if k in fund_dividend:
......@@ -325,6 +333,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
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
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)
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()}
......@@ -350,7 +359,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
},
'fund_av': fund_av,
'fund_nav': fund_nav,
'nav': 0,
'nav': nav,
'port_div': port_div,
'asset_nav': asset_nav,
})
......@@ -380,7 +389,6 @@ class DivHoldReportor(RoboReportor):
if not holds.empty:
holds['signal_type'] = 'INIT'
holds['real_av'] = holds['asset_nav']
holds['nav'] = holds['acc_av']
holds = holds[
['date', 'signal_type', 'fund_av', 'fund_nav', 'fund_div', 'cash', 'real_av', 'port_div', 'div_acc',
'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