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
bbbf3b86
Commit
bbbf3b86
authored
Mar 17, 2025
by
吕先亚
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
etf
parent
05c3b6dc
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
273 additions
and
8 deletions
+273
-8
sync.py
basic/sync.py
+8
-8
config-etf.yml
config-etf.yml
+265
-0
No files found.
basic/sync.py
View file @
bbbf3b86
...
...
@@ -251,7 +251,7 @@ class FundNavSync(JDCDataSync):
return
None
querys
=
self
.
_jdc_querys
[
datum
[
'id'
]]
query_str
=
'&'
.
join
([
f
'{x[0]}={quote(str(x[1]).encode())}'
for
x
in
querys
.
items
()])
return
f
'http://jdcprod.thiztech.com/api/datas/
asset
-value?page={page}&size=200&startDate={format_date(start_date)}&{query_str}'
return
f
'http://jdcprod.thiztech.com/api/datas/
index
-value?page={page}&size=200&startDate={format_date(start_date)}&{query_str}'
def
find_jdc_querys
(
self
):
funds
=
self
.
_datum
.
get_datums
(
type
=
DatumType
.
FUND
,
exclude
=
False
)
...
...
@@ -261,28 +261,28 @@ class FundNavSync(JDCDataSync):
}
for
x
in
funds
if
'ftTicker'
not
in
x
and
'bloombergTicker'
in
x
}
ft_tickers
=
{
x
[
'ftTicker'
]:
x
for
x
in
funds
if
'ftTicker'
in
x
}
response
=
requests
.
get
(
'http://jdcprod.thiztech.com/api/subject?
busiField=TW&sourceType=TW&subjectType=FUND
'
)
response
=
requests
.
get
(
'http://jdcprod.thiztech.com/api/subject?
sourceType=THS&subjectType=INDEX
'
)
response
=
response
.
json
()
if
not
response
[
'success'
]:
raise
CollectError
(
f
'''find fund subject failed: {response['status']}'''
)
return
{
**
urls
,
**
{
ft_tickers
[
x
[
'
fundId
'
]][
'id'
]:
{
ft_tickers
[
x
[
'
collectCode
'
]][
'id'
]:
{
'subjectKeys'
:
x
[
'key'
],
'sourceType'
:
'T
W
'
}
for
x
in
response
[
'body'
][
'content'
]
if
x
[
'
fundId
'
]
in
ft_tickers
'sourceType'
:
'T
HS
'
}
for
x
in
response
[
'body'
][
'content'
]
if
x
[
'
collectCode
'
]
in
ft_tickers
}}
def
store_date
(
self
,
datumid
,
datas
:
List
[
dict
]):
save_navs
=
[{
'fund_id'
:
datumid
,
'nav_date'
:
dt
.
fromtimestamp
(
x
[
'date'
]
/
1000
,
tz
=
pytz
.
timezone
(
'Asia/Shanghai'
)),
'av'
:
x
[
'
originValu
e'
],
'av'
:
x
[
'
clos
e'
],
'div'
:
x
[
'dividend'
]
if
'dividend'
in
x
else
0
,
'split'
:
x
[
'split'
]
if
'split'
in
x
else
1
,
'accrue_split'
:
x
[
'totalSplit'
]
if
'totalSplit'
in
x
else
1
,
'av_p'
:
x
[
'
postValu
e'
],
'av_p'
:
x
[
'
clos
e'
],
'div_p'
:
x
[
'postDividend'
]
if
'postDividend'
in
x
else
0
,
'nav_cal'
:
x
[
'c
alibrateValu
e'
]
'nav_cal'
:
x
[
'c
los
e'
]
}
for
x
in
datas
if
is_workday
(
dt
.
fromtimestamp
(
x
[
'date'
]
/
1000
,
tz
=
pytz
.
timezone
(
'Asia/Shanghai'
)))]
if
save_navs
:
rfn
.
batch_insert
(
save_navs
)
...
...
config-etf.yml
0 → 100644
View file @
bbbf3b86
py-jftech
:
logger
:
version
:
1
formatters
:
brief
:
format
:
"
%(asctime)s
-
%(levelname)s
-
%(message)s"
simple
:
format
:
"
%(asctime)s
-
%(filename)s
-
%(levelname)s
-
%(message)s"
handlers
:
console
:
class
:
logging.StreamHandler
formatter
:
simple
level
:
DEBUG
stream
:
ext://sys.stdout
file
:
class
:
logging.handlers.TimedRotatingFileHandler
level
:
INFO
formatter
:
brief
filename
:
${LOG_FILE:logs/info.log}
interval
:
1
backupCount
:
30
encoding
:
utf8
when
:
D
# loggers:
# basic.sync:
# level: DEBUG
# handlers: [console]
# propagate: no
root
:
level
:
${LOG_LEVEL:INFO}
handlers
:
${LOG_HANDLERS:[ console ]}
database
:
host
:
${MYSQL_HOST:192.168.68.100}
port
:
${MYSQL_PORT:3306}
user
:
${MYSQL_USER:root}
password
:
${MYSQL_PWD:12345678}
dbname
:
${MYSQL_DBNAME:jf_etf}
# mdis_prr3
injectable
:
names
:
backtest
:
robo_executor.BacktestExecutor
datum
:
basic.datum.DefaultDatum
hold-report
:
portfolios.holder.DivHoldReportor
mpt
:
portfolios.builder.PoemARCPortfoliosBuilder
# RiskParityARCPortfoliosBuilder/PoemARCPortfoliosBuilder
dividend-holder
:
portfolios.holder.InvTrustPortfoliosHolder
navs-sync
:
basic.sync.FundNavSync
email
:
server
:
smtphz.qiye.163.com
user
:
jft-ra@thizgroup.com
password
:
5dbb#30ec6d3
mulit-process
:
max-workers
:
${MAX_PROCESS:1}
basic
:
# 基础信息模块
sync
:
start-date
:
1990-01-01
# 同步数据开始日期
datum
:
# 资料模块
change
:
date
:
${DATUM_CHANGE_DATE}
file
:
${DATUM_CHANGE_FILE}
excludes
:
# 排除的资料彭博ticker
backtest
:
-
'
FRSTAMP
LX
Equity'
# 富蘭克林坦伯頓全球投資系列-精選收益基金 美元A(Mdis-pc)股
# - 'TEMFHYI LX Equity' # 富蘭克林坦伯頓全球投資系列-公司債基金 美元A(Mdis)股 -> 20240722起可一般申购
real
:
-
'
FRSTAMP
LX
Equity'
# 富蘭克林坦伯頓全球投資系列-精選收益基金 美元A(Mdis-pc)股
# - 'FTSIADU LX Equity' # 富蘭克林坦伯頓全球投資系列-精選收益基金 美元A(Mdis)股
navs
:
# 净值模块
exrate
:
# 汇率,如果不开启,整个这块注释掉
-
from
:
EUR
# 需要转换的货币类型
ticker
:
EURUSD BGN Curncy
# 汇率值的彭博ticker
asset-pool
:
# 资产池模块
asset-optimize
:
# 资产优选模块
sortino-weight
:
# sortino计算需要的权重,下面每一条为一次计算,e.g. months: 3, weight: 0.5 表示 3个月数据使用权重0.5来计算分值
-
months
:
3
weight
:
0.5
-
months
:
6
weight
:
0.3
-
years
:
1
weight
:
0.2
asset-include
:
{
'
customType'
:[
1
,
2
,
3
,
4
]}
optimize-count
:
3
#基金优选个数
annual-volatility-filter
:
#1各资产年化波动率末exclude位 2各资产年化波动率大于volatility
# - customType: 1
# min-retain: 2
# exclude: 1
# volatility: 1000
-
customType
:
2
min-retain
:
2
exclude
:
5
# volatility: 1000
# - customType: 3
# exclude: 0
# volatility: 1000
-
customType
:
4
min-retain
:
1
exclude
:
2
# volatility: 1000
annual-volatility-section
:
# 波动率时间区间
-
years
:
1
portfolios
:
# 投组模块
holder
:
# 持仓投组相关
init-nav
:
100
# 初始金额
min-interval-days
:
10
# 两次实际调仓最小间隔期,单位交易日
dividend-rate
:
0.0
#设定年化配息率
dividend-date
:
15
#配息日,每月15号
dividend-adjust-day
:
[
1
,
4
,
7
,
10
]
#每年的首个季度调整配息
warehouse-frequency
:
1
#每隔1个月调一次仓
warehouse-transfer-date
:
1
#调仓日
redeem-list
:
[
'
TEUSAAU
LX
Equity'
,
'
LIGTRAA
ID
Equity'
,
'
TEMFHAC
LX
Equity'
,
'
LUSHUAA
ID
Equity'
]
#从持仓中的低风险资产“直接”按序赎回
solver
:
# 解算器相关
model
:
prr
# 结算模型 ARC ,PRR, ~ 标准解算器
arc
:
on
#是否开启ARC
brr
:
0.0
#误差补偿值
trr
:
3
tol
:
1E-10
# 误差满足条件
navs
:
# 净值要求
range
:
# 需要净值数据的区间, days: 90 表示90自然日,months: 3 表示3个自然月
days
:
90
max-nan
:
# 最大缺失净值条件
asset
:
8
# 单一资产最多缺少多少交易日数据,则踢出资产池
day
:
0.5
# 单一交易日最多缺少百分之多少净值,则删除该交易日
risk
:
[]
# 资产风险等级要求,可分开写也可以合并写,e.g. risk:[ 2, 3 ] 则表示 所有投组资产风险等级都是 2 或 3
LARC
:
[
0.35
,
0.10
,
0.05
,
0.00
]
#低阈值
UARC
:
[
0.70
,
0.70
,
0.70
,
0.35
]
#高阈值
matrix-rtn-days
:
20
# 计算回报率矩阵时,回报率滚动天数
asset-count
:
[
5
,
5
]
# 投组资产个数。e.g. count 或 [min, max] 分别表示 最大最小都为count 或 最小为min 最大为max,另外这里也可以类似上面给不同风险等级分别配置
mpt
:
# mpt计算相关
cvar-beta
:
0.2
# 计算Kbeta 需要用到
quantile
:
0.9
# 分位点,也可以给不同风险等级分别配置
low-weight
:
0.05
# 最低权重
high-weight
:
[
0.35
]
# 最高权重比例,可给一个值,也可以给多个值,当多个值时,第一个表示只有一个资产时权重,第二个表示只有两个资产时权重,以此类推,最后一个表示其他资产个数时的权重
poem
:
# poem相关
cvar-scale-factor
:
0.1
# 计算时用到的系数
checker
:
#投组检测模块
switch
:
on
#是否开启检查
custom-type-priority
:
[
3
,
2
,
1
,
4
]
# 检测优先级
month-fund-filter
:
{
4
:[
'
XXX
ID
Equity'
]}
# 'LMAOMPU ID Equity' 根据月份删除某几档基金,51勞動節:美盛西方資產亞洲機會債券基金 A 增益配息 (M) 美元
reports
:
# 报告模块相关
navs
:
type
:
FUND
tickers
:
-
TEMTECI LX Equity
-
TEPLX US Equity
-
FRDPX US Equity
-
FKRCX US Equity
-
FTNRACU LX Equity
benchmark
:
# benchmark报告
ft
:
init-amount
:
100
# 初始金额
stock-rate
:
# stock型基金比例
RR3
:
0.3
RR4
:
0.5
RR5
:
0.7
fixed-range
:
# 固定区间收益率
range-dates
:
# 固定起始截止日期
-
start
:
2008-01-01
end
:
2008-10-27
-
start
:
2011-05-02
end
:
2011-10-04
-
start
:
2013-05-08
end
:
2013-06-24
-
start
:
2014-09-03
end
:
2014-12-16
-
start
:
2015-05-21
end
:
2016-02-11
-
start
:
2018-09-20
end
:
2018-12-24
-
start
:
2020-02-19
end
:
2020-03-23
-
start
:
2022-01-03
end
:
2022-10-12
relative-range
:
# 相对区间收益率
range-dates
:
# 相对时间周期
-
days
:
1
name
:
'
一天'
-
weeks
:
1
name
:
'
一周'
-
months
:
1
name
:
'
一月'
-
months
:
3
name
:
'
三月'
-
months
:
6
name
:
'
六月'
-
years
:
1
name
:
'
一年'
-
years
:
2
name
:
'
两年'
-
years
:
3
name
:
'
三年'
-
years
:
5
name
:
'
五年'
-
years
:
10
name
:
'
十年'
-
dates
:
~
name
:
'
成立以来'
exports
:
backtest
:
# 回测导出曹策略
save-path
:
${EXPORT_PATH:excels}
# 导出报告文件存放路径,如果以./或者../开头,则会以执行python文件为根目录,如果以/开头,则为系统绝对路径,否则,以项目目录为根目录
file-name
:
${EXPORT_FILENAME:real}
# 导出报告的文件名
save-config
:
${EXPORT_CONFIG:on}
# 是否保存配置文件
include-report
:
# 需要导出的报告类型列表,下面的顺序,也代表了excel中sheet的顺序
# - funds-report # 基金资料
# - navs-report # 净值报告
-
hold-report
# 持仓报告
-
signal-report
# 信号报告
# - benckmark-report # benckmark报告
# - combo-report # 持仓对比
-
indicators-report
# 各种特殊指标报告
-
fixed-range-report
# 固定区间收益报告
-
relative-range-report
# 相对区间收益报告
-
year-range-report
# 单年区间业绩报告
# - month-div-rate-report # 月度配息率比较
# - year-div-rate-report # 年度配息率比较
real-daily
:
file-name
:
MdisFopF_rr3(實盤)-每月投組推薦
save-path
:
${EXPORT_PATH:excels}
# 导出报告文件存放路径,如果以./或者../开头,则会以执行python文件为根目录,如果以/开头,则为系统绝对路径,否则,以项目目录为根目录
include-report
:
# - daily-hold-report
-
daily-signal-report
# - daily-mpt-report
email
:
receives
:
${REAL_EMAIL_RECEIVES:['wenwen.tang@thizgroup.com']}
copies
:
${REAL_EMAIL_COPIES:['wenwen.tang@thizgroup.com']}
subject
:
# default: "MdisFoF_prr3(實盤)-每日投組推薦_{today}"
rebalance
:
"
MdisFoF_prr3(實盤)-每月投組推薦_{today}"
content
:
# default: "Dear All: 附件是今天生成的推薦組合,請驗收,謝謝! 注>:該郵件為自動發送,如有問題請聯繫矽谷團隊 brody_wu@chifufund.com"
rebalance
:
"
Dear
All:
附檔為每月投資組合推薦,請驗收,謝謝!
注>:該郵件為自動發送,如有問題請聯繫矽谷團隊
brody_wu@chifufund.com"
daily-monitor
:
file-name
:
MdisFopF_rr3
save-path
:
${EXPORT_PATH:excels}
include-report
:
-
name
:
daily-mpt-report
# 相对区间收益报告
min-date
:
~
-
name
:
fund-selection-process-report
min-date
:
~
-
name
:
sigma-report
min-date
:
~
email
:
receives
:
-
wenwen.tang@thizgroup.com
copies
:
${MONITOR_EMAIL_COPIES}
subject
:
"
MdisFopF_rr3-实盘版-每日监测_{today}"
content
:
"
Dear
All:
附件是今天生成的监测数据,請驗收,謝謝!
注>:該郵件為自動發送,如有問題請聯繫矽谷團隊
telan_qian@chifufund.com"
robo-executor
:
# 执行器相关
use
:
${ROBO_EXECUTOR:real}
# 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data
:
${SYNC_DATA:on}
# 是否开启同步资料数据
backtest
:
# 回测执行器相关
start-date
:
2013-01-02
# 回测起始日期
end-date
:
2024-10-01
# 回测截止日期
sealing-period
:
10
#调仓封闭期
start-step
:
${BACKTEST_START_STEP:1}
# 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
end-step
:
${BACKTEST_END_STEP:3}
# 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
clean-up
:
off
real
:
# 实盘执行器
export
:
${EXPORT_ENABLE:on}
# 是否开启报告
start-date
:
2023-05-08
# 实盘开始时间
include-date
:
[]
web
:
guid
:
AB088E61-FAB1-4466-B6AD-6E8AE253391E
port
:
8080
save-path
:
${EXPORT_PATH:json}
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