板块异动类

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

本代码主要实现以下功能

  • DataAPI.EquIndustryGet获得每只个股的所属行业,这里采用的是申万二级分类;
  • 根据个股行业获得所有行业的成分股
  • 根据成分股的每天涨幅和市值,获得主题的加权涨幅,将其排序,即得到每日涨跌幅最大的行业前十
  • 根据成分股出现的涨跌停次数,获得涨跌停比例最大的行业前十
  • 根据成分股的换手率,获得换手率最大和最小的行业前十
  • 将每个行业所包含的个股,储存到csv文件中,如果对某个行业感兴趣,可以进一步查看其成分股

此处定义了一些函数,使得代码功能更明确

defGetIndInfo(universe,field):#获得行业数据    num =100    count_num = len(universe)/numif count_num>0:        indus_df = pd.DataFrame({})for iin range(count_num):            sub_ind = DataAPI.EquIndustryGet(secID=universe[i*num:(i+1)*num],field=field)            indus_df = pd.concat([indus_df,sub_ind])        sub_ind = DataAPI.EquIndustryGet(secID=universe[(i+1)*num:],field=field)        indus_df = pd.concat([indus_df,sub_ind])else:        indus_df = DataAPI.EquIndustryGet(secID=universe,field=field)    filed_new = ['secID']+field    indus_df = indus_df[filed_new]return indus_dfdefGetMktInfo(secID,beginDate,endDate,field):#获得市场行情数据    num =50    count_num = len(secID)/numif count_num>0:        MktInfo_df = pd.DataFrame({})for iin range(count_num):            sub_info = DataAPI.MktEqudGet(secID=secID[i*num:(i+1)*num],beginDate=beginDate,endDate=endDate,field=field)            MktInfo_df = pd.concat([MktInfo_df,sub_info])        sub_info = DataAPI.MktEqudGet(secID=secID[(i+1)*num:],beginDate=beginDate,endDate=endDate,field=field)        MktInfo_df = pd.concat([MktInfo_df,sub_info])else:        MktInfo_df = DataAPI.MktEqudGet(secID=secID,beginDate=beginDate,endDate=endDate,field=field)return MktInfo_dfdefCountTime():    today = datetime.today()    cal_date = Date.fromDateTime(today)if cal.isBizDay(cal_date):#如果是交易日,则判断当天是不是在15点前        today_str = today.strftime("%Y%m%d")        time1=" 15:05:00"        ben_time = datetime.strptime(today_str+time1,"%Y%m%d %H:%M:%S")if today>ben_time:            date = today_strelse:#如果当天不是交易日,则获得前一个交易日        cal_wd = cal.adjustDate(cal_date,BizDayConvention.Preceding)#Date格式        dtime_wd = cal_wd.toDateTime()#datetime格式        date = dtime_wd.strftime("%Y%m%d")return date

获得个股的行情数据,并以此来计算主题的:涨幅、涨跌停比例、换手率

from datetimeimport timedeltacal = Calendar('China.SSE')universe = set_universe('A')indus_df = GetIndInfo(universe=universe,field =['secShortName','industryName2'])cnt_date = CountTime()#获得可用的时期field_mkt = ['preClosePrice','openPrice','highestPrice','lowestPrice','closePrice','turnoverRate','marketValue']MktInfo_df = GetMktInfo(secID=universe,beginDate=cnt_date,endDate=cnt_date,field=field_mkt)ind_inc_dic = {}#记录行业的涨幅ind_gb_dic = {}#记录行业的涨跌停数目ind_turn_dic = {}#记录行业的换手率ind_tknm_dic = {}#记录行业包含的个股grouped = indus_df.groupby('industryName2')for name,groupin grouped:    ind_tknm_dic[name] = list(group['secShortName'])    stk_list = list(group['secID'])    sub_mkt_info = MktInfo_df[MktInfo_df.secID.isin(stk_list)]#计算行业涨跌幅    sub_mkt_info['inc_rate'] = (sub_mkt_info['closePrice']-sub_mkt_info['preClosePrice'])/sub_mkt_info['preClosePrice']#获得每个个股的涨跌幅    ind_inc = (sub_mkt_info['inc_rate']*sub_mkt_info['marketValue']).sum()/sub_mkt_info['marketValue'].sum()#获得行业的涨跌幅,利用市值加权平均值计算    ind_inc_dic[name] = ind_inc    num_good = len(sub_mkt_info[((sub_mkt_info['closePrice']-sub_mkt_info['preClosePrice'])/sub_mkt_info['preClosePrice']).round(2)==0.1])#涨停的个股    num_bad  = len(sub_mkt_info[((sub_mkt_info['preClosePrice']-sub_mkt_info['closePrice'])/sub_mkt_info['preClosePrice']).round(2)==0.1])#跌停的个股    ind_gb_dic[name] = (num_good-num_bad)*1.0/len(group)    turnover = sub_mkt_info['turnoverRate'].mean()#计算行业的平均换手率    ind_turn_dic[name] = turnover

