策略名称"多资产风险平价动态再平衡策略"
策略逻辑说明
策略代码
# 标题:桥水 全天候策略 增加一致性度量ES 风险控制
# 回测资金需要 1000000
# 导入函数库
from jqdata import *
# 初始化函数,设定基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 输出内容到日志 log.info()
log.info('初始函数开始运行且全局只运行一次')
# 过滤掉order系列API产生的比error级别低的log
# log.set_level('order', 'error')
set_option("avoid_future_data", True)
### 股票相关设定 ###
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
set_order_cost(OrderCost(open_commission=0.0003, close_commission=0.0003, min_commission=5), type='fund')
g.confidencelevel = 2.58
g.rebalanced_asset_values = {}
g.raise_rate = -1 #0.3 #触发rebalance的上涨比例, <=0不触发
g.period = 12
g.run_count = 0
g.pool = {
'stock': {'rate':0.3, 'codes':[
{
'510310.XSHG':datetime.datetime(2013,3,25),
'513100.XSHG':datetime.datetime(2013,5,15),
'513500.XSHG':datetime.datetime(2014,1,15),
},
]},
'mid_bond':{'rate':0.15, 'codes':[
{
'511010.XSHG':datetime.datetime(2013,3,25)
}
]},
'long_bond':{'rate':0.4, 'codes':[
{'511260.XSHG':datetime.datetime(2017,8,24) #10years
},
]},
'gold':{'rate':0.075, 'codes':[
{'518880.XSHG':datetime.datetime(2013,7,29)
},
]},
'goods':{'rate':0.075, 'codes':[
{
'510170.XSHG':datetime.datetime(2011,1,25)
},
]},
}
g.stock_map_asset = init_stock_map_asset(g.pool)
## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
# 开盘前运行
#run_daily(before_market_open, time='before_open', reference_security='000001.XSHG')
# 开盘时运行
run_monthly(market_open, monthday=1, time='open', reference_security='000001.XSHG')
# 收盘后运行
#run_daily(after_market_close, time='after_close', reference_security='000001.XSHG')
def init_stock_map_asset(pool):
stock_map_asset = {}
for asset in pool:
for stocks in pool[asset]['codes']:
for code in stocks:
stock_map_asset[code] = asset
return stock_map_asset
## 开盘前运行函数
def before_market_open(context):
# 输出运行时间
#log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))
# 给微信发送消息(添加模拟交易,并绑定微信生效)
# send_message('美好的一天~')
# 要操作的股票:平安银行(g.为全局变量)
#g.security = '000001.XSHE'
pass
def get_trade_target(context):
dt=context.current_dt
ret = []
for asset in g.pool:
stock_pool = g.pool[asset]['codes']
target_stocks = []
for stocks in stock_pool:
cur_stocks_isOK = False
for start_dt in stocks.values():
if dt >= start_dt:
cur_stocks_isOK = True
break
if cur_stocks_isOK:
target_stocks = [k for k in stocks.keys()]
break
ret.extend( target_stocks )
return ret
def calc_asset_max_raise(context):
asset_values = {}
for code in context.portfolio.positions:
asset = g.stock_map_asset[code]
pos = context.portfolio.positions[code]
if asset not in asset_values:
asset_values[asset] = pos.value
else:
asset_values[asset] += pos.value
max_raise_ratio = 0
for asset in g.rebalanced_asset_values:
if asset in asset_values:
ratio = asset_values[asset] / g.rebalanced_asset_values[asset]
if ratio > max_raise_ratio:
max_raise_ratio = ratio
return max_raise_ratio
## 开盘时运行函数
def market_open(context):
#log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
if g.run_count % g.period == 0:
asset_alloc = get_trade_target(context)
#print(asset_alloc)
rebalance(context, asset_alloc)
elif g.raise_rate > 0 and calc_asset_max_raise(context) > g.raise_rate:
#增加 g.raise_rate > 0 是为了测试的时候
#可以去掉涨幅触发rebalance的逻辑
asset_alloc = get_trade_target(context)
#print(asset_alloc)
rebalance(context, asset_alloc)
g.run_count += 1
关键函数解锁后查看:
## 收盘后运行函数
def after_market_close(context):
#log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
#得到当天所有成交记录
#trades = get_trades()
#for _trade in trades.values():
# log.info('成交记录:'+str(_trade))
#log.info('一天结束')
#log.info('##############################################################')
pass
2025-02-23
