Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
R
robo-dividend
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenwen.tang
robo-dividend
Commits
f1d06bf7
Commit
f1d06bf7
authored
Nov 02, 2023
by
wenwen.tang
😕
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
回测nav的计算用复权净值
parent
4ca198df
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
13 additions
and
5 deletions
+13
-5
holder.py
portfolios/holder.py
+13
-5
No files found.
portfolios/holder.py
View file @
f1d06bf7
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'
]]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment