From f1d06bf7f8b72a1ac9ae8da872ef819a8e426ee8 Mon Sep 17 00:00:00 2001 From: "wenwen.tang" <wenwen.tang@thizgroup.com> Date: Thu, 2 Nov 2023 14:41:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E6=B5=8Bnav=E7=9A=84=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E7=94=A8=E5=A4=8D=E6=9D=83=E5=87=80=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- portfolios/holder.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/portfolios/holder.py b/portfolios/holder.py index 0065b15..ac1959c 100644 --- a/portfolios/holder.py +++ b/portfolios/holder.py @@ -1,3 +1,4 @@ +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']] -- 2.18.1