简单多因子选股——小市值
大概思路就是按照:所有股票池中,按如下条件筛选,pe<20 , pb<2 ,ps<5 , total_mv<1000000。然后选择排名靠前的10只,方法下面会说到。完了等权重分配。
具体如下:
1.数据,可来源tushare pro 的免费数据库(需注册+改资料)
网址:https://tushare.pro/register?reg=385920
2.所需要的库
import math
import tushare as ts #1中安装的
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import talib #注意看自己的电脑是32/64位的,然后选择对应的,在talib官网下载。
3.在tushare pro 里读取数据
#画图坐标是中文显示
matplotlib.rcParams['axes.unicode_minus']=False
plt.rcParams['font.sans-serif']=['SimHei']
#在数据库注册后会有token码,填到下方
ts.set_token('f3e0。。。。')
#调用数据
pro = ts.pro_api()
#调取2018年11月1日的所有股市的信息,信息内容为:股票代码 ts_code, 交易日 trade_date, 总市值total_mv,ps,pe,pb。
df1= pro.query('daily_basic', ts_code='', trade_date='20181101',fields='ts_code,trade_date,total_mv,ps,pe,pb')
4.设置筛选条件
#条件
df1=df1[ df1['pe']<20 ]
df1=df1[ df1['pb']<2 ]
df1=df1[ df1['ps']<5 ]
df1=df1[ df1['total_mv']<1000000 ]
5.在筛选的股票中,寻找10只潜力股票,当然选20只也可以。
#排序选股
df1=df1.sort_values(by="pe" , ascending=True)#由低到高排序
df1=df1.head(50)#按由低到高排,选前50名
df1=df1.sort_values(by="ps" , ascending=True)
df1=df1.head(30)
df1=df1.sort_values(by="pb" , ascending=True)
df1=df1.head(10)
df1=df1['ts_code']#获得一篮子股票
df1.values.tolist()#转换成列表
stock=','.join(df1) #转换成浮点,用逗号隔开
这里输出结果(10我们所需要的股票代码):
'000980.SZ,000926.SZ,000587.SZ,000900.SZ,600308.SH,300118.SZ,600708.SH,601666.SH,600978.SH,600743.SH'
6.计算等权重的一篮子股票的组合收益
cum=0#累计收益初始化0
for i in df1:
df=pro.query('daily', ts_code=i, start_date='20181101', end_date='20190410',fields='') #分别将一篮子股票代码带入
df=df.sort_index() #建立索引
df.index=pd.to_datetime(df.trade_date,format='%Y-%m-%d')#设置日期索引
ret=df.change/df.close#计算单支股票收益率
#下面需将得到的收益ret序列变成按日期由低到高排列
dd=pd.Series(1,index=df.close.index)
cumqq=ret*dd.shift(1).dropna()#三个部分 缺一不可。
cum=(np.cumprod(1+ret[cumqq.index[0:]])-1)/len(df1)+cum#等权重配置一篮子股票,计算权重和
plt.plot(cum,label="组合",color='r')
7.计算沪深300的收益曲线(比较基准)
df12 = pro.index_daily( ts_code='000300.SH', start_date='20181101', end_date='20190410')
df12=df12.sort_index()
df12.index=pd.to_datetime(df12.trade_date,format='%Y-%m-%d')#设置日期索引
ret12=df12.change/df12.close
#将顺序颠倒
aq=pd.Series(1,index=df12.close.index)
SmaRet=ret12*aq.shift(1).dropna()
cum12=np.cumprod(1+ret12[SmaRet.index[0:]])-1
plt.plot(cum12,label="沪深300",color='b')
8.计算收益,并绘制图
plt.plot(cum,label="组合",color='r')
plt.plot(cum12,label="沪深300",color='b')
plt.title("小市值三因子选股策略收益率")
plt.legend()
f=cum[-2]*250/len(close)
f1=100*f#换成百分制
print("年化收益率:{:.2f}%,总收益{:.2f}%".format(f1,f1*len(df.close)/250))#一年250个交易日
结果:
年化收益率:18.41%,总收益7.88%
9.最后完整代码
# coding=utf-8
import math
import tushare as ts
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import talib
matplotlib.rcParams['axes.unicode_minus']=False
plt.rcParams['font.sans-serif']=['SimHei']
ts.set_token('f3e00ef.。。。。7')#这里是token码 获取地址 https://tushare.pro/register?reg=385920(需注册)
pro = ts.pro_api()
df1= pro.query('daily_basic', ts_code='', trade_date='20181101',fields='ts_code,trade_date,total_mv,ps,pe,pb')#获取数据
#条件
df1=df1[ df1['pe']<20 ]
df1=df1[ df1['pb']<2 ]
df1=df1[ df1['ps']<5 ]
df1=df1[ df1['total_mv']<1000000 ]
#排序选股
df1=df1.sort_values(by="pe" , ascending=True)
df1=df1.head(50)#按由低到高排,选前100名
df1=df1.sort_values(by="ps" , ascending=True)
df1=df1.head(30)
df1=df1.sort_values(by="pb" , ascending=True)
df1=df1.head(10)
df1=df1['ts_code']#获得一篮子股票
df1.values.tolist()#转换成列表
stock=','.join(df1) #转换成浮点,用逗号隔开
cum=0
for i in df1:
df=pro.query('daily', ts_code=i, start_date='20181101', end_date='20190410',fields='')
df=df.sort_index()
df.index=pd.to_datetime(df.trade_date,format='%Y-%m-%d')#设置日期索引
ret=df.change/df.close
dd=pd.Series(1,index=df.close.index)
cumqq=ret*dd.shift(1).dropna()
cum=(np.cumprod(1+ret[cumqq.index[0:]])-1)/len(df1)+cum#等权重配置一篮子股票
df12 = pro.index_daily( ts_code='000300.SH', start_date='20181101', end_date='20190410')
df12=df12.sort_index()
df12.index=pd.to_datetime(df12.trade_date,format='%Y-%m-%d')#设置日期索引
ret12=df12.change/df12.close
#将顺序颠倒
aq=pd.Series(1,index=df12.close.index)
SmaRet=ret12*aq.shift(1).dropna()
cum12=np.cumprod(1+ret12[SmaRet.index[0:]])-1
plt.plot(cum,label="组合",color='r')
plt.plot(cum12,label="沪深300",color='b')
plt.title("小市值三因子选股策略收益率")
plt.legend()
f=cum[-2]*250/len(close)
f1=100*f#换成百分制
print("年化收益率:{:.2f}%,总收益{:.2f}%".format(f1,f1*len(close)/250))
10.结果分析,此策略在小市值里面选择整体不错,策略期大概4-6个月,是不错的收益。
下面的时10个月的收益图,不理想,因为他的潜力逐渐走向平衡。
下面看看3个月效果图,虽然盈利只有1.88% 但是可以说也是一直跑赢大盘。。。下一博客会用对冲方法实现稳定盈利。克服此缺点。 图图
总结:此策略中短期效果不错,长期不稳定。 若配股指期货对冲 或者其他对冲工具,还是值得期待的
1.python量化——alpha股票-指数期货对冲策略
2.多因子选股策略
3.海龟交易策略
4.移动平均策略——单/双均线策略
5.改进的美林时钟策略(一)
5.改进的美林时钟策略(二)
6.改进的美林时钟策略(三)