Skip to content

strategy7: recommendation based on theme

来源:https://uqer.io/community/share/54a3c0bff9f06c276f6519e7

universe=set_universe('HS300')
tickers=''
for stk in universe:
    tickers += stk[0:6]+','
tickers=tickers.strip(",")
theme_infos=DataAPI.ThemeThemesGet(ticker=tickers,beginDate='20141201',endDate='20141230',field=['themeID','themeName'])
#建立一个字典theme_id_name_dic,储存themeID与themeName对应关系
#建立一个字典theme_stk_dic,储存主题与个股的对应关系
theme_id_name_dic={}
theme_stk_dic={}

for i in range(len(theme_infos)):
    ticker = theme_infos.loc[i,'ticker']    
    if ticker[0]=='6':
        ticker += '.XSHG'
    else:
        ticker += '.XSHE'
    themeID = theme_infos.loc[i,'themeID']
    themeName = theme_infos.loc[i,'themeName']
    #建立themeID与themeName的对应关系
    if themeID not in theme_id_name_dic:
        theme_id_name_dic[themeID] = themeName
    #建立主题与个股的对应关系,其中的stock均不带后缀
    if themeID not in theme_stk_dic:
        theme_stk_dic[themeID] = [ticker]
    else:
        theme_stk_dic[themeID].append(ticker)

#过滤掉无效的主题
filter_theme_id_name_dic={}
filter_stk_theme_dic={}
filter_theme_stk_dic={}

#训练得到有效主题
for (theme_id,stk_list) in theme_stk_dic.items():
    if len(stk_list)>5:
        filter_theme_id_name_dic[theme_id] = theme_id_name_dic[theme_id]
        filter_theme_stk_dic[theme_id] = stk_list

for (theme_id,stk_list) in filter_theme_stk_dic.items():
    for stk in stk_list:
        if stk not in filter_stk_theme_dic:
            filter_stk_theme_dic[stk] = [theme_id]
        else:
            filter_stk_theme_dic[stk].append(theme_id)

filter_universe = filter_stk_theme_dic.keys()
start = datetime(2013, 6, 23)               # 回测起始时间
end   = datetime(2014, 12, 23)              # 回测结束时间
benchmark = 'HS300'                         # 策略参考标准
universe = filter_universe  # 股票池
capital_base = 100000                       # 起始资金
window=1
hold_days=2    #股票持有时间
sell_stk_list=[]
for i in range(hold_days):
    sell_stk_list.append({})

def initialize(account):                    # 初始化虚拟账户状态
    add_history('hist',window)

def handle_data(account):                   # 每个交易日的买入卖出指令
    theme_increase_raw={}
    theme_increase = {}
    n_theme = 6    #挑选涨得最好的几个主题
    n_bigstk1 = 0    #根据过去涨幅挑选龙头股
    n_bigstk2 = 2    #根据过去成交量大小挑选龙头股
    for stk in account.universe:
        theme_list = filter_stk_theme_dic[stk]
        close_price = account.hist[stk]['closePrice'].iloc[-1]
        pre_close_price = account.hist[stk]['preClosePrice'].iloc[0]
        increase_rate = (close_price-pre_close_price)*1.0/pre_close_price
        sum_turnoverVol = sum(list(account.hist[stk]['turnoverVol']))
        num_increase = increase_rate * sum_turnoverVol
        #计算主题涨幅
        for theme_id in theme_list:
            if theme_id not in theme_increase:
                theme_increase_raw[theme_id] = [num_increase,sum_turnoverVol]
            else:
                theme_increase_raw[theme_id][0] += num_increase
                theme_increase_raw[theme_id][1] += sum_turnoverVol

    for (theme_id,theme_increase_list) in theme_increase_raw.items():
        theme_increase[theme_id] = theme_increase_raw[theme_id][0]*1.0/theme_increase_raw[theme_id][1]
    #将主题按涨幅排序,排名靠前的挑选出来。    
    theme_list_sort = sorted(theme_increase.keys(), key = lambda x:theme_increase[x], reverse=True)
    good_theme = theme_list_sort[0:n_theme]
    buy_list = []
    #print 'theme_list_sort:',theme_list_sort
    #print 'good_theme',good_theme
    #挑选涨幅好的主题对应的龙头股,涨的多就是龙头股
    for theme in good_theme:
        #print account.current_date,theme_id_name_dic[theme],theme_increase[theme]
        stk_list = filter_theme_stk_dic[theme]
        stk_increase_dic = {}
        for stk in stk_list:
            if stk not in account.universe: continue
            close_price = account.hist[stk]['closePrice'].iloc[-1]
            pre_close_price = account.hist[stk]['preClosePrice'].iloc[0]
            increase_rate = (close_price-pre_close_price)*1.0/pre_close_price
            sum_turnoverVol = account.hist[stk]['turnoverVol'].iloc[window-1]
            stk_increase_dic[stk] = [increase_rate,sum_turnoverVol]
        stk_list_sort1 = sorted(stk_increase_dic.keys(), key =lambda x:stk_increase_dic[x][0], reverse = True)
        stk_list_sort2 = sorted(stk_increase_dic.keys(), key =lambda x:stk_increase_dic[x][1], reverse = True)
        #print stk_list_sort[0:n_bigstk]
        buy_list += stk_list_sort1[0:n_bigstk1]+stk_list_sort2[0:n_bigstk2]
    #买入股票,并将买入信息写入到卖出股票中
    per_money=account.cash/len(buy_list) 
    sell_next_dic = {}
    for stk in buy_list:
        amount = int(per_money/account.hist[stk]['closePrice'].iloc[window-1])
        order(stk,amount)
        sell_next_dic[stk]=amount
    sell_stk_list.append(sell_next_dic)    
    sell_today_dic=sell_stk_list.pop(0)
    if sell_today_dic!={}:
        for (stk,amt) in sell_today_dic.items():
            #如果股票今天不能交易,就下一天再卖
            if stk not in account.universe:
                sell_stk_list[0][stk]=amt
            else:
                order(stk,-amt)    



回到顶部