Commit 64080a96 authored by wenwen.tang's avatar wenwen.tang 😕

回测nav的计算用复权净值

parent f1d06bf7
...@@ -245,7 +245,9 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -245,7 +245,9 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
if last_nav: if last_nav:
# 若非首次配息 # 若非首次配息
share = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share'].items()} share = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share'].items()}
# 参与配息的基金份额
share_nav = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share_nav'].items()} share_nav = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share_nav'].items()}
share_nodiv_nav = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share_nodiv_nav'].items()}
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]
...@@ -256,13 +258,14 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -256,13 +258,14 @@ 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 = 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)
nav = round(sum([nav_cals[x] * y for x, y in share_nodiv_nav.items()]), 4)
fund_nav += fund_dividend_nav fund_nav += fund_dividend_nav
asset_nav = fund_av asset_nav = fund_av
share = {x: fund_av * w / navs[x] for x, w in weight.items()} share = {x: fund_av * w / navs[x] for x, w in weight.items()}
# 若调仓当日,有基金产生配息 # 若调仓当日,有基金产生配息
share_nav = {x: fund_nav * w / navs[x] for x, w in weight.items()} share_nav = {x: fund_nav * w / navs[x] for x, w in weight.items()}
share_nodiv_nav = {x: nav * w / nav_cals[x] for x, w in weight.items()}
if self.is_first_workday(day): if self.is_first_workday(day):
div_forecast = asset_nav * self.month_dividend div_forecast = asset_nav * self.month_dividend
else: else:
...@@ -277,6 +280,8 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -277,6 +280,8 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
funds_subscription_rate = {fund['id']: fund.get('subscriptionRate', 0) for fund in funds} funds_subscription_rate = {fund['id']: fund.get('subscriptionRate', 0) for fund in funds}
share = {x: (1 - funds_subscription_rate[x]) * (fund_av * w) / navs[x] for x, w in weight.items()} share = {x: (1 - funds_subscription_rate[x]) * (fund_av * w) / navs[x] for x, w in weight.items()}
share_nav = share share_nav = share
# 不考虑配息
share_nodiv_nav = share
# 初始买入扣手续费 # 初始买入扣手续费
fee = sum(funds_subscription_rate[x] * (fund_av * w) for x, w in weight.items()) fee = sum(funds_subscription_rate[x] * (fund_av * w) for x, w in weight.items())
fund_av = fund_av - fee fund_av = fund_av - fee
...@@ -293,8 +298,10 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -293,8 +298,10 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
'portfolios': { 'portfolios': {
'weight': weight, 'weight': weight,
'weight_nav': weight, 'weight_nav': weight,
'weight_nodiv_nav': weight,
'share': share, 'share': share,
'share_nav': share_nav, 'share_nav': share_nav,
'share_nodiv_nav': share_nodiv_nav
}, },
'fund_av': fund_av, 'fund_av': fund_av,
'fund_nav': fund_nav, 'fund_nav': fund_nav,
...@@ -314,6 +321,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -314,6 +321,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
dividend_acc = last_nav['div_acc'] dividend_acc = last_nav['div_acc']
share = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share'].items()} share = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share'].items()}
share_nav = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share_nav'].items()} share_nav = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share_nav'].items()}
share_nodiv_nav = {int(x): y for x, y in json.loads(last_nav['portfolios'])['share_nodiv_nav'].items()}
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]
...@@ -333,12 +341,14 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -333,12 +341,14 @@ 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) nav = round(sum([nav_cals[x] * y for x, y in share_nodiv_nav.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_nodiv_nav = {x: round(y * nav_cals[x] / nav, 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()} weight_nav = {x: round(y * navs[x] / fund_av, 2) for x, y in share_nav.items()}
weight = format_weight(weight) weight = format_weight(weight)
weight_nav = format_weight(weight_nav) weight_nav = format_weight(weight_nav)
weight_nodiv_nav = format_weight(weight_nodiv_nav)
asset_nav = fund_av asset_nav = fund_av
div_forecast = last_nav['div_forecast'] div_forecast = last_nav['div_forecast']
if self.is_first_workday(day): if self.is_first_workday(day):
...@@ -354,8 +364,10 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -354,8 +364,10 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
'portfolios': { 'portfolios': {
'weight': weight, 'weight': weight,
'weight_nav': weight_nav, 'weight_nav': weight_nav,
'weight_nodiv_nav': weight_nodiv_nav,
'share': share, 'share': share,
'share_nav': share_nav 'share_nav': share_nav,
'share_nodiv_nav': share_nodiv_nav
}, },
'fund_av': fund_av, 'fund_av': fund_av,
'fund_nav': fund_nav, 'fund_nav': fund_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