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

update

parent 7b399d58
...@@ -237,11 +237,12 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -237,11 +237,12 @@ 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]
fund_dividend = last_nav['fund_div'] + sum( day_div = 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())))
fund_dividend = last_nav['fund_div'] + day_div
dividend_acc = last_nav['div_acc'] dividend_acc = last_nav['div_acc']
fund_av = round(sum([navs[x] * y for x, y in share.items()]), 4) + last_nav['fund_div'] fund_av = round(sum([navs[x] * y for x, y in share.items()]), 4)
asset_nav = fund_av asset_nav = fund_av + fund_dividend
nav = last_nav['nav'] * asset_nav / last_nav['asset_nav'] nav = last_nav['nav'] * asset_nav / last_nav['asset_nav']
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()}
if self.is_first_workday(day): if self.is_first_workday(day):
...@@ -294,6 +295,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -294,6 +295,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
fund_dividend = fund_div_tuple[1] fund_dividend = fund_div_tuple[1]
# 配息日当天取得调仓日计算的应调仓金额,做实际份额赎回,这里的金额(即月初计算的赎回金额)用于转换成“赎回目标的份额” # 配息日当天取得调仓日计算的应调仓金额,做实际份额赎回,这里的金额(即月初计算的赎回金额)用于转换成“赎回目标的份额”
need_div = last_nav['div_forecast'] need_div = last_nav['div_forecast']
portfolio_div = 0
if self.is_dividend_date(day) and need_div > 0: if self.is_dividend_date(day) and need_div > 0:
funds = self._datum.get_datums(type=DatumType.FUND, ticker=self._config['redeem-list']) funds = self._datum.get_datums(type=DatumType.FUND, ticker=self._config['redeem-list'])
# 获取需要配息的金额 # 获取需要配息的金额
...@@ -308,12 +310,15 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder): ...@@ -308,12 +310,15 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
break break
port_div = last_nav['div_forecast'] port_div = last_nav['div_forecast']
dividend_acc = dividend_acc + port_div dividend_acc = dividend_acc + port_div
portfolio_div = port_div
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)
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 = format_weight(weight) weight = format_weight(weight)
fund_dividend = last_nav['fund_div'] + sum( day_div = 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())))
asset_nav = fund_av fund_dividend = last_nav['fund_div'] + day_div
# 基金净值+基金配息+产品配息
asset_nav = fund_av + fund_dividend + portfolio_div
nav = last_nav['nav'] * asset_nav / last_nav['asset_nav'] nav = last_nav['nav'] * asset_nav / last_nav['asset_nav']
div_forecast = last_nav['div_forecast'] div_forecast = last_nav['div_forecast']
if self.is_first_workday(day): if self.is_first_workday(day):
...@@ -369,7 +374,6 @@ class DailyHoldReportor(RoboReportor): ...@@ -369,7 +374,6 @@ class DailyHoldReportor(RoboReportor):
return '每日持仓信息' return '每日持仓信息'
def load_report(self, max_date=prev_workday(dt.today()), min_date=None) -> List[dict]: def load_report(self, max_date=prev_workday(dt.today()), min_date=None) -> List[dict]:
holds = pd.DataFrame(rhp.get_list(max_date=max_date, min_date=min_date)) holds = pd.DataFrame(rhp.get_list(max_date=max_date, min_date=min_date))
holds = holds[holds['date'].dt.date == max_date.date()] holds = holds[holds['date'].dt.date == max_date.date()]
if not holds.empty: if not holds.empty:
......
...@@ -92,8 +92,9 @@ class SignalReportor(RoboReportor): ...@@ -92,8 +92,9 @@ class SignalReportor(RoboReportor):
def load_report(self, max_date=dt.today(), min_date=None) -> List[dict]: def load_report(self, max_date=dt.today(), min_date=None) -> List[dict]:
result = [] result = []
datums = {str(x['id']): x for x in self._datum.get_datums(type=DatumType.FUND, exclude=False)} datums = {str(x['id']): x for x in self._datum.get_datums(type=DatumType.FUND, exclude=False)}
for signal in rrs.get_list(max_date=max_date, min_date=min_date, effective=True): for signal in rrs.get_list(max_date=max_date, min_date=prev_workday(min_date), effective=True):
rebalance_date = self._hold.get_rebalance_date_by_signal(signal['id']) rebalance_date = self._hold.get_rebalance_date_by_signal(signal['id'])
if rebalance_date:
for fund_id, weight in json.loads(signal['portfolio']).items(): for fund_id, weight in json.loads(signal['portfolio']).items():
result.append({ result.append({
'risk': PortfoliosRisk(signal['risk']).name, 'risk': PortfoliosRisk(signal['risk']).name,
......
...@@ -37,6 +37,7 @@ class BacktestExecutor(RoboExecutor): ...@@ -37,6 +37,7 @@ class BacktestExecutor(RoboExecutor):
@staticmethod @staticmethod
def get_last_business_day(start_date, end_date): def get_last_business_day(start_date, end_date):
start_date = prev_workday(start_date)
# 生成日期范围并转换为DataFrame # 生成日期范围并转换为DataFrame
dates = pd.date_range(start_date, end_date, freq='M') dates = pd.date_range(start_date, end_date, freq='M')
if dates[0] != start_date: if dates[0] != start_date:
......
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