板块异动类

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

本代码主要实现以下功能

  • DataAPI.EquIndustryGet获得每只个股的所属行业,这里采用的是申万二级分类;
  • 根据个股行业获得所有行业的成分股
  • 根据成分股的每天涨幅和市值,获得主题的加权涨幅,将其排序,即得到每日涨跌幅最大的行业前十
  • 根据成分股出现的涨跌停次数,获得涨跌停比例最大的行业前十
  • 根据成分股的换手率,获得换手率最大和最小的行业前十
  • 将每个行业所包含的个股,储存到csv文件中,如果对某个行业感兴趣,可以进一步查看其成分股 此处定义了一些函数,使得代码功能更明确
  1. def GetIndInfo(universe,field): #获得行业数据
  2. num = 100
  3. count_num = len(universe)/num
  4. if count_num>0:
  5. indus_df = pd.DataFrame({})
  6. for i in range(count_num):
  7. sub_ind = DataAPI.EquIndustryGet(secID=universe[i*num:(i+1)*num],field=field)
  8. indus_df = pd.concat([indus_df,sub_ind])
  9. sub_ind = DataAPI.EquIndustryGet(secID=universe[(i+1)*num:],field=field)
  10. indus_df = pd.concat([indus_df,sub_ind])
  11. else:
  12. indus_df = DataAPI.EquIndustryGet(secID=universe,field=field)
  13. filed_new = ['secID']+field
  14. indus_df = indus_df[filed_new]
  15. return indus_df
  16. def GetMktInfo(secID,beginDate,endDate,field): #获得市场行情数据
  17. num = 50
  18. count_num = len(secID)/num
  19. if count_num>0:
  20. MktInfo_df = pd.DataFrame({})
  21. for i in range(count_num):
  22. sub_info = DataAPI.MktEqudGet(secID=secID[i*num:(i+1)*num],beginDate=beginDate,endDate=endDate,field=field)
  23. MktInfo_df = pd.concat([MktInfo_df,sub_info])
  24. sub_info = DataAPI.MktEqudGet(secID=secID[(i+1)*num:],beginDate=beginDate,endDate=endDate,field=field)
  25. MktInfo_df = pd.concat([MktInfo_df,sub_info])
  26. else:
  27. MktInfo_df = DataAPI.MktEqudGet(secID=secID,beginDate=beginDate,endDate=endDate,field=field)
  28. return MktInfo_df
  29. def CountTime():
  30. today = datetime.today()
  31. cal_date = Date.fromDateTime(today)
  32. if cal.isBizDay(cal_date): #如果是交易日,则判断当天是不是在15点前
  33. today_str = today.strftime("%Y%m%d")
  34. time1=" 15:05:00"
  35. ben_time = datetime.strptime(today_str+time1,"%Y%m%d %H:%M:%S")
  36. if today>ben_time:
  37. date = today_str
  38. else: #如果当天不是交易日,则获得前一个交易日
  39. cal_wd = cal.adjustDate(cal_date,BizDayConvention.Preceding) #Date格式
  40. dtime_wd = cal_wd.toDateTime() #datetime格式
  41. date = dtime_wd.strftime("%Y%m%d")
  42. return date

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

  1. from datetime import timedelta
  2. cal = Calendar('China.SSE')
  3. universe = set_universe('A')
  4. indus_df = GetIndInfo(universe=universe,field =['secShortName','industryName2'])
  5. cnt_date = CountTime() #获得可用的时期
  6. field_mkt = ['preClosePrice','openPrice','highestPrice','lowestPrice','closePrice','turnoverRate','marketValue']
  7. MktInfo_df = GetMktInfo(secID=universe,beginDate=cnt_date,endDate=cnt_date,field=field_mkt)
  8. ind_inc_dic = {} #记录行业的涨幅
  9. ind_gb_dic = {} #记录行业的涨跌停数目
  10. ind_turn_dic = {} #记录行业的换手率
  11. ind_tknm_dic = {} #记录行业包含的个股
  12. grouped = indus_df.groupby('industryName2')
  13. for name,group in grouped:
  14. ind_tknm_dic[name] = list(group['secShortName'])
  15. stk_list = list(group['secID'])
  16. sub_mkt_info = MktInfo_df[MktInfo_df.secID.isin(stk_list)]
  17. #计算行业涨跌幅
  18. sub_mkt_info['inc_rate'] = (sub_mkt_info['closePrice']-sub_mkt_info['preClosePrice'])/sub_mkt_info['preClosePrice'] #获得每个个股的涨跌幅
  19. ind_inc = (sub_mkt_info['inc_rate']*sub_mkt_info['marketValue']).sum()/sub_mkt_info['marketValue'].sum() #获得行业的涨跌幅,利用市值加权平均值计算
  20. ind_inc_dic[name] = ind_inc
  21. num_good = len(sub_mkt_info[((sub_mkt_info['closePrice']-sub_mkt_info['preClosePrice'])/sub_mkt_info['preClosePrice']).round(2)==0.1]) #涨停的个股
  22. num_bad = len(sub_mkt_info[((sub_mkt_info['preClosePrice']-sub_mkt_info['closePrice'])/sub_mkt_info['preClosePrice']).round(2)==0.1]) #跌停的个股
  23. ind_gb_dic[name] = (num_good-num_bad)*1.0/len(group)
  24. turnover = sub_mkt_info['turnoverRate'].mean() #计算行业的平均换手率
  25. ind_turn_dic[name] = turnover

以下是将结果进行展示

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

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

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