阶梯止损

阶梯止损是一种 动态止损, 它的止损线会根据 持股周期内最高股价的变化而变化, 就像图中的人民大会堂一样, 椅子的高度会随着地板的高度的变化而变化。 一旦现价踏空, 跌下止损线就卖出止损。

止损线和最高估价的关系是什么呢?
简单的来说,最高股价每上升 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)

results matching ""

    No results matching ""