微吧推荐
查看所有吧>>

活跃用户
    秋大姐的强势股策略

    注意思路,一直没时间看~ 先保存~

    import talib

    import numpy as np

    import pandas as pd

    '''

    =======================================================================

     

    注意思路,一直没时间看~ 先保存~

    import talib

    import numpy as np

    import pandas as pd

    '''

    ================================================================================

    总体回测前

    ================================================================================

    '''

    # 初始化函数,设定要操作的股票、基准等等

    #总体回测前要做的事情

    def initialize(context):

        set_params()                             # 设置策略常量

        set_variables()                          # 设置中间变量

        set_backtest()                           # 设置回测条件


    #1 

    #设置策略参数

    def set_params():

        g.tc = 1                                 # 调仓天数

        g.num_stocks = 5                         # 每次调仓选取的最大股票数量

        g.stocks=get_all_securities().index      # 设置全部上市A股为初始股票池

        g.start_date = datetime.date(2016, 1, 1) # 最迟上市时间

        g.rank_stock_count = 100                 # 备选100个

        g.hsl = 1                                # 换手率上限1%

        g.day_long = 89+1                        # 计算涨幅的时长


    #2

    #设置中间变量

    def set_variables():

        g.t = 0                                  # 记录回测运行的天数

        g.if_trade = False                       # 当天是否交易


    #3

    #设置回测条件

    def set_backtest():

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

        log.set_level('order','debug')           # 设置报错等级


        

    '''

    ================================================================================

    每天开盘前

    ================================================================================

    '''

    #每天开盘前要做的事情

    def before_trading_start(context):

        if g.t%g.tc==0:

            g.if_trade=True                       # 每g.tc天,调仓一次

            set_slip_fee(context)                 # 设置手续费与手续费

            # 设置可行股票池

            g.feasible_stocks = set_feasible_stocks(g.stocks,context)

            g.feasible_stocks = stocks_can_buy(context)

        g.t+=1

        

    # 过滤停牌股票

    def filter_paused_stock(stock_list):

        current_data = get_current_data()

        return [stock for stock in stock_list if not current_data[stock].paused]

        

    # 过滤ST及其他具有退市标签的股票

    def filter_st_stock(stock_list):

        current_data = get_current_data()

        return [stock for stock in stock_list 

            if not current_data[stock].is_st 

            and 'ST' not in current_data[stock].name 

            and '*' not in current_data[stock].name 

            and '退' not in current_data[stock].name]

            

    #4

    # 设置可行股票池:过滤掉当日停牌的股票

    # 输入:initial_stocks为list类型,表示初始股票池; context(见API)

    # 输出:unsuspened_stocks为list类型,表示当日未停牌的股票池,即:可行股票池

    def set_feasible_stocks(initial_stocks,context):

        # 去除2016年上市的新股

        end_date = datetime.date(2200,1,1)

        old_stock = []

        for stock in initial_stocks:

            info_stock = get_security_info(stock)

            if info_stock.start_date < g.start_date and info_stock.end_date == end_date:

                old_stock.append(stock)

        # log.debug(old_stock)

        

        

        # 判断初始股票池的股票是否停牌,返回list

        old_stock = filter_paused_stock(old_stock)

        # 去除ST

        old_stock = filter_st_stock(old_stock)

        

        return old_stock


        

    #5

    # 根据不同的时间段设置滑点与手续费

    # 输入:context(见API)

    # 输出:none

    def set_slip_fee(context):

        # 将滑点设置为0

        set_slippage(FixedSlippage(0)) 

        # 根据不同的时间段设置手续费

        dt=context.current_dt

        if dt>datetime.datetime(2013,1, 1):

            set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) 

            

        elif dt>datetime.datetime(2011,1, 1):

            set_commission(PerTrade(buy_cost=0.001, sell_cost=0.002, min_cost=5))

                

        elif dt>datetime.datetime(2009,1, 1):

            set_commission(PerTrade(buy_cost=0.002, sell_cost=0.003, min_cost=5))

        else:

            set_commission(PerTrade(buy_cost=0.003, sell_cost=0.004, min_cost=5))

            

    '''

    ================================================================================

    每天交易时

    ================================================================================

    '''

    # 每天回测时做的事情

    def handle_data(context,data):

        

        # 待卖出的股票,list类型

        list_to_sell = stocks_to_sell(context, data)

        # 过滤掉当日停牌的股票

        list_to_sell = filter_paused_stock(list_to_sell)

        # 需买入的股票

        list_to_buy = pick_buy_list(context, g.feasible_stocks, list_to_sell)

        # 卖出操作

        sell_operation(list_to_sell)

        # 买入操作

        buy_operation(context, list_to_buy)

        

    def stocks_can_buy(context):

        list_to_buy = []

        # day_long-1天涨幅榜前100名股票

        hp = history(g.day_long, field='paused', security_list=g.feasible_stocks).sum()

        

        unsuspened_stocks = []

        for i in hp.index:

            if hp[i] == 0:

                unsuspened_stocks.append(i)

        # log.debug(unsuspened_stocks)

        

        h = history(g.day_long, field='close', security_list=unsuspened_stocks)

        df_grow = pd.DataFrame(columns=['-89','-1', 'grow'])

        for i in unsuspened_stocks:

            list_stocks = []

            list_stocks.append(i)

            grow_value = (h[i][-1] - h[i][-1*g.day_long])/h[i][-1*g.day_long]

            df_now = pd.DataFrame([[h[i][-1*g.day_long], h[i][-1], grow_value]], index=list_stocks, columns=['-89','-1', 'grow'])

            df_grow = df_grow.append(df_now)

        

        df_grow = df_grow.sort(columns=['grow'], ascending=False)[0:g.rank_stock_count]

        

        hv = history(1, field='volume', security_list=df_grow.index)

        # log.debug(hv['000520.XSHE'][-1])

        

        for i in df_grow.index:

            q = query(valuation.code, valuation.circulating_cap).filter(valuation.code == i)

            cap = get_fundamentals(q)

            if hv[i][-1] == 0:

                continue

            if hv[i][-1]/100/cap.loc[0, 'circulating_cap'] < g.hsl:

                list_to_buy.append(i)


        return list_to_buy

        

    #8

    # 获得卖出信号

    # 输入:context(见API文档), list_to_buy为list类型,代表待买入的股票

    # 输出:list_to_sell为list类型,表示待卖出的股票

    def stocks_to_sell(context, data):

        list_to_sell = []

        list_hold = context.portfolio.positions.keys()

        if len(list_hold) == 0:

            return list_to_sell

        

        for i in list_hold:

            if context.portfolio.positions[i].avg_cost *0.95 >= data[i].close:

                #亏损 5% 卖出

                log.debug(i, ' ', context.portfolio.positions[i].avg_cost, 'close', data[i].close)

                list_to_sell.append(i)

            if context.portfolio.positions[i].avg_cost *1.1

    • 分享到:
    排序方式:回复时间 共有0条评论
    想要参与评论?您还未登录,请 登录 or 注册