Skip to content

Latest commit

 

History

History
346 lines (288 loc) · 19.4 KB

180.md

File metadata and controls

346 lines (288 loc) · 19.4 KB

快速研究主题神器

来源:https://uqer.io/community/share/551e5160f9f06c8f33904513

用于快速研究某个主题,可以获得以下信息

  • 主题相关的成分股
  • 主题在最近1年、3个月、5个交易日内的涨幅
  • 依据涨幅和成交量来获取在最近1年、3个月、5个交易日内的主题龙头股,并列出龙头股在这段时间区间内的涨幅
  • 依据通联算法,获得与主题相关度最高的个股以及个股在最近1年、3个月、5个交易日内的涨幅

该代码用法

  • step1:先在输入1处输入待研究的主题名称,如“新能源汽车”,运行“输入1”所在的cell,可以看到该主题所对应的主题id。有可能有多个主题包含了输入的主题名称,需要从中挑选自己想要研究的主题
  • step2:确定了主题id,在“输入2”所在cell修改theme_id,注意格式是字符串
  • step3:运行所有cell,便可获取与主题相关的信息了
#先通过主题名称获得主题id
themeName = u'生物医药'                     ###################输入1,在此处输入要研究的主题名称###################
field1 = ['themeID','themeName']
thms_id = DataAPI.ThemesContentGet(themeName=themeName,field=field1)
thmid2nm_dic = dict(zip(thms_id['themeID'],thms_id['themeName']))    #获得主题id与主题名称的对应
thms_id
themeID themeName
0 4462 生物医药股
1 120419 生物医药
2 120420 生物医药产业
##这里是输入
theme_id = '120419'              ###################输入2,由上面可获得主题id,在此处输入主题id,注意格式是字符串###################

field2 = ['themeID','themeName','ticker','secShortName','returnScore','textContributionScore','industryScore']
thm_tks = DataAPI.TickersByThemesGet(themeID=theme_id,field=field2)    #获得该主题相关的证券,以及证券与主题的相关度
tk2nm_dic = dict(zip(thm_tks['ticker'],thm_tks['secShortName']))
import pandas as pd
from CAL.PyCAL import *
cal = Calendar('China.SSE')

def CountTime():    #返回的是datetime格式    
    today = datetime.today()
    today_str = today.strftime("%Y%m%d")
    cal_date = Date.fromDateTime(today)       
    time1=" 15:05:00"
    ben_time = datetime.strptime(today_str+time1,"%Y%m%d %H:%M:%S")
    if cal.isBizDay(cal_date) & (today>ben_time):    #如果是交易日,则判断当天是不是在15点前        
        date = today
    else:    #如果当天不是交易日,则获得前一个交易日
        cal_wd = cal.adjustDate(cal_date,BizDayConvention.Preceding)    #Date格式
        date = cal_wd.toDateTime()    #datetime格式        
    return date

def GetMktEqud(tk_list,**kargs):    #该函数是用来调取市场行情数据,由于调取时有长度限制,如果查询的个股数太多,需要分批调取
    num = 100
    cnt_num = len(tk_list)/num
    if cnt_num > 0:
        df = pd.DataFrame({})
        for i in range(cnt_num):
            sub_df = DataAPI.MktEqudGet(ticker=tk_list[i*num:(i+1)*num],**kargs)
            df = pd.concat([df,sub_df])
        if (i+1)*num != len(tk_list):
            sub_df = DataAPI.MktEqudGet(ticker=tk_list[(i+1)*num:],**kargs)
            df = pd.concat([df,sub_df])
    else:
        df = DataAPI.MktEqudGet(ticker=tk_list,**kargs)
    return df

