阶梯止损
阶梯止损是一种 动态止损, 它的止损线会根据 持股周期内最高股价的变化而变化, 就像图中的人民大会堂一样, 椅子的高度会随着地板的高度的变化而变化。 一旦现价踏空, 跌下止损线就卖出止损。
止损线和最高估价的关系是什么呢?
简单的来说,最高股价每上升 X% , 止损线就会相应的上升 Y% 。 我们在这里提供了一个模板, X 和Y 的值由你决定。
伪码如下。
M= 初始止损比例
X= 阶梯长度
Y= 阶梯变化率 (阶梯每改变一次, 止损线上涨的幅度)
止损线改变次数=floor[log(周期内最高股价/买入价)/log(1+ X%)]
止损价= M * [1+Y%] ^ 止损线改变次数
if 现价< 止损价:
直接跌破止损价, 卖出止损。
else:
继续持有
源代码如下:
'''
止损描述 :
设置初始 止损比例 M , 股价每上涨 X% , 就将止损比例 提高 Y %
本例中:初始止损比例为 -10%。 股价每上涨 10%, 就将止盈比例提高9%
套用方法:
0: 在 init 中设置你的 A X Y
1: 复制‘scheduler.run_daily(stoploss)’ 至 init
2: 复制 def stoploss , def createdic 到策略内
3: 在 order 之后加入 createdic(context,bar_dict,stock)
'''
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
import pandas as pd
import numpy as np
import time
import math
import datetime
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
context.to_buy = ('300033.XSHE','000025.XSHE')
context.initSLM=0.9 # 初始止损比例 M
context.step=0.10 # 间隔 X
context.increment=0.09 # 止损增量 Y
context.maxvalue=pd.DataFrame()
# 实时打印日志
#scheduler.run_daily(stoploss)
logger.info("Interested at stock: " + str(context.to_buy))
scheduler.run_monthly(position,1)
scheduler.run_daily(stoploss)
def stoploss(context,bar_dict):
for stock in context.portfolio.positions:
market_value=context.portfolio.positions[stock].market_value# 该股市场价值 单位(RMB)
bought_value=context.portfolio.positions[stock].bought_value#该股初始价值 单位(RMB)
stockdic=context.maxvalue[stock]
maxvalue=stockdic[0]
del context.maxvalue[stock]
currSL=context.initSLM*(1+context.increment)**math.floor((math.log(maxvalue/bought_value)/math.log(1+context.step)))#阶梯止损算法
temp=pd.DataFrame({str(stock):[max(maxvalue,market_value),currSL]})
context.maxvalue=pd.concat([context.maxvalue,temp], axis=1, join='inner') # 更新dataframe。
print(str(stock)+'的成本为:' +str( bought_value) +', 最高价值为:'+str(maxvalue)+'现价值为:'+ str(market_value))
print(str(stock) +'的现 止损价位为: ' +str(currSL))
#logger.info ( type(market_value))
#logger.info(type(ontext.maxvalue[stock].values)))
if market_value<bought_value*currSL:# 现价初始止损价
order_target_percent(stock,0)
#del context.maxvalue[stock]
print(str(stock)+ ('触发止损'))
'''elif market_value<bought_value*currSL:# 现价低于阶梯止损价
order_target_percent(stock,0)
print(str(stock)+ ('触发初始止损'))
del context.maxvalue[stock]'''
pass
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
# 开始编写你的主要的算法逻辑
# bar_dict[order_book_id] 可以拿到某个证券的bar信息
# context.portfolio 可以拿到现在的投资组合状态信息
# 使用order_shares(id_or_ins, amount)方法进行落单
# TODO: 开始编写你的算法吧!
#position(context,bar_dict)
#logger.info(type(context.now))
pass
def createdic(context,bar_dict,stock):
if stock not in context.maxvalue.columns:
temp=pd.DataFrame({str(stock):[context.portfolio.positions[stock].bought_value,context.initSLM]})
context.maxvalue = pd.concat([context.maxvalue, temp], axis=1, join='inner')
print(context.maxvalue)
def position(context,bar_dict):
if len(context.to_buy)!=0:
for stock in context.to_buy:
order_target_percent(stock,1/len(context.to_buy))
createdic(context,bar_dict,stock)
else:
order_target_percent(stock,0)