请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3365825 新帖:32

申万行业轮动策略

爱德华发表于:5 月 10 日 06:11回复(1)

鉴于一些小伙伴在询问平台上行业指数的行情数据的问题,这里就用申万一级行业的数据做了内容,进行行业指数获取的方法示例给大家做参考。
目前平台暂无提供直接的API获取行业数据,以下的内容都是调用了聚源数据库进行的操作,具体数据源可以参考这个链接

在开始之前先用研究展示下一些数据统计、行业涨跌幅统计操作,如下内容即是回顾下上周的市场情况
5月底创出3041低点后,市场开始回升,上周接连走出三连阳后,周四高开低走收阴,周五一根阴线将一周的回升全部拉回去且逼近3041低点,感慨我大A股上升的道路总是*悠长,下跌的时候猝不及防。下面的图是获取市场周五的行情数据,其中可以看到以上证50、中证500,中证1000代表的大中小市值全线下跌,板块方面唯次新股收阳、从数据来看这也符合5日收益次新最高,还有值得注意的是各指数均是价跌量涨,这不是筑底的特征。

下面两张图,就是对上周和上上周申万行业涨跌幅进行的统计,可以看到非周期性行业,食品饮料、家用电器连续两周走势还行
1.png
Unknown-3.png
这篇帖子里面的这个策略,就是基于申万行业涨跌幅进行的定期轮换策略
策略思路:
选股:统计申万一级行业指数,固定时间选取涨幅最大的指数,选取指数成分股中流通市值最大的5只股票作为操作标的
择时:轮动模型,固定调仓周期开盘操作,默认开盘卖出不在股票池中股票,买入选出的股票
仓位:平均分配仓位
行业.jpeg

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom jqdata import jypd.set_option('precision', 3)import datetimeimport jqdatafrom jqdata import *
#统计各指数当天涨跌#输入日期#返回dfdef get_pct(date):#指数涨跌幅统计#总数据zhishu_list = ['000001.XSHG','000300.XSHG','000016.XSHG','000905.XSHG','000852.XSHG','399006.XSHE','399678.XSHE','399005.XSHE'] pl = get_price(zhishu_list,end_date=date,count=6)#.ix[:,0,:]#涨跌幅数据pl_pct = (pl.iloc[:,-1,:]/pl.iloc[:,-2,:]-1)*100pl_pct_5 = (pl.iloc[:,-1,:]/pl.iloc[:,-6,:]-1)*100#5日money均量df_money = pl.loc['money',:,:]def f(x):return x.mean()se_money = df_money.apply(f)#5日volume均量df_volume = pl.loc['volume',:,:]def f(x):return x.mean()se_volume = df_volume.apply(f)#最新一天指数值数据zv = pl.iloc[:,-1,:]zv['name'] = ['上证','沪深300','上证50','中证500','中证1000','创业板','次新股','中小板']df_fin = pd.concat([zv['close'],pl_pct['close'],pl_pct_5['close'],pl_pct['volume'],zv['volume']/(10**8),se_volume/(10**8),pl_pct['money'],zv['money']/(10**8),se_money/(10**8)],axis=1)df_fin.index = zv['name'].valuesdf_fin.columns = ['指数值','涨跌幅%','5日涨跌幅%','成交量%','成交量(亿)','5日成交均量(亿)','成交额%','成交额(亿)','5日成交均额(亿)']return df_fina = get_pct('2018-6-10')a

