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
75416445
Commit
75416445
authored
Nov 11, 2022
by
纪超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成日志、配置文件、数据库工具模块
parent
226692af
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
122 additions
and
26 deletions
+122
-26
api.py
api.py
+21
-5
__init__.py
asset_pool/__init__.py
+0
-0
asset_optimize.py
asset_pool/asset_optimize.py
+4
-4
asset_risk.py
asset_pool/asset_risk.py
+36
-0
__init__.py
asset_pool/dao/__init__.py
+0
-0
mysql.sql
asset_pool/dao/mysql.sql
+31
-0
robo_optimize_pool.py
asset_pool/dao/robo_optimize_pool.py
+0
-0
robo_base_datum.py
basic/dao/robo_base_datum.py
+2
-5
robo_fund_navs.py
basic/dao/robo_fund_navs.py
+2
-3
navs.py
basic/navs.py
+5
-1
config.yml
config.yml
+4
-2
base.py
framework/base.py
+9
-0
database.py
framework/database.py
+3
-2
main.py
main.py
+5
-4
No files found.
api.py
View file @
75416445
...
...
@@ -19,6 +19,7 @@ class Datum(ABC):
'''
基础资料服务,基金资料数据,各种指数,指标资料数据
'''
@
abstractmethod
def
get_fund_datums
(
self
,
crncy
=
None
,
risk
=
None
,
fund_ids
=
None
):
'''
...
...
@@ -35,6 +36,7 @@ class Navs(ABC):
'''
基础数据相关服务,基金净值,各种指标 高开低收
'''
@
abstractmethod
def
get_fund_navs
(
self
,
fund_ids
=
None
,
min_date
=
None
,
max_date
=
None
):
'''
...
...
@@ -47,10 +49,11 @@ class Navs(ABC):
pass
class
Optimize
(
ABC
):
class
Asset
Optimize
(
ABC
):
'''
优选相关服务ABC
'''
@
abstractmethod
def
find_optimize
(
self
,
ids
,
day
):
'''
...
...
@@ -71,13 +74,26 @@ class Optimize(ABC):
pass
class
EwmaCvar
(
metaclass
=
ABCMeta
):
class
AssetRisk
(
ABC
):
'''
ewma相关服务
'''
def
build_ewma_cvar
(
self
):
@
abstractmethod
def
get_risk_pool
(
self
,
day
):
'''
获取指定日期的风控池
:param day: 指定的日期
:return: 风控id列表
'''
pass
@
abstractmethod
def
is_risk
(
self
,
id
,
day
)
->
bool
:
'''
判断指定的id,在指定的日期,是处于风控状态
:param id: 指定的资产id
:param day: 指定的日期
:return: 如果处于风控状态则返回True,否则返回False
'''
pass
fund
_pool/__init__.py
→
asset
_pool/__init__.py
View file @
75416445
File moved
fund_pool/fund
_optimize.py
→
asset_pool/asset
_optimize.py
View file @
75416445
...
...
@@ -4,11 +4,11 @@ from abc import ABC, abstractmethod
from
dateutil.relativedelta
import
relativedelta
from
empyrical
import
sortino_ratio
from
framework
import
filter_weekend
,
dict_remove
,
get_config
,
component
,
autowired
from
api
import
Optimize
,
Navs
,
BusinessException
,
Datum
from
fund
_pool.dao
import
robo_optimize_pool
as
rop
from
api
import
Asset
Optimize
,
Navs
,
BusinessException
,
Datum
from
asset
_pool.dao
import
robo_optimize_pool
as
rop
class
Sortino
Optimize
(
Optimize
,
ABC
):
class
Sortino
AssetOptimize
(
Asset
Optimize
,
ABC
):
def
__init__
(
self
):
optimize_config
=
get_config
(
__name__
)
...
...
@@ -65,7 +65,7 @@ class SortinoOptimize(Optimize, ABC):
@
component
class
FundSortino
Optimize
(
Sortino
Optimize
):
class
FundSortino
AssetOptimize
(
SortinoAsset
Optimize
):
'''
根据索提诺比率计算基金优选的优选实现
'''
...
...
asset_pool/asset_risk.py
0 → 100644
View file @
75416445
import
pandas
as
pd
from
framework
import
component
,
autowired
,
get_config
from
api
import
AssetRisk
,
Navs
@
component
class
CvarEwmaAssetRisk
(
AssetRisk
):
'''
CVAR方式决定风控开始
EWMA方式决定风控结束
'''
@
autowired
def
__init__
(
self
,
navs
:
Navs
=
None
):
self
.
_navs
=
navs
self
.
_config
=
get_config
(
__name__
)
def
get_risk_pool
(
self
,
day
):
pass
def
is_risk
(
self
,
id
,
day
)
->
bool
:
rtn
=
self
.
get_income_return
(
id
,
day
)
print
(
rtn
)
def
get_cvar_start_date
(
self
):
pass
def
get_ewma_start_date
(
self
):
pass
def
get_income_return
(
self
,
id
,
day
):
fund_navs
=
pd
.
DataFrame
(
self
.
_navs
.
get_fund_navs
(
fund_ids
=
id
,
max_date
=
day
))
fund_navs
[
'rtn'
]
=
fund_navs
[
'nav_cal'
]
/
fund_navs
[
'nav_cal'
]
.
shift
(
self
.
_config
[
'rtn_day'
])
-
1
fund_navs
.
dropna
(
inplace
=
True
)
fund_navs
.
rename
(
columns
=
{
'nav_date'
:
'date'
},
inplace
=
True
)
fund_navs
=
fund_navs
[[
'date'
,
'rtn'
]]
return
fund_navs
.
to_dict
(
'records'
)
fund
_pool/dao/__init__.py
→
asset
_pool/dao/__init__.py
View file @
75416445
File moved
fund
_pool/dao/mysql.sql
→
asset
_pool/dao/mysql.sql
View file @
75416445
...
...
@@ -2,11 +2,30 @@ CREATE TABLE IF NOT EXISTS robo_optimize_pool
(
rop_id
BIGINT
UNSIGNED
NOT
NULL
AUTO_INCREMENT
,
rop_date
DATETIME
NOT
NULL
COMMENT
'数据日期'
,
rop_fund_ids
JSON
DEFAULT
NULL
COMMENT
'基金ID'
,
rop_type
TINYINT
NOT
NULL
COMMENT
'资产池类别'
,
rop_asset_ids
JSON
DEFAULT
NULL
COMMENT
'基金ID'
,
rop_create_time
DATETIME
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP
,
rop_update_time
DATETIME
DEFAULT
NULL
ON
UPDATE
CURRENT_TIMESTAMP
,
PRIMARY
KEY
(
rop_id
),
UNIQUE
INDEX
(
rop_date
)
INDEX
(
rop_date
),
INDEX
(
rop_type
)
)
ENGINE
=
InnoDB
AUTO_INCREMENT
=
0
DEFAULT
CHARSET
=
utf8mb4
COMMENT
'优选基金池'
;
CREATE
TABLE
IF
NOT
EXISTS
asset_risk_dates
(
ard_id
BIGINT
UNSIGNED
NOT
NULL
AUTO_INCREMENT
,
ard_date
DATETIME
NOT
NULL
COMMENT
'风控日期'
,
ard_type
TINYINT
NOT
NULL
COMMENT
'日期类型'
,
ard_asset_id
BIGINT
UNSIGNED
NOT
NULL
COMMENT
'资产ID'
,
ard_create_time
DATETIME
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP
,
ard_update_time
DATETIME
DEFAULT
NULL
ON
UPDATE
CURRENT_TIMESTAMP
,
PRIMARY
KEY
(
ard_id
),
INDEX
(
ard_date
),
INDEX
(
ard_type
),
INDEX
(
ard_asset_id
)
)
ENGINE
=
InnoDB
AUTO_INCREMENT
=
0
DEFAULT
CHARSET
=
utf8mb4
COMMENT
'资产风控日期表'
;
\ No newline at end of file
fund
_pool/dao/robo_optimize_pool.py
→
asset
_pool/dao/robo_optimize_pool.py
View file @
75416445
File moved
basic/dao/robo_base_datum.py
View file @
75416445
import
json
from
framework
import
read
,
parse_date
,
where
from
api
import
DatumType
from
framework
import
read
,
where
,
to_tuple
@
read
...
...
@@ -14,6 +13,4 @@ def get_one(*args, **kwargs):
def
get_base_datums
(
type
:
DatumType
=
None
,
crncy
=
None
,
risk
=
None
,
fund_ids
=
None
):
fund_ids
=
tuple
(
fund_ids
)
if
fund_ids
else
None
return
get_list
(
rbd_id
=
fund_ids
,
v_rbd_type
=
type
,
v_rbd_crncy
=
crncy
,
v_rbd_risk
=
risk
)
return
get_list
(
rbd_id
=
to_tuple
(
fund_ids
),
v_rbd_type
=
type
,
v_rbd_crncy
=
crncy
,
v_rbd_risk
=
risk
)
basic/dao/robo_fund_navs.py
View file @
75416445
from
framework
import
read
,
where
,
format_date
from
framework
import
read
,
where
,
format_date
,
to_tuple
@
read
...
...
@@ -17,5 +17,4 @@ def get_navs(fund_id=None, min_date=None, max_date=None):
sqls
.
append
(
f
"rfn_date >= '{format_date(min_date)}'"
)
if
max_date
:
sqls
.
append
(
f
"rfn_date <= '{format_date(max_date)}'"
)
fund_id
=
tuple
(
fund_id
)
if
fund_id
else
None
return
get_list
(
*
sqls
,
rfn_fund_id
=
fund_id
)
return
get_list
(
*
sqls
,
rfn_fund_id
=
to_tuple
(
fund_id
))
basic/navs.py
View file @
75416445
...
...
@@ -27,6 +27,10 @@ class DefaultNavs(Navs):
navs
=
navs
.
reset_index
()
.
melt
(
id_vars
=
'nav_date'
,
value_name
=
'nav_cal'
)
navs
.
dropna
(
inplace
=
True
)
navs
=
navs
[[
'fund_id'
,
'nav_date'
,
'nav_cal'
]]
navs
.
sort_values
(
'fund_id'
,
inplace
=
True
)
navs
.
sort_values
(
by
=
[
'fund_id'
,
'nav_date'
]
,
inplace
=
True
)
navs
=
navs
.
to_dict
(
'records'
)
return
navs
if
__name__
==
'__main__'
:
print
(
isinstance
((),
tuple
))
config.yml
View file @
75416445
...
...
@@ -51,8 +51,8 @@ basic:
exrate
:
-
from
:
EUR
ticker
:
EURUSD BGN Curncy
fund
_pool
:
fund
_optimize
:
asset
_pool
:
asset
_optimize
:
sortino_weight
:
-
months
:
3
weight
:
0.5
...
...
@@ -60,5 +60,7 @@ fund_pool:
weight
:
0.2
-
years
:
1
weight
:
0.2
asset_risk
:
rtn_day
:
5
framework/base.py
View file @
75416445
...
...
@@ -7,6 +7,7 @@ __all__ = [
'dict_remove'
,
'equals_ignore_case'
,
'to_bool'
,
'to_tuple'
,
]
...
...
@@ -60,3 +61,11 @@ def to_bool(v) -> bool:
if
reduce
(
lambda
a
,
b
:
a
or
b
,
[
equals_ignore_case
(
v
,
x
)
for
x
in
_FALSE_STR
]):
return
False
return
bool
(
v
)
def
to_tuple
(
v
)
->
tuple
:
if
isinstance
(
v
,
tuple
):
return
v
if
isinstance
(
v
,
list
):
return
tuple
(
v
)
return
(
v
,)
if
v
else
None
framework/database.py
View file @
75416445
...
...
@@ -128,8 +128,9 @@ def where(*args, **kwargs) -> str:
result
.
append
(
f
"{k} = '{format_date(v)}'"
)
elif
isinstance
(
v
,
Enum
):
result
.
append
(
f
"{k} = '{v.value}'"
)
elif
isinstance
(
v
,
tuple
):
result
.
append
(
f
"{k} in {v}"
if
len
(
v
)
>
1
else
f
"{k} = {v[0]}"
)
elif
isinstance
(
v
,
tuple
)
or
isinstance
(
v
,
list
):
if
len
(
v
)
>
0
:
result
.
append
(
f
"{k} in {tuple(v)}"
if
len
(
v
)
>
1
else
f
"{k} = {v[0]}"
)
elif
v
is
not
None
:
result
.
append
(
f
"{k} = {v}"
)
if
args
:
...
...
main.py
View file @
75416445
from
framework
import
autowired
,
parse_date
,
logger
from
api
import
Optimize
from
api
import
AssetOptimize
,
AssetRisk
@
autowired
def
start
(
optimize
:
Optimize
=
None
):
pool
=
optimize
.
get_optimize_pool
(
parse_date
(
'2022-11-07'
))
logger
.
info
(
pool
)
def
start
(
optimize
:
AssetOptimize
=
None
,
risk
:
AssetRisk
=
None
):
# pool = optimize.get_optimize_pool(parse_date('2022-11-07'))
# logger.info(pool)
risk
.
is_risk
(
1
,
parse_date
(
'2022-11-07'
))
if
__name__
==
'__main__'
:
...
...
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