跟踪止损
是不是很多人的资金曲线就和坐过山车一样?
上到高处,又无情的下降?
人的心情也和曲线一样。
现在好了, 有方法解决过山车这个问题了。
这里介绍一种叫做跟踪止损的方法。
简单来说,就是一旦回撤超过 一定数值 X , 就卖出股票。
这个方法 在股灾和熔断期间都有很好的表现。
具体使用方法就看我这个例子吧。 代码里有很明确的套用方法哦。
'''
止损描述 :
回撤超过 X% 之后 止损。
套用方法:
0: 在 init 中设置你的 回撤 X context.drawdown = 0.1 % 回撤限度 10%
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','601390.XSHG')
context.drawdown= 0.1 # 回撤限度 10%
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]
#currSP=context.initSPM*(1+math.floor((maxvalue/bought_value-1)/context.step)*context.increment) #阶梯止损算法 例: 该股市值增加10%, 止盈比例提高 5%
temp=pd.DataFrame({str(stock):[max(maxvalue,market_value)]})
context.maxvalue=pd.concat([context.maxvalue,temp], axis=1, join='inner') # 更新其盘中最高价值和先阶段比例。
drawdown=1-market_value/max(maxvalue,market_value)
print(str(stock)+'的成本为:' +str( bought_value) +', 最高价值为:'+str(maxvalue)+'现价值为:'+ str(market_value))
print(str(stock) +'的现 回撤为: ' +str(drawdown*100)+ '%')
#logger.info ( type(market_value))
#logger.info(type(ontext.maxvalue[stock].values)))
if drawdown>context.drawdown:# 现价低于 原价一定比例
order_target_percent(stock,0)
print(str(stock)+'回撤大于'+ str(context.drawdown*100)+ '%'+' 触发止损')
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.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)