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