python量化策略—— alpha 三因子策略(1)

简单多因子选股——小市值

大概思路就是按照:所有股票池中,按如下条件筛选,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.改进的美林时钟策略(三)

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李、不姓李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值