def GetReturn(Mkt_Info_df):    #该函数是用来获得主题在一段时间内的收益,以及个股在这段时间内的收益(先计算成分股在一段时间内的涨幅,再加权成交金额得到主题的涨幅)

    Mkt_Info_df_gp = Mkt_Info_df.groupby('ticker')    
    tk_inc_dic = {'ticker':[],'return':[],'turnoverValue':[]}
    for tk,sub_info in Mkt_Info_df_gp:
        rtn = sub_info['increase'].prod()-1
        tnv = sub_info['turnoverValue'].sum()/len(sub_info)    #获得平均成交金额
        tk_inc_dic['ticker'].append(tk)
        tk_inc_dic['return'].append(rtn)
        tk_inc_dic['turnoverValue'].append(tnv)        
    tk_inc_df = pd.DataFrame(tk_inc_dic)
    tk_inc_df['secShortName'] = tk_inc_df['ticker'].apply(lambda x:tk2nm_dic[x])
    rtn_together = (tk_inc_df['return']*tk_inc_df['turnoverValue']).sum()/tk_inc_df['turnoverValue'].sum()    #获得该主题一段时间的涨幅,成交金额加权收益
    return rtn_together,tk_inc_df
print '主题关联的个股'
thm_tks

主题关联的个股
themeID themeName ticker secShortName returnScore textContributionScore industryScore
0 120419 生物医药 000004 国农科技 0.935363 0.000000 0.785714
1 120419 生物医药 000403 ST生化 0.927900 0.000000 0.714286
2 120419 生物医药 000513 丽珠集团 0.963505 0.030303 0.714286
3 120419 生物医药 000538 云南白药 0.985011 0.260606 0.714286
4 120419 生物医药 000597 东北制药 0.988989 0.103030 0.714286
5 120419 生物医药 000661 长春高新 0.938084 0.193939 0.714286
6 120419 生物医药 000739 普洛药业 0.954498 0.042424 0.714286
7 120419 生物医药 000790 华神集团 0.816360 0.006061 0.714286
8 120419 生物医药 000820 金城股份 0.630109 0.000000 0.017857
9 120419 生物医药 000931 中关村 0.927900 1.000000 0.062500
10 120419 生物医药 000963 华东医药 0.693950 0.193939 0.714286
11 120419 生物医药 002004 华邦颖泰 0.791938 0.078788 0.750000
12 120419 生物医药 002007 华兰生物 0.942944 0.406061 0.714286
13 120419 生物医药 002019 亿帆鑫富 0.982201 0.121212 0.750000
14 120419 生物医药 002020 京新药业 0.915740 0.018182 0.714286
15 120419 生物医药 002030 达安基因 0.142927 0.545455 0.714286
16 120419 生物医药 002038 双鹭药业 0.680201 0.012121 0.714286
17 120419 生物医药 002102 冠福股份 0.847786 0.000000 0.053571
18 120419 生物医药 002107 沃华医药 0.000000 0.248485 0.714286
19 120419 生物医药 002219 恒康医疗 0.930044 0.169697 0.714286
20 120419 生物医药 002286 保龄宝 0.904069 0.000000 0.017857
21 120419 生物医药 002287 奇正藏药 0.897739 0.012121 0.714286
22 120419 生物医药 002294 信立泰 0.785857 0.169697 0.714286
23 120419 生物医药 002317 众生药业 0.927900 0.115152 0.714286
24 120419 生物医药 002349 精华制药 0.927900 0.012121 0.714286
25 120419 生物医药 002432 九安医疗 0.804717 0.333333 0.714286
26 120419 生物医药 002462 嘉事堂 0.835883 0.036364 0.714286
27 120419 生物医药 002550 千红制药 0.961297 0.012121 0.714286
28 120419 生物医药 002581 万昌科技 0.772591 0.078788 0.035714
29 120419 生物医药 002653 海思科 0.900234 0.054545 0.714286
... ... ... ... ... ... ... ...
52 120419 生物医药 600220 江苏阳光 0.754740 0.000000 0.035714
53 120419 生物医药 600222 太龙药业 0.866747 0.018182 0.714286
54 120419 生物医药 600249 两面针 0.944427 0.006061 0.035714
55 120419 生物医药 600252 中恒集团 0.907264 0.072727 0.776786
56 120419 生物医药 600267 海正药业 0.967912 0.048485 0.714286
57 120419 生物医药 600272 开开实业 0.995495 0.000000 0.035714
58 120419 生物医药 600276 恒瑞医药 0.935974 0.751515 0.714286
59 120419 生物医药 600297 美罗药业 0.833323 0.078788 0.714286
60 120419 生物医药 600332 白云山 0.956238 0.309091 0.714286
61 120419 生物医药 600340 华夏幸福 0.881892 0.381818 0.062500
62 120419 生物医药 600381 贤成矿业 0.921978 0.012121 0.107143
63 120419 生物医药 600385 ST金泰 0.765946 0.000000 0.714286
64 120419 生物医药 600422 昆药集团 0.956965 0.060606 0.714286
65 120419 生物医药 600503 华丽家族 0.927900 0.096970 0.062500
66 120419 生物医药 600521 华海药业 0.982925 0.012121 0.714286
67 120419 生物医药 600535 天士力 0.983813 0.521212 0.714286
68 120419 生物医药 600557 康缘药业 0.988432 0.236364 0.714286
69 120419 生物医药 600587 新华医疗 0.967148 0.030303 0.714286
70 120419 生物医药 600594 益佰制药 0.836619 0.230303 0.714286
71 120419 生物医药 600624 复旦复华 0.977262 0.115152 0.017857
72 120419 生物医药 600645 中源协和 0.599070 0.521212 0.750000
73 120419 生物医药 600666 西南药业 0.831056 0.090909 0.714286
74 120419 生物医药 600783 鲁信创投 0.878917 0.236364 0.026786
75 120419 生物医药 600789 鲁抗医药 0.993466 0.115152 0.714286
76 120419 生物医药 600826 兰生股份 0.913197 0.121212 0.035714
77 120419 生物医药 600867 通化东宝 0.822112 0.078788 0.714286
78 120419 生物医药 600873 梅花生物 0.958417 0.103030 0.026786
79 120419 生物医药 600895 张江高科 0.627730 0.296970 0.062500
80 120419 生物医药 601607 上海医药 0.519610 0.442424 0.714286
81 120419 生物医药 603168 莎普爱思 0.994970 0.012121 0.714286
82 rows × 7 columns
#获得该主题的上涨幅度