指数值涨跌幅%5日涨跌幅%成交量%成交量(亿)5日成交均量(亿)成交额%成交额(亿)5日成交均额(亿)
上证3067.15-1.36-0.265.40134.69124.31-3.591611.791628.77
沪深3003779.62-1.340.243.8483.3478.31-4.051078.191116.12
上证502652.08-1.600.1810.7226.0322.54-7.19343.96342.39
中证5005669.30-1.20-0.2811.7152.9349.418.65587.67568.66
中证10006205.96-1.10-0.604.9772.2170.351.00725.64737.36
创业板1711.52-1.090.12-0.6112.2912.68-0.18186.79198.03
次新股1053.960.023.03-11.666.166.08-11.99210.47209.45
中小板7035.08-1.010.486.0116.1816.852.11248.20270.62
a[['涨跌幅%','5日涨跌幅%']].plot(kind='bar',figsize=(12,8))
<matplotlib.axes._subplots.AxesSubplot at 0x7fe9e70f6d10>
#统计各指数当天涨跌#输入日期#返回dfdef get_hy_pct(date_s,date):#指数涨跌幅统计#总数据sw_hy = jqdata.get_industries(name='sw_l1')sw_hy_dict  = {}for i in sw_hy.index:value = get_SW_index(i,start_date=date_s,end_date=date)sw_hy_dict[i] = valuepl_hy = pd.Panel(sw_hy_dict)pl = pl_hy.transpose(2,1,0)pl = pl.loc[['PrevClosePrice','OpenPrice','HighPrice','LowPrice','ClosePrice','TurnoverVolume','TurnoverValue'],:,:]#涨跌幅数据pl_pct = (pl.iloc[:,-1,:]/pl.iloc[:,-2,:]-1)*100pl_pct_5 = (pl.iloc[:,-1,:]/pl.iloc[:,-6,:]-1)*100#5日money均量df_money = pl.loc['TurnoverValue',:,:]def f(x):return x.mean()se_money = df_money.apply(f)#5日volume均量df_volume = pl.loc['TurnoverVolume',:,:]def f(x):return x.mean()se_volume = df_volume.apply(f)#最新一天指数值数据zv = pl.iloc[:,-1,:]zv['name'] = sw_hy['name']df_fin = pd.concat([zv['ClosePrice'],pl_pct['ClosePrice'],pl_pct_5['ClosePrice'],pl_pct['TurnoverVolume'],zv['TurnoverVolume']/(10**8),se_volume/(10**8),pl_pct['TurnoverValue'],zv['TurnoverValue']/(10**8),se_money/(10**8)],axis=1)df_fin.columns = ['指数值','涨跌幅%','5日涨跌幅%','成交量%','成交量(亿)','5日成交均量(亿)','成交额%','成交额(亿)','5日成交均额(亿)']df_fin['name'] = sw_hy['name']df_fin['code'] = df_fin.indexdf_fin.index = df_fin['name'].valuesdel df_fin['name'] 
    return df_fin.sort('涨跌幅%',ascending=0)#获取N天前的交易日日期def ShiftTradingDay(date,shift):# 获取所有的交易日,返回一个包含所有交易日的 list,元素值为 datetime.date 类型.tradingday = jqdata.get_all_trade_days()# 得到date之后shift天那一天在列表中的行标号 返回一个数shiftday_index = list(tradingday).index(date)+shift# 根据行号返回该日日期 为datetime.date类型return tradingday[shiftday_index]  #获取N天前的交易日日期def ShiftTradingDay(date,shift=5):# 获取所有的交易日,返回一个包含所有交易日的 list,元素值为 datetime.date 类型.tradingday = get_all_trade_days()# 得到date之后shift天那一天在列表中的行标号 返回一个数shiftday_index = list(tradingday).index(date)+shift# 根据行号返回该日日期 为datetime.date类型return tradingday[shiftday_index]  #行业涨跌幅#直接用申万的行业指数数据进行说明了def get_SW_index(SW_index = 801010,start_date = '2017-01-31',end_date = '2018-01-31'):index_list = ['PrevClosePrice','OpenPrice','HighPrice','LowPrice','ClosePrice','TurnoverVolume','TurnoverValue','TurnoverDeals','ChangePCT','UpdateTime']jydf = jy.run_query(query(jy.SecuMain).filter(jy.SecuMain.SecuCode==str(SW_index)))link=jydf[jydf.SecuCode==str(SW_index)]rows=jydf[jydf.SecuCode==str(SW_index)].index.tolist()result=link['InnerCode'][rows]df = jy.run_query(query(jy.QT_SYWGIndexQuote).filter(jy.QT_SYWGIndexQuote.InnerCode==str(result[0]),\                                                   jy.QT_SYWGIndexQuote.TradingDay>=start_date,\                                                         jy.QT_SYWGIndexQuote.TradingDay<=end_date))df.index = df['TradingDay']df = df[index_list]return df#输入截止日期,获取往前推固定天数的行业涨跌幅date = datetime.date(2018,6,8)s_date = ShiftTradingDay(date,-5)hy_df = get_hy_pct(s_date,date)hy_df

