Commit 400e0857 authored by wenwen.tang's avatar wenwen.tang 😕

意义 FOF模式 投顾robo模式

fund_av	基金原始净值	sum(个股原始净值*对应份额)
fund_div	持有基金配息	sum(个股每股配息*对应份额)
fund_nav	基金复权净值	暂时不做此操作	不配息则配股
cash	现金(产品的现金账户)	"1.主动预留现金,用来配息
2.持有基金配息"	无现金预留
real_av	产品净值	fund_av + cash	fund_av
port_div	产品配息金额(产品主动配息)	使用预留现金进行配息	赎回特定基金进行配息
acc_div	产品累计配息(给到客户配息)	acc(port_div)	acc(port_div + fund_div)
acc_av	产品累计净值	real_av + acc_div	real_av + acc_div
nav	产品复权净值(配息再投资)	一般复权方法:real_av、port_div	将配息率设置为0
parent c1900177
...@@ -17,19 +17,20 @@ class DefaultNavs(Navs): ...@@ -17,19 +17,20 @@ class DefaultNavs(Navs):
navs = rfn.get_navs(fund_id=fund_ids, min_date=min_date, max_date=max_date) navs = rfn.get_navs(fund_id=fund_ids, min_date=min_date, max_date=max_date)
if navs and 'exrate' in self._config: if navs and 'exrate' in self._config:
navs = pd.DataFrame(navs) navs = pd.DataFrame(navs)
navs = navs.pivot_table(index='nav_date', columns='fund_id', values='nav_cal')
for exrate_config in self._config['exrate']: for exrate_config in self._config['exrate']:
exrate = pd.DataFrame(re.get_exrates(ticker=exrate_config['ticker'], min_date=navs.index.min(), exrate = pd.DataFrame(re.get_exrates(ticker=exrate_config['ticker'], min_date=min_date,
max_date=navs.index.max())) max_date=max_date))
exrate = exrate[['date', 'close']] exrate.rename(columns={'date': 'nav_date'}, inplace=True)
exrate.set_index('date', inplace=True) exrate = exrate[['nav_date', 'close']]
for fund in self._datum.get_datums(type=DatumType.FUND, crncy=exrate_config['from']): fund_ids = [x['id'] for x in self._datum.get_datums(type=DatumType.FUND, crncy=exrate_config['from'])]
if fund['id'] in navs.columns: merged = pd.merge(navs, exrate, on='nav_date', how='left')
navs[fund['id']] = round(navs[fund['id']] * exrate['close'], 4) merged.loc[merged['fund_id'].isin(fund_ids), 'nav_cal'] *= merged['close']
navs = navs.reset_index().melt(id_vars='nav_date', value_name='nav_cal') merged.loc[merged['fund_id'].isin(fund_ids), 'av'] *= merged['close']
navs.dropna(inplace=True) merged.loc[merged['fund_id'].isin(fund_ids), 'dividend'] *= merged['close']
navs = navs[['fund_id', 'nav_date', 'nav_cal']] merged['nav_cal'] = merged['nav_cal'].round(4) # 四舍五入保留四位小数
navs.sort_values(by=['fund_id', 'nav_date'], inplace=True) merged['av'] = merged['av'].round(4) # 四舍五入保留四位小数
merged['dividend'] = merged['dividend'].round(4) # 四舍五入保留四位小数
navs = merged.drop('close', axis=1)
navs = navs.to_dict('records') navs = navs.to_dict('records')
return navs return navs
...@@ -84,4 +85,3 @@ class DefaultNavs(Navs): ...@@ -84,4 +85,3 @@ class DefaultNavs(Navs):
return red.get_last_one(eco_id=datum_id, max_date=max_date, by_release_date=by_release_date) return red.get_last_one(eco_id=datum_id, max_date=max_date, by_release_date=by_release_date)
else: else:
return red.get_last(eco_id=datum_id, max_date=max_date, count=count, by_release_date=by_release_date) return red.get_last(eco_id=datum_id, max_date=max_date, count=count, by_release_date=by_release_date)
...@@ -54,7 +54,7 @@ class JDCDataSync(DataSync, ABC): ...@@ -54,7 +54,7 @@ class JDCDataSync(DataSync, ABC):
while True: while True:
url = self.build_urls(datum=datum, page=page, start_date=start_date) url = self.build_urls(datum=datum, page=page, start_date=start_date)
if url is None: if url is None:
break raise Exception(f'''request data {datum['id']} not exist!''')
response = requests.get(url).json() response = requests.get(url).json()
if not response['success']: if not response['success']:
raise Exception(f'''request indictor failed: {response['status']}''') raise Exception(f'''request indictor failed: {response['status']}''')
......
...@@ -235,8 +235,8 @@ robo-executor: # 执行器相关 ...@@ -235,8 +235,8 @@ robo-executor: # 执行器相关
use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data: ${SYNC_DATA:off} # 是否开启同步资料数据 sync-data: ${SYNC_DATA:off} # 是否开启同步资料数据
backtest: # 回测执行器相关 backtest: # 回测执行器相关
start-date: 2012-10-16 # 回测起始日期 start-date: 2022-10-25 # 回测起始日期
end-date: 2023-03-01 # 回测截止日期 end-date: 2023-06-01 # 回测截止日期
sealing-period: 10 #调仓封闭期 sealing-period: 10 #调仓封闭期
start-step: ${BACKTEST_START_STEP:1} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 start-step: ${BACKTEST_START_STEP:1} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
......
...@@ -51,7 +51,7 @@ py-jftech: ...@@ -51,7 +51,7 @@ py-jftech:
max-workers: ${MAX_PROCESS:4} max-workers: ${MAX_PROCESS:4}
basic: # 基础信息模块 basic: # 基础信息模块
sync: sync:
start-date: 2020-01-01 # 同步数据开始日期 start-date: 1990-01-01 # 同步数据开始日期
datum: # 资料模块 datum: # 资料模块
change: change:
date: ${DATUM_CHANGE_DATE} date: ${DATUM_CHANGE_DATE}
...@@ -62,10 +62,10 @@ basic: # 基础信息模块 ...@@ -62,10 +62,10 @@ basic: # 基础信息模块
real: real:
- 'FGFSACU LX Equity' - 'FGFSACU LX Equity'
- 'TEMUSGI LX Equity' - 'TEMUSGI LX Equity'
# navs: # 净值模块 navs: # 净值模块
# exrate: # 汇率,如果不开启,整个这块注释掉 exrate: # 汇率,如果不开启,整个这块注释掉
# - from: EUR # 需要转换的货币类型 - from: EUR # 需要转换的货币类型
# ticker: EURUSD BGN Curncy # 汇率值的彭博ticker ticker: EURUSD BGN Curncy # 汇率值的彭博ticker
asset-pool: # 资产池模块 asset-pool: # 资产池模块
asset-optimize: # 资产优选模块 asset-optimize: # 资产优选模块
sortino-weight: # sortino计算需要的权重,下面每一条为一次计算,e.g. months: 3, weight: 0.5 表示 3个月数据使用权重0.5来计算分值 sortino-weight: # sortino计算需要的权重,下面每一条为一次计算,e.g. months: 3, weight: 0.5 表示 3个月数据使用权重0.5来计算分值
...@@ -87,7 +87,7 @@ portfolios: # 投组模块 ...@@ -87,7 +87,7 @@ portfolios: # 投组模块
warehouse-frequency: 1 #每隔1个月调一次仓 warehouse-frequency: 1 #每隔1个月调一次仓
redeem-list: [ 'TEUSAAU LX Equity', 'LIGTRAA ID Equity', 'TEMFHAC LX Equity', 'LUSHUAA ID Equity' ] #从持仓中的低风险资产“直接”按序赎回 redeem-list: [ 'TEUSAAU LX Equity', 'LIGTRAA ID Equity', 'TEMFHAC LX Equity', 'LUSHUAA ID Equity' ] #从持仓中的低风险资产“直接”按序赎回
solver: # 解算器相关 solver: # 解算器相关
model: prr # 结算模型 ARC ,PRR, ~ 标准解算器 model: arc # 结算模型 ARC ,PRR, ~ 标准解算器
arc: on #是否开启ARC arc: on #是否开启ARC
brr: 0.01 #误差补偿值 brr: 0.01 #误差补偿值
trr: 3 trr: 3
...@@ -232,12 +232,12 @@ reports: # 报告模块相关 ...@@ -232,12 +232,12 @@ reports: # 报告模块相关
content: "Dear All: 附件是今天生成的监测数据,請驗收,謝謝! 注>:該郵件為自動發送,如有問題請聯繫矽谷團隊 telan_qian@chifufund.com" content: "Dear All: 附件是今天生成的监测数据,請驗收,謝謝! 注>:該郵件為自動發送,如有問題請聯繫矽谷團隊 telan_qian@chifufund.com"
robo-executor: # 执行器相关 robo-executor: # 执行器相关
use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data: ${SYNC_DATA:on} # 是否开启同步资料数据 sync-data: ${SYNC_DATA:off} # 是否开启同步资料数据
backtest: # 回测执行器相关 backtest: # 回测执行器相关
start-date: 2022-02-16 # 回测起始日期 start-date: 2022-02-16 # 回测起始日期
end-date: 2023-01-03 # 回测截止日期 end-date: 2023-01-03 # 回测截止日期
sealing-period: 10 #调仓封闭期 sealing-period: 10 #调仓封闭期
start-step: ${BACKTEST_START_STEP:2} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 start-step: ${BACKTEST_START_STEP:3} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
clean-up: on clean-up: on
real: # 实盘执行器 real: # 实盘执行器
......
...@@ -6,13 +6,14 @@ __COLUMNS__ = { ...@@ -6,13 +6,14 @@ __COLUMNS__ = {
'rhp_id': 'id', 'rhp_id': 'id',
'rhp_date': 'date', 'rhp_date': 'date',
'rhp_risk': 'risk', 'rhp_risk': 'risk',
'rhp_div': 'dividend',
'rhp_div_acc': 'div_acc', 'rhp_div_acc': 'div_acc',
'rhp_rrs_id': 'signal_id', 'rhp_rrs_id': 'signal_id',
'rhp_rebalance': 'rebalance', 'rhp_rebalance': 'rebalance',
'rhp_portfolios': 'portfolios', 'rhp_portfolios': 'portfolios',
'rhp_nav': 'nav', 'rhp_nav': 'nav',
'rhp_cash': 'cash',
'rhp_fund_av': 'fund_av', 'rhp_fund_av': 'fund_av',
'rhp_fund_nav': 'fund_nav',
'rhp_fund_div': 'fund_div', 'rhp_fund_div': 'fund_div',
'rhp_div_forecast': 'div_forecast', 'rhp_div_forecast': 'div_forecast',
'rhp_asset_nav': 'asset_nav', 'rhp_asset_nav': 'asset_nav',
......
This diff is collapsed.
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