#获得研究的结束时间,如果在当天收盘前,则为前一个交易日
endDate_dt = CountTime()
endDate_CAL = Date.fromDateTime(endDate_dt)

#前一季度的时间
beginDate_3M_CAL = cal.advanceDate(endDate_CAL,Period('-3M'),BizDayConvention.Following)
beginDate_3M_dt = beginDate_3M_CAL.toDateTime()
#前5个交易日的时间
period_day = 5              ###################输入###################
period_CAL = '-'+str(period_day)+'B'
beginDate_5B_CAL = cal.advanceDate(endDate_CAL, period_CAL, BizDayConvention.Following) 
beginDate_5B_dt = beginDate_5B_CAL.toDateTime()
#获得主题在这一年、一季度、5个交易日内的涨幅

tk_list = thm_tks['ticker'].tolist()    #获得主题关联的证券代码列表
field = ['ticker','secShortName','tradeDate','preClosePrice','closePrice','turnoverValue','marketValue']

#计算主题在最近1年的涨幅
Mkt_Info_df_1Y = GetMktEqud(tk_list=tk_list,field =field)     #获取市场行情,省略了beginDate和endDate,则获取最近1年的行情
Mkt_Info_df_1Y['tradeDate'] = pd.to_datetime(Mkt_Info_df_1Y['tradeDate'])    #将tradeDate这一列的格式由string改为datetime
Mkt_Info_df_1Y['increase'] = Mkt_Info_df_1Y['closePrice']/Mkt_Info_df_1Y['preClosePrice']
(rtn_1Y,tk_rt_df_1Y) = GetReturn(Mkt_Info_df_1Y)

#计算主题在最近3个月的涨幅
Mkt_Info_df_3M = Mkt_Info_df_1Y[Mkt_Info_df_1Y['tradeDate']>beginDate_3M_dt]
(rtn_3M,tk_rt_df_3M) = GetReturn(Mkt_Info_df_3M)

#计算主题在最近5个交易日的涨幅
Mkt_Info_df_5B = Mkt_Info_df_1Y[Mkt_Info_df_1Y['tradeDate']>beginDate_5B_dt]
(rtn_5B,tk_rt_df_5B) = GetReturn(Mkt_Info_df_5B)
def add_nm_rtn(mkt_df):    #将个股名称与收益拼接,方便做展示
    add_info_list = []
    for i in range(len(mkt_df)):
        add_info = mkt_df['secShortName'].iloc[i] + str(round(mkt_df['return'].iloc[i],3))
        add_info_list.append(add_info)
    return add_info_list