以下是将结果进行展示

ind_turn_pd = pd.DataFrame.from_dict(ind_turn_dic,orient='index')ind_turn_pd.rename(columns={0:u'换手率'},inplace=True)ind_turn_pd = ind_turn_pd.sort(columns=u'换手率',ascending=False)ind_turn_pd1 = ind_turn_pd.sort(columns=u'换手率',ascending=True)print cnt_date+'换手率最大的行业前十:'ind_turn_pd[0:10]20150130换手率最大的行业前十:
换手率
视听器材0.046510
基础建设0.042633
房屋建设0.036725
计算机应用0.036130
环保工程及服务0.035021
营销传播0.034763
畜禽养殖0.034093
电力0.033552
农业综合0.032450
装修装饰0.032230
print cnt_date+'换手率最小的行业前十:'ind_turn_pd1[0:10]20150130换手率最小的行业前十:
换手率
石油开采0.000900
银行0.008894
机场0.009800
航空运输0.010020
饲料0.010518
高速公路0.010583
汽车整车0.011491
煤炭开采0.011964
其他交运设备0.012071
餐饮0.012150
ind_gb_pd = pd.DataFrame.from_dict(ind_gb_dic,orient='index')ind_gb_pd.rename(columns={0:u'涨跌停比例'},inplace=True)ind_gb_pd = ind_gb_pd.sort(columns=u'涨跌停比例',ascending=False)ind_gb_pd1 = ind_gb_pd.sort(columns=u'涨跌停比例',ascending=True)print cnt_date+'涨停比例最大的行业前十:'ind_gb_pd[0:10]20150130涨停比例最大的行业前十:
涨跌停比例
视听器材0.200000
贸易0.086957
物流0.055556
专业工程0.055556
互联网传媒0.045455
塑料0.045455
房地产开发0.029630
电力0.017241
家用轻工0.000000
保险0.000000
print cnt_date+'跌停比例最大的行业前十:'ind_gb_pd1[0:10]20150130跌停比例最大的行业前十:
涨跌停比例
旅游综合-0.066667
计算机设备-0.051282
电子制造-0.032258
光学光电子-0.024390
中药-0.017857
化学制品-0.006993
专用设备0.000000
航运0.000000
农业综合0.000000
采掘服务0.000000
ind_inc_pd = pd.DataFrame.from_dict(ind_inc_dic,orient='index')ind_inc_pd = ind_inc_pd.sort(columns=0,ascending=False)ind_inc_pd.rename(columns={0:u'涨跌幅'},inplace=True)ind_inc_pd1 = ind_inc_pd.sort(columns=u'涨跌幅')print cnt_date+'涨幅最大的行业前十:'ind_inc_pd[0:10]
涨跌幅
视听器材0.036822
燃气0.018286
种植业0.015623
房地产开发0.006603
农业综合0.005786
水务0.005265
餐饮0.004425
动物保健0.004262
饮料制造0.003649
汽车服务0.003630
print cnt_date+'跌幅最大的行业前十:'ind_inc_pd1[:10]20150130跌幅最大的行业前十:
涨跌幅
运输设备-0.071812
基础建设-0.049886
多元金融-0.041817
铁路运输-0.040228
保险-0.036876
房屋建设-0.035251
计算机应用-0.032599
石油开采-0.028381
林业-0.028153
航空运输-0.025830

将行业包含的个股信息储存到csv文件中,可以进行更细致的查看行业信息

ind_tk_pd = pd.DataFrame({})for ind_nm,tk_listin ind_tknm_dic.items():    sub_pd = pd.DataFrame(tk_list)    sub_pd[u'行业名称'] = ind_nm    ind_tk_pd = pd.concat([ind_tk_pd,sub_pd])ind_tk_pd.rename(columns={0:u'成分股'},inplace=True)ind_tk_pd = ind_tk_pd.loc[:,[u'行业名称',u'成分股']]ind_tk_pd.to_csv('ind_tk.csv',encoding='GBK',index=False)

results matching ""

    No results matching ""