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
9d4c3c33
Commit
9d4c3c33
authored
Aug 10, 2023
by
wenwen.tang
😕
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
基金数据获取方式替换-tw
parent
45367cee
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
100 additions
and
7 deletions
+100
-7
sync.py
basic/sync.py
+96
-2
config-svrobo6.yml
config-svrobo6.yml
+1
-1
robo_executor.py
robo_executor.py
+3
-4
No files found.
basic/sync.py
View file @
9d4c3c33
import
base64
import
hashlib
import
logging
import
logging
from
abc
import
ABC
,
abstractmethod
from
abc
import
ABC
,
abstractmethod
from
datetime
import
datetime
as
dt
from
datetime
import
datetime
as
dt
,
timedelta
from
dateutil.relativedelta
import
relativedelta
from
typing
import
List
from
typing
import
List
from
urllib.parse
import
quote
from
urllib.parse
import
quote
import
requests
import
requests
from
dateutil.relativedelta
import
relativedelta
from
py_jftech
import
format_date
,
is_workday
,
component
,
autowired
,
get_config
,
filter_weekend
,
next_workday
from
py_jftech
import
format_date
,
is_workday
,
component
,
autowired
,
get_config
,
filter_weekend
,
next_workday
from
api
import
DatumType
,
DataSync
,
Datum
from
api
import
DatumType
,
DataSync
,
Datum
...
@@ -66,6 +68,98 @@ class JDCDataSync(DataSync, ABC):
...
@@ -66,6 +68,98 @@ class JDCDataSync(DataSync, ABC):
page
+=
1
page
+=
1
class
TWDataSync
(
DataSync
,
ABC
):
@
autowired
def
__init__
(
self
,
datum
:
Datum
=
None
):
self
.
_datum
=
datum
self
.
_config
=
get_config
(
__name__
)
def
do_sync
(
self
,
max_date
=
dt
.
today
()):
logger
.
info
(
f
'start sync datas for type[{self.datum_type}]'
)
response
=
self
.
get_all_data
(
self
.
start_date
)
for
datum
in
self
.
_datum
.
get_datums
(
type
=
self
.
datum_type
):
logger
.
debug
(
f
'start sync ticker[{datum["ftTicker"]}]'
)
try
:
self
.
store_date
(
datum
[
'id'
],
datum
[
"ftTicker"
],
response
)
except
Exception
as
e
:
logger
.
exception
(
f
'''{datum['id']} store data failed'''
)
raise
e
@
property
def
start_date
(
self
):
return
filter_weekend
(
dt
.
today
()
-
timedelta
(
days
=
5
))
@
abstractmethod
def
last_datum
(
self
,
datum_id
):
pass
@
abstractmethod
def
get_all_data
(
self
,
start_date
=
dt
.
today
()):
pass
@
property
@
abstractmethod
def
datum_type
(
self
)
->
DatumType
:
pass
@
abstractmethod
def
store_date
(
self
,
datumid
,
ft_ticker
,
datas
:
List
[
dict
]):
pass
@
component
(
bean_name
=
'tw-navs-sync'
)
class
TWFundNavSync
(
TWDataSync
):
def
get_all_data
(
self
,
start_date
=
dt
.
today
()):
authori
=
'chifufund'
+
dt
.
today
()
.
strftime
(
'
%
Y
%
m
%
d'
)
+
'FTDMNAVDATE'
authdest
=
base64
.
b64encode
(
hashlib
.
sha256
(
authori
.
encode
())
.
digest
())
.
decode
()
req
=
requests
.
session
()
req
.
headers
[
'user'
]
=
'chifufund'
req
.
headers
[
'Authorization'
]
=
'Basic '
+
authdest
for
i
in
range
(
30
):
try
:
resp
=
req
.
get
(
'http://210.202.243.106:1688/api/public/NAV?parameter.modifyDate='
+
start_date
.
strftime
(
'
%
Y-
%
m-
%
d'
),
timeout
=
30
)
return
resp
.
json
()
except
Exception
as
e
:
logger
.
error
(
str
(
e
))
def
last_datum
(
self
,
datum_id
):
last
=
rfn
.
get_last_one
(
fund_id
=
datum_id
)
return
last
@
property
def
datum_type
(
self
)
->
DatumType
:
return
DatumType
.
FUND
def
store_date
(
self
,
datumid
,
ft_ticker
,
datas
:
List
[
dict
]):
last
=
self
.
last_datum
(
datum_id
=
datumid
)
start_date
=
next_workday
(
last
[
'nav_date'
])
if
last
else
self
.
start_date
save_navs
=
[]
last_av
=
last
[
'av'
]
last_nav_cal
=
last
[
'nav_cal'
]
for
data
in
datas
:
if
dt
.
strptime
(
data
[
'Nav_Date'
],
"
%
Y-
%
m-
%
dT
%
H:
%
M:
%
S"
)
>=
start_date
and
data
[
'Fund_Id'
]
==
ft_ticker
:
nav
=
{
'fund_id'
:
datumid
,
'nav_date'
:
dt
.
strptime
(
data
[
'Nav_Date'
],
"
%
Y-
%
m-
%
dT
%
H:
%
M:
%
S"
),
'av'
:
data
[
'Nav_P'
],
'div'
:
data
[
'Nav_T_Div'
],
'split'
:
data
[
'Nav_Spilt'
],
'accrue_split'
:
data
[
'Nav_Spilt'
],
'av_p'
:
data
[
'Nav_P'
],
'div_p'
:
data
[
'Nav_T_Div'
],
# 当日/上日
'nav_cal'
:
round
(((
data
[
'Nav_P'
]
+
data
[
'Nav_T_Div'
])
*
data
[
'Nav_Unit'
])
/
(
last_av
*
data
[
'Nav_Unit'
])
*
last_nav_cal
,
4
)
}
last_av
=
nav
[
'av'
]
last_nav_cal
=
nav
[
'nav_cal'
]
save_navs
.
append
(
nav
)
if
save_navs
:
rfn
.
batch_insert
(
save_navs
)
@
component
(
bean_name
=
'index-sync'
)
@
component
(
bean_name
=
'index-sync'
)
class
IndexSync
(
JDCDataSync
):
class
IndexSync
(
JDCDataSync
):
...
...
config-svrobo6.yml
View file @
9d4c3c33
...
@@ -232,7 +232,7 @@ reports: # 报告模块相关
...
@@ -232,7 +232,7 @@ reports: # 报告模块相关
content
:
"
Dear
All:
附件是今天生成的监测数据,請驗收,謝謝!
注>:該郵件為自動發送,如有問題請聯繫矽谷團隊
telan_qian@chifufund.com"
content
:
"
Dear
All:
附件是今天生成的监测数据,請驗收,謝謝!
注>:該郵件為自動發送,如有問題請聯繫矽谷團隊
telan_qian@chifufund.com"
robo-executor
:
# 执行器相关
robo-executor
:
# 执行器相关
use
:
${ROBO_EXECUTOR:real}
# 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
use
:
${ROBO_EXECUTOR:real}
# 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data
:
${SYNC_DATA:o
ff
}
# 是否开启同步资料数据
sync-data
:
${SYNC_DATA:o
n
}
# 是否开启同步资料数据
backtest
:
# 回测执行器相关
backtest
:
# 回测执行器相关
start-date
:
2022-09-30
# 回测起始日期
start-date
:
2022-09-30
# 回测起始日期
end-date
:
2023-07-03
# 回测截止日期
end-date
:
2023-07-03
# 回测截止日期
...
...
robo_executor.py
View file @
9d4c3c33
...
@@ -133,7 +133,8 @@ class BacktestExecutor(RoboExecutor):
...
@@ -133,7 +133,8 @@ class BacktestExecutor(RoboExecutor):
@
component
(
bean_name
=
'real'
)
@
component
(
bean_name
=
'real'
)
class
RealExecutor
(
RoboExecutor
):
class
RealExecutor
(
RoboExecutor
):
@
autowired
(
names
=
{
'daily_export'
:
'daily-real-export'
,
'monitor_export'
:
'daily-monitor-export'
})
@
autowired
(
names
=
{
'daily_export'
:
'daily-real-export'
,
'monitor_export'
:
'daily-monitor-export'
,
'syncs'
:
'tw-navs-sync'
})
def
__init__
(
self
,
builder
:
PortfoliosBuilder
=
None
,
hold
:
PortfoliosHolder
=
None
,
syncs
:
List
[
DataSync
]
=
None
,
def
__init__
(
self
,
builder
:
PortfoliosBuilder
=
None
,
hold
:
PortfoliosHolder
=
None
,
syncs
:
List
[
DataSync
]
=
None
,
daily_export
:
RoboExportor
=
None
,
monitor_export
:
RoboExportor
=
None
,
pool
:
AssetPool
=
None
,
daily_export
:
RoboExportor
=
None
,
monitor_export
:
RoboExportor
=
None
,
pool
:
AssetPool
=
None
,
signal
:
RebalanceSignal
=
None
):
signal
:
RebalanceSignal
=
None
):
...
@@ -146,7 +147,6 @@ class RealExecutor(RoboExecutor):
...
@@ -146,7 +147,6 @@ class RealExecutor(RoboExecutor):
self
.
_config
=
get_config
(
__name__
)[
'real'
]
self
.
_config
=
get_config
(
__name__
)[
'real'
]
self
.
_signal
=
signal
self
.
_signal
=
signal
@
property
@
property
def
start_date
(
self
):
def
start_date
(
self
):
return
pd
.
to_datetime
(
filter_weekend
(
self
.
_config
[
'start-date'
]))
return
pd
.
to_datetime
(
filter_weekend
(
self
.
_config
[
'start-date'
]))
...
@@ -174,8 +174,7 @@ class RealExecutor(RoboExecutor):
...
@@ -174,8 +174,7 @@ class RealExecutor(RoboExecutor):
def
start_exec
(
self
):
def
start_exec
(
self
):
if
self
.
is_sync_data
:
if
self
.
is_sync_data
:
for
sync
in
self
.
_syncs
:
self
.
_syncs
.
do_sync
()
sync
.
do_sync
()
date
=
self
.
curt_date
date
=
self
.
curt_date
if
is_workday
(
date
)
or
date
in
self
.
include_date
:
if
is_workday
(
date
)
or
date
in
self
.
include_date
:
date
=
prev_workday
(
filter_weekend
(
date
))
date
=
prev_workday
(
filter_weekend
(
date
))
...
...
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