#获取主题在最近1年、3个月、5个交易日内的龙头股及其涨幅
df_list = [tk_rt_df_1Y,tk_rt_df_3M,tk_rt_df_5B]
bigstk_dic = {'bigstk_by_rtn':[],'bigstk_by_rnv':[]}
for df_i in df_list:
    df_sort_rtn = df_i.sort(columns='return',ascending=False)[0:3]    #按照收益率对其排序,取前3
    df_sort_tnv = df_i.sort(columns='turnoverValue',ascending=False)[0:3]    #按照成交量对其排序,取前3
    bigstk_rtn_list = add_nm_rtn(df_sort_rtn)
    bigstk_tnv_list = add_nm_rtn(df_sort_tnv)
    bigstk_dic['bigstk_by_rtn'].append(bigstk_rtn_list)
    bigstk_dic['bigstk_by_rnv'].append(bigstk_tnv_list)
bigstk_dic['thm_rtn'] = [round(rtn_1Y,3),round(rtn_3M,3),round(rtn_5B,3)]
bigstk_df = pd.DataFrame(bigstk_dic)  
bigstk_df = bigstk_df.loc[:,['thm_rtn','bigstk_by_rtn','bigstk_by_rnv']]
bigstk_df.index = [u'最近一年',u'最近3个月',u'最近5个交易日']
bigstk_df.columns = [u'主题涨幅',u'龙头股_按涨幅',u'龙头股_按成交量']
print '主题:',thmid2nm_dic[int(theme_id)]
bigstk_df

主题生物医药
主题涨幅 龙头股_按涨幅 龙头股_按成交量
最近一年 0.983 [沃华医药5.498, 莎普爱思4.354, 达安基因3.13] [云南白药0.268, 达安基因3.13, 白云山0.344]
最近3个月 0.518 [沃华医药1.938, 达安基因1.348, 博腾股份1.149] [达安基因1.348, 张江高科0.548, 上海医药0.418]
最近5个交易日 0.091 [江苏阳光0.266, 恒康医疗0.221, 兰生股份0.22] [达安基因0.198, 华夏幸福0.122, 上海医药0.088]
#按照相关度做研究,不同维度得到的最相关的个股,查看其收益率

tks_rtnscore = thm_tks.sort(columns='returnScore',ascending=False)[0:3]['ticker'].tolist()    #根据returnScore排序
tks_textscore = thm_tks.sort(columns='textContributionScore',ascending=False)[0:3]['ticker'].tolist()     #根据textContributionScore排序
tks_indscore = thm_tks.sort(columns='industryScore',ascending=False)[0:3]['ticker'].tolist()     #根据industryScore排序
tks_score_list = [tks_rtnscore,tks_textscore,tks_indscore]
bigstk_score_dic = {}

def noname(df,lt):    #将结果按照传入的list中的ticker顺序排列,而不是默认由市场行情获得的的那个dataframe的顺序,我说清楚了吗
    new_df = pd.DataFrame({})
    for i in lt:
        a = df[df['ticker']==i]
        new_df = pd.concat([new_df,a])
    return new_df
    

for i in range(3):
    tk_score_list = tks_score_list[i]
    #先获得1年、3个月、5个交易日的dataframe    
    sub_mkt_1Y = noname(tk_rt_df_1Y,tk_score_list)
    add_info_1Y = add_nm_rtn(sub_mkt_1Y)
    sub_mkt_3M = noname(tk_rt_df_3M,tk_score_list)
    add_info_3M = add_nm_rtn(sub_mkt_3M)
    sub_mkt_5B = noname(tk_rt_df_5B,tk_score_list)
    add_info_5B = add_nm_rtn(sub_mkt_5B)
    
    if i == 0:
        bigstk_score_dic['rtn_score'] = [add_info_1Y,add_info_3M,add_info_5B]
    if i == 1:
        bigstk_score_dic['text_score'] = [add_info_1Y,add_info_3M,add_info_5B]
    if i == 2:
        bigstk_score_dic['ind_score'] = [add_info_1Y,add_info_3M,add_info_5B]