指数值涨跌幅%5日涨跌幅%成交量%成交量(亿)5日成交均量(亿)成交额%成交额(亿)5日成交均额(亿)code
家用电器I7.15e+030.09852.98236.746.0521.4110106.08801110
电子I3.01e+03-0.3852.6514.822.521.3011.8310294.28801080
汽车I4.58e+03-0.4420.3831.229.579.79-2.24142145.41801880
医药生物I8.99e+03-0.5641.530.03531517.01-0.905329382.37801150
休闲服务I6.22e+03-0.649-0.5376.331.541.49-4.1428.228.11801210
食品饮料I1.25e+04-0.682.38-12.26.768.84-7.97181228.02801120
通信I2.42e+03-0.7240.1879.548.437.278.01127110.95801770
计算机I4.3e+03-0.7510.88412.815.415.109.58262262.03801750
电气设备I4.37e+03-1-3.5-0.5271111.44-6.87111121.55801730
机械设备I1.23e+03-1.07-0.84413.415.414.087.66170163.26801890
建筑材料I5.39e+03-1.140.5680.9534.934.81-2.1264.464.01801710
建筑装饰I2.5e+03-1.19-1.3223.17.726.7617.162.857.98801720
交通运输I2.74e+03-1.211.013.229.989.86-17.8107119.61801170
化工I3e+03-1.250.913-0.96220.720.44-9.02286292.88801030
公用事业I2.31e+03-1.31-1.6512.69.88.755.3481.478.62801160
轻工制造I2.73e+03-1.42-1.01-2.496.276.30-9.466879.55801140
综合I2.14e+03-1.44-0.86436.73.913.0622.625.120.06801230
传媒I794-1.48-1.83-0.85713.212.30-0.542127123.75801760
农林牧渔I2.7e+03-1.57-2.042.99.748.95-0.477108101.41801010
钢铁I2.77e+03-1.611.72-27.29.288.45-27.150.945.36801040
银行I3.36e+03-1.79-1.4516.715.812.5412.712195.66801780
采掘I2.88e+03-1.84-0.74911.68.318.160.83957.458.24801020
商业贸易I4.2e+03-1.86-3.05-3.417.417.66-16.288.593.10801200
有色金属I3.54e+03-1.91-0.7213.7216.815.71-2.59190187.35801050
纺织服装I2.52e+03-1.95-2.96-3.783.624.43-19.735.250.62801130
非银金融I1.69e+03-1.99-0.297-10.410.49.16-20.1142138.36801790
房地产I4.37e+03-2.050.531-0.58711.511.39-14.9102110.13801180
国防军工I1.07e+03-2.17-1.5830.64.433.8715.95149.01801740
hy_df_sort = hy_df.sort('5日涨跌幅%',ascending=0)hy_df_sort[['涨跌幅%','5日涨跌幅%']].plot(kind='bar',figsize=(12,8))
<matplotlib.axes._subplots.AxesSubplot at 0x7fe9e72c0310>
#输入截止日期,获取往前推固定天数的行业涨跌幅date = datetime.date(2018,6,1)s_date = ShiftTradingDay(date,-5)hy_df_1 = get_hy_pct(s_date,date)hy_df1_sort = hy_df_1.sort('5日涨跌幅%',ascending=0)hy_df1_sort[['涨跌幅%','5日涨跌幅%']].plot(kind='bar',figsize=(12,8))
<matplotlib.axes._subplots.AxesSubplot at 0x7fe9e701b4d0>

全部回复

0/140

达人推荐

量化课程

    移动端课程