策略止盈止损
由clearyf创建,最终由qxiao 被浏览 711 用户
新版请移步:
https://bigquant.com/wiki/doc/114-YCE9b0Z1h3
\
导语
止盈止损是交易中比较常用的技巧,想要用好也比较困难。本文对其进行简单介绍,帮助大家可以在策略里面灵活添加止盈止损。
止损又叫 “割肉”, 指的是当一个投资组合亏损达到一定比例及时清仓出局, 以免形成更大的亏损的行为。 止盈是指当盈利大于一定数额, 及时获利了结。
止盈止损为什么重要呢?
- 侥幸的心理作祟,某些投资者尽管也知道趋势上已经到止盈止损位,但由于过于犹豫,总是想再涨一点或再跌一点就止盈止损出局,导致自己错过最佳止盈止损的大好时机;
- 价格频繁的波动会让投资者犹豫不决,经常性错误的止损止盈会给投资者留下挥之不去的记忆,从而动摇投资者下次止损止盈的决心;
- 过于贪婪,有些投资者在趋势已经到达止盈位置了之后总抱着还会有盈利的空间而不愿意刹车止盈。
在这里提供了几个简单的止盈止损方案的模板, 在写这些代码的时候考虑了用户的体验,用户只需将相应的代码复制粘贴到自己的策略中,并设置相关参数就能正常使用。
我们先以**双均线策略**为例,添加固定点数止盈条件。我们只需修改Trade回测模块中的主函数:
止损功能代码
第一步:在主函数的起始位置加入止盈止损功能代码:
固定点数止盈
固定点数止盈代码
解释:建仓以后,当盈利固定点数,达到止盈条件,止盈出场
#------------------------------------------止赢模块START--------------------------------------------
date = data.current_dt.strftime('%Y-%m-%d')
positions = {e.symbol: p.cost_basis for e, p in context.portfolio.positions.items()}
# 新建当日止赢股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
current_stopwin_stock = []
if len(positions) > 0:
for i in positions.keys():
stock_cost = positions[i]
stock_market_price = data.current(context.symbol(i), 'price')
# 赚3元就止赢
if stock_market_price - stock_cost >= 3:
context.order_target_percent(context.symbol(i),0)
current_stopwin_stock.append(i)
print('日期:',date,'股票:',i,'出现止盈状况')
#-------------------------------------------止赢模块END---------------------------------------------
就实现了在策略中添加固定点数止盈功能,模板代码我们整理到文末。
其它止盈止损方式的代码如下所示,只需要将对应的代码粘贴到回测模块的主函数头部即可实现相应的功能。
固定百分比止盈
固定百分比止盈代码 解释:建仓以后,当盈利固定百分比,达到止盈条件,止盈出场
#------------------------------------------止赢模块START--------------------------------------------
date = data.current_dt.strftime('%Y-%m-%d')
positions = {e.symbol: p.cost_basis for e, p in context.portfolio.positions.items()}
# 新建当日止赢股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
current_stopwin_stock = []
if len(positions) > 0:
for i in positions.keys():
stock_cost = positions[i]
stock_market_price = data.current(context.symbol(i), 'price')
# 赚10%就止赢
if (stock_market_price - stock_cost ) / stock_cost>= 0.1:
context.order_target_percent(context.symbol(i),0)
current_stopwin_stock.append(i)
print('日期:',date,'股票:',i,'出现止盈状况')
#-------------------------------------------止赢模块END---------------------------------------------
固定点数止损
固定点数止损代码 解释:建仓以后,当亏损固定点数,达到止损条件,止损出场
#------------------------------------------止损模块START--------------------------------------------
date = data.current_dt.strftime('%Y-%m-%d')
positions = {e.symbol: p.cost_basis for e, p in context.portfolio.positions.items()}
# 新建当日止损股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
current_stoploss_stock = []
if len(positions) > 0:
for i in positions.keys():
stock_cost = positions[i]
stock_market_price = data.current(context.symbol(i), 'price')
# 亏1元就止损
if stock_market_price - stock_cost <= -1:
context.order_target_percent(context.symbol(i),0)
current_stoploss_stock.append(i)
print('日期:',date,'股票:',i,'出现止损状况')
#-------------------------------------------止损模块END---------------------------------------------
固定百分比止损
固定百分比止损代码
解释:建仓以后,当亏损固定百分比时,达到止损条件,止损出场
#------------------------------------------止损模块START--------------------------------------------
date = data.current_dt.strftime('%Y-%m-%d')
positions = {e.symbol: p.cost_basis for e, p in context.portfolio.positions.items()}
# 新建当日止损股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
current_stoploss_stock = []
if len(positions) > 0:
for i in positions.keys():
stock_cost = positions[i]
stock_market_price = data.current(context.symbol(i), 'price')
# 亏5%就止损
if (stock_market_price - stock_cost) / stock_cost <= -0.05:
context.order_target_percent(context.symbol(i),0)
current_stoploss_stock.append(i)
print('日期:',date,'股票:',i,'出现止损状况')
#-------------------------------------------止损模块END---------------------------------------------
跟踪止损
跟踪止损代码 解释:建仓初期,确定一个初始止损,如果股票下跌,达到初始止损条件,出场。如果股票上涨,那么初始止损不再适用,而是采取止损位置不断抬高的跟踪止损,能够防止利润的大幅回吐
#------------------------------------------止损模块START--------------------------------------------
date = data.current_dt.strftime('%Y-%m-%d')
equities = {e.symbol: p for e, p in context.portfolio.positions.items() if p.amount>0}
# 新建当日止损股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
current_stoploss_stock = []
if len(equities) > 0:
for i in equities.keys():
stock_market_price = data.current(context.symbol(i), 'price') # 最新市场价格
last_sale_date = equities[i].last_sale_date # 上次交易日期
delta_days = data.current_dt - last_sale_date
hold_days = delta_days.days # 持仓天数
# 建仓以来的最高价
highest_price_since_buy = data.history(context.symbol(i), 'high', hold_days, '1d').max()
# 确定止损位置
stoploss_line = highest_price_since_buy - highest_price_since_buy * 0.1
record('止损位置', stoploss_line)
# 如果价格下穿止损位置
if stock_market_price < stoploss_line:
context.order_target_percent(context.symbol(i), 0)
current_stoploss_stock.append(i)
print('日期:', date , '股票:', i, '出现止损状况')
#-------------------------------------------止损模块END--------------------------------------------------
修改卖出逻辑
止赢和止损实质上是条件卖出!对于已经止盈/止损的股票我们应当使用列表记录下来,并在轮仓循环卖出逻辑中跳过以避免多次卖出造成空头持仓。如下所示,我们在循环卖出逻辑中加入判断语句:
修改卖出逻辑
# 如果有卖出信号
if len(stock_to_sell)>0:
for instrument in stock_to_sell:
#----------这里加入股票判断,如果已经止盈/止损了就跳过此股票,避免二次卖出--------
if instrument in current_stopwin_stock:
continue
#----------------------------------------------------------------------------------------
sid = context.symbol(instrument) # 将标的转化为equity格式
cur_position = context.portfolio.positions[sid].amount # 持仓
if cur_position > 0 and data.can_trade(sid):
context.order_target_percent(sid, 0) # 全部卖出
cash_for_buy += stock_hold_now[instrument]
双均线+固定点位止损案例
https://bigquant.com/experimentshare/eaa95b737f5f416a9e02d09460fbe9f3
双均线+移动止损案例
https://bigquant.com/experimentshare/51559a3b408344cdbdef5b3459d5b6fc
小结: 本文为大家介绍了几种止盈止损方案模板,大家只需复制并粘贴到模板策略交易模块的主函数中即可使用,合理的利用止盈止损技巧,可以帮助大家构建更加成熟的量化策略,享有更加长远的收益。