跟踪止损

是不是很多人的资金曲线就和坐过山车一样?
上到高处,又无情的下降?
人的心情也和曲线一样。

现在好了, 有方法解决过山车这个问题了。

这里介绍一种叫做跟踪止损的方法。
简单来说,就是一旦回撤超过 一定数值 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)

results matching ""

    No results matching ""