bigstk_score_dic['thm_rtn'] = [round(rtn_1Y,3),round(rtn_3M,3),round(rtn_5B,3)]    
bigstk_score_df = pd.DataFrame(bigstk_score_dic) 

bigstk_score_df = bigstk_score_df.loc[:,['thm_rtn','text_score','ind_score','rtn_score']]
bigstk_score_df.index = [u'最近一年',u'最近3个月',u'最近5个交易日']
bigstk_score_df.columns = [u'主题涨幅',u'最相关_文本',u'最相关_行业',u'最相关_收益']
bigstk_score_df
主题涨幅 最相关_文本 最相关_行业 最相关_收益
最近一年 0.983 [中关村0.986, 恒瑞医药0.642, 达安基因3.13] [国农科技1.028, 中恒集团0.599, 华邦颖泰1.034] [开开实业0.697, 莎普爱思4.354, 鲁抗医药1.183]
最近3个月 0.518 [中关村0.35, 恒瑞医药0.258, 达安基因1.348] [国农科技0.648, 中恒集团0.224, 华邦颖泰0.902] [开开实业0.241, 莎普爱思0.487, 鲁抗医药0.612]
最近5个交易日 0.091 [中关村0.097, 恒瑞医药0.096, 达安基因0.198] [国农科技0.073, 中恒集团0.028, 华邦颖泰0.148] [开开实业0.086, 莎普爱思0.037, 鲁抗医药0.197]
thm_tks_text = thm_tks.sort(columns='textContributionScore',ascending=False)[0:5]
print '排名按照textContributionScore(文本贡献关联度,主题和证券在新闻文本中的相似度,取值范围[0,1],值越大表示关联度越高)'
thm_tks_text

排名按照textContributionScore(文本贡献关联度主题和证券在新闻文本中的相似度取值范围[01],值越大表示关联度越高)
themeID themeName ticker secShortName returnScore textContributionScore industryScore
9 120419 生物医药 000931 中关村 0.927900 1.000000 0.062500
58 120419 生物医药 600276 恒瑞医药 0.935974 0.751515 0.714286
15 120419 生物医药 002030 达安基因 0.142927 0.545455 0.714286
72 120419 生物医药 600645 中源协和 0.599070 0.521212 0.750000
67 120419 生物医药 600535 天士力 0.983813 0.521212 0.714286
thm_tks_ind = thm_tks.sort(columns='industryScore',ascending=False)[0:5]
print '排名按照industryScore(行业关联度,主题和证券在行业分布上的相似度,取值范围[0,1],值越大表示关联度越高)'
thm_tks_ind

排名按照industryScore(行业关联度主题和证券在行业分布上的相似度取值范围[01],值越大表示关联度越高)
themeID themeName ticker secShortName returnScore textContributionScore industryScore
0 120419 生物医药 000004 国农科技 0.935363 0.000000 0.785714
55 120419 生物医药 600252 中恒集团 0.907264 0.072727 0.776786
11 120419 生物医药 002004 华邦颖泰 0.791938 0.078788 0.750000
72 120419 生物医药 600645 中源协和 0.599070 0.521212 0.750000
13 120419 生物医药 002019 亿帆鑫富 0.982201 0.121212 0.750000
thm_tks_rtn = thm_tks.sort(columns='returnScore',ascending=False)[0:5]
print '排名按照returnScore(收益关联程度,主题和证券在短期收益上的相似度,取值范围[0,1],值越大表示关联度越高)'
thm_tks_rtn

排名按照returnScore(收益关联程度主题和证券在短期收益上的相似度取值范围[01],值越大表示关联度越高)
themeID themeName ticker secShortName returnScore textContributionScore industryScore
57 120419 生物医药 600272 开开实业 0.995495 0.000000 0.035714
81 120419 生物医药 603168 莎普爱思 0.994970 0.012121 0.714286
75 120419 生物医药 600789 鲁抗医药 0.993466 0.115152 0.714286
4 120419 生物医药 000597 东北制药 0.988989 0.103030 0.714286
68 120419 生物医药 600557 康缘药业 0.988432 0.236364 0.714286