2019-11-11

ETF28择时交易法,回测结果,18年之前还可以,18年以后到现在,亏损40%,惨啊,什么原因,还不知道,先记下来,回头再搞。以下是代码:




#设置参数和回测

def initialize(context):

    set_params()

    set_backtest()

#设置参数,定义交易时间和股票

def set_params():

    #设置基准收益

    set_benchmark('000300.XSHG')

    g.lag = 20 #回溯期

    g.hour = 14 #小时

    g.minute = 53 #分钟

    g.sz = '000016.XSHG' #计算标的,上证50指数,超级大盘股

    g.hs = '000300.XSHG' #计算标的,沪深300指数,价值股

    g.zz = '000905.XSHG' #计算标的,中证500指数,成长股

    g.ETF50 = '510050.XSHG' #交易标的50

    g.ETF300 = '510300.XSHG' #交易标的300

    g.ETF500 = '510500.XSHG' #交易标的500


#设置回测条件

def set_backtest():

    set_option('use_real_price', True) #用真实价格交易

    log.set_level('order', 'error') #过滤日志


#每天开盘前要做的事情,输入context,输出none

def before_trading_start(context):

    #将滑点设置为交易额的千分之2

    set_slippage(PriceRelatedSlippage(0.002))

    #设置手续费

    dt = context.current_dt

    set_order_cost(OrderCost(open_tax=0,close_tax=0.001,open_commission=0.0003,\

    close_commission=0.0003,close_today_commission=0,min_commission=5),type='stock')

    #买入时印花税0,卖出时印花税千1,买入佣金万3,卖出佣金万3,最低佣金5元



#定义函数,取得股票在某个期间的收盘价

def getStockPrice(stock, interval):

    h = attribute_history(stock, interval, unit='1d', fields=('close'),skip_paused=True)

    return (h['close'].values[0], h['close'].values[-1])


#计算得到信号,是一个string

def get_signal(context):

    #取出价格

    interval50,Yesterday50 = getStockPrice(g.sz, g.lag)

    interval300,Yesterday300 = getStockPrice(g.hs, g.lag)

    interval500,Yesterday500 = getStockPrice(g.zz, g.lag)


    #计算20日动量

    sz50increase = (Yesterday50-interval50) / interval50

    hs300increase = (Yesterday300-interval300) / interval300

    zz500increase = (Yesterday500-interval500) /interval500


    #计算3个指数基金的持有金额

    hold50 = context.portfolio.positions[g.ETF50].total_amount

    hold300 = context.portfolio.positions[g.ETF300].total_amount

    hold500 = context.portfolio.positions[g.ETF500].total_amount


    #对3个标的的止损

    if(sz50increase<=0 and hold50>0) or(hs300increase<=0 and hold300>0) or(zz500increase<=0 and hold500>0):

        print('sell')

        return 'sell_the_stocks' #返回string给get_signal函数


    #如果50增长率大于300和500,且幅度大于0.01,且50增长率>0,且50、300、500无仓位,买入50

    elif sz50increase-hs300increase>0.01 and sz50increase-zz500increase>0.01 and sz50increase>0 and (hold50==0 and hold300==0 and hold500==0):

        print('buy 50')

        return 'ETF50'


    #如果300增长率大于50和500,且幅度大于0.01,且300增长率>0,且50、300、500无仓位,买入300

    elif hs300increase-zz500increase>0.01 and hs300increase-sz50increase>0.01 and hs300increase>0 and (hold50==0 and hold300==0 and hold500==0):

        print('buy 300')

        return 'ETF300'


    #as same as above

    elif zz500increase-sz50increase>0.01 and zz500increase-hs300increase>0.01 and zz500increase>0  and (hold50==0 and hold300==0 and hold500==0):

        print('buy 500')

        return 'ETF500'


#卖出指令

def sell_the_stocks(context):


    for i in context.portfolio.positions.keys():

        return (log.info("Selling %s" %i), order_target_value(i,0))


#买入股票

def buy_the_stocks(context,signal):

    return (log.info("Buying %s"%signal),order_value(eval('g.%s'%signal),context.portfolio.available_cash))


def handle_data(context, data):

    hour=context.current_dt.hour

    minute = context.current_dt.minute

    #if hour==g.hour and minute==g.minute:

    signal=get_signal(context)

    print('trade signal is %s'%signal)

    if signal=='sell_the_stocks':

        sell_the_stocks(context)

        print('sell sell sell')

    elif signal == 'ETF50' or signal=='ETF300' or signal=='ETF500':

        buy_the_stocks(context, signal)

        print('buy buy buy')

def after_trading_end(context):

    log.info(context.portfolio.available_cash+context.portfolio.positions_value)

    return

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,319评论 0 10
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,457评论 0 23
  • 林敏玲傻子情商低:【自私,推卸责任,自以为是,跟明华有一点像喜欢讲道理,敏感的要死,神经紧绷的人,喜欢争辩,喜欢质...
    是狒狒阅读 376评论 0 0
  • 图片发自简书App (B女孩) B女孩家里开了个豆腐坊,是做豆腐的。她在新生联欢会的自我介绍环节和我们谈了整...
    余小样阅读 413评论 5 10
  • 国庆假期很快就结束了,孩子明天就要开始上学,而作业因为旅行还欠下很多。怎么办呢?看着孩子忙的急的饭都没吃直喊肚子疼...
    终身学习践行者杨倩阅读 90评论 0 1