#### 更新问题
多次回撤后,发现了一个bug,已经克隆的伙伴,直接替换以下代码即可。
# 止盈
def take_profit(context):
if g.r > 40 and g.down > 0.09:
#基金净值收益达到40%以上并且最大回撤9%时,进行止盈赎回操作
g.r = 1
g.down = 0.01
date_now = context.previous_date
rate0 = max_increase(date_now)[0]
log.info('当前持仓总市值(0.40止盈后),基金净值最大增长:%s ,基金持仓成本:%s' %(rate0,context.portfolio.positions[g.security].avg_cost))
take_profit_rate = 1 # 止盈比例 为计算方便,全部卖出,再考虑是否买入
g.high = 0
g.buy_avg_cost = 0
g.last_month_value =0
if rate0 > 90 :
g.init_status = False # 等待建仓
else :
g.take_profit_days = 1
# take_profit_rate = 0.5 # 止盈比例
amount = take_profit_rate * context.portfolio.positions[g.security].total_amount
g.take_profit_value = take_profit_rate * context.portfolio.positions[g.security].value
redeem(g.security, amount)
g.investments = np.append(g.investments,g.take_profit_value)
g.take_profit_flag = 1 # 止盈标志
log.info('当前持仓总市值(0.40止盈后立刻)%.2f'%context.portfolio.positions[g.security].value)
log.info('当前持仓仓位(0.40止盈后立刻)%.2f'%context.portfolio.positions[g.security].total_amount)
# 止损 def stot_lost 价值平均策略,不止损
# 建仓条件
def init_position(context):
if g.take_profit_days > 40 :
g.take_profit_days = 0
g.totalmoney = context.portfolio.available_cash
g.money = g.totalmoney * 0.2 / 8 # 建仓时买入80%,余下20%分为8期
print( '每期投资金额:%.2f' % g.money)
purchase(g.security,g.totalmoney * 0.5)
g.init_status = True
g.last_month_value = g.totalmoney * 0.5 * g.month_growth_rate #
g.investments = np.append(g.investments,-g.totalmoney * 0.5) # np.append(arr, values,axis=None) 为原始array添加一些values
g.count = 1
if g.init_status : return
date_now = context.previous_date
rate1 = max_increase(date_now)[1]
if rate1 < 0.318 :
g.totalmoney = context.portfolio.available_cash
g.money = g.totalmoney * 0.2 / 8 # 建仓时买入80%,余下20%分为8期
print( '每期投资金额:%.2f' % g.money)
purchase(g.security,g.totalmoney * 0.8)
g.init_status = True
g.last_month_value = g.totalmoney * 0.8 * g.month_growth_rate #
g.investments = np.append(g.investments,-g.totalmoney * 0.8) # np.append(arr, values,axis=None) 为原始array添加一些values
g.count = 1
# 基金交易
def target_mv(context):
if g.init_status == False : return
cash = context.portfolio.available_cash
if context.portfolio.positions[g.security].total_amount>0: # 持仓份额> 0
g.new_dwjz = context.portfolio.positions[g.security].value/context.portfolio.positions[g.security].total_amount
if g.count == 0: # 首次买入
purchase(g.security,g.money) # 申购基金
g.investments = np.append(g.investments,-g.money) # np.append(arr, values,axis=None) 为原始array添加一些values
g.count = 1
elif g.count!=0 and g.take_profit_flag == 0 :
#当月未止盈的情况下正常使用价值平均策略申购基金
thismonth = g.money - (context.portfolio.positions[g.security].value - g.last_month_value)
if thismonth > 0 and cash > 100 :
#净值增长不够平均市值增长
# 避免个别月度买入值过大,实证取5倍月值时,投资业绩变化不大
if thismonth / g.money > 5 : thismonth = 5 * g.money
# 超过可用现金,则全部买完
if thismonth > cash : thismonth = cash
log.info('当月净值涨幅不够平均市值增长111')
purchase(g.security,thismonth)
g.investments = np.append(g.investments,-thismonth)
# 当前价格高于平均持仓成本,并且涨幅高于本月净值增加值时,方才减仓
elif thismonth < = 0 and context.portfolio.positions[g.security].price > context.portfolio.positions[g.security].avg_cost :
if -thismonth / g.money > 10 : thismonth = -10 * g.money
amount = -thismonth / context.portfolio.positions[g.security].price
redeem(g.security, amount ) # 净值增长超过目标市值增长,则赎回
g.investments = np.append(g.investments,-thismonth)
elif g.count!=0 and g.take_profit_flag == 1:
#当月发生止盈情况的申购策略:申购额按照当前持仓数量*(当前单位净值-上月申购后单位净值)计算,扔遵循固定增值额度
thismonth = g.money - (g.new_dwjz-g.last_month_dwjz)*context.portfolio.positions[g.security].total_amount
g.take_profit_flag = 0
# T + 3 日,获取标的价值,单位净值
def compute_value(context):
if g.init_status == False : return
g.last_month_value = context.portfolio.positions[g.security].value * g.month_growth_rate
if context.portfolio.positions[g.security].total_amount>0 :
g.take_profit = context.portfolio.positions[g.security].value/context.portfolio.positions[g.security].total_amount
log.info('当前持仓总市值(4th)%.2f'%g.last_month_value)
log.info('当前持仓仓位(4th)%.2f'%context.portfolio.positions[g.security].total_amount)
def compute_profit(context):
if g.init_status == False : return
if context.run_params.end_date.year == context.current_dt.year and context.current_dt.month == context.run_params.end_date.month:
g.investments = np.append(g.investments,context.portfolio.positions[g.security].value)
irr = np.irr(g.investments)
log.info(g.investments)
log.info(len(g.investments))
log.info('月度irr 为:%.4f'%irr)
yearlyreturn = np.power(1+irr,12)-1
log.info('策略年化收益率为:%.4f'%yearlyreturn)
def max_increase(date):
date_now = date
days = 250 *1.5
# 1.5年内的最高点
h = get_price(g.index, end_date=date, frequency='1d', fields='close',
count=250*1.5, panel=False )
h0 = h['close'].idxmax()
max0 = h['close'].max()
min0 = h['close'].loc[h0:].min()
# 高点前的起涨点
h = get_price(g.index, end_date=h0, frequency='1d', fields='close',
count=250*2.5, panel=False )
min1 = h['close'].min()
# print(min1)
l1 = h['close'].idxmin()
growth0 = max0 - min1
rate0 = max0/min1 * 100 - 100
down0 = max0 - min0
rate1 = 1- down0 / growth0
return rate0,rate1
2022-09-19