楼主: datayes2015
4570 5

[交易策略] 打开量化投资的黑箱-多因子选股篇 [推广有奖]

  • 1关注
  • 40粉丝

硕士生

70%

还不是VIP/贵宾

-

威望
0
论坛币
1955 个
通用积分
5.0336
学术水平
20 点
热心指数
21 点
信用等级
18 点
经验
4383 点
帖子
104
精华
0
在线时间
77 小时
注册时间
2015-6-10
最后登录
2017-7-3

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
突然想做个系列,结合自己的学习路程让更多的量化爱好者有机会接触这条路。
这一篇做的是多因子选股篇,结合具体策略来说,说的不好还请大家多多指正。

前言
选股思路来自于前些日子看的一本书《超级成长股》,全篇就讲了两个因子:市销率跟市研率(市值跟研发费用)。
作为翻版小市值收益曲线还是可以的。
选用的是市销率+净利润增长率+营业收入增长率三个因子,先选出市销率最低的30只股票,然后用净利润增长率+营业收入进行等权打分,选出分最高的前十只股票,在优矿平台上实现。
策略部分
选用的语言是Python,这里导入的是3个包,numpy、pandas是python自带的,CAL是优矿自己集成的库
  1. import numpy as npimport pandas as pdfrom CAL.PyCAL import *
复制代码

每一个策略都要有确定回测的区间、相对的基准、股票池、初始资金、策略执行的频率以及佣金
  1. start = '2014-01-01'end = '2016-01-01'   benchmark = 'HS300'                                 # 基准为HS300指数  universe = DynamicUniverse('HS300')                  # HS300动态股票池capital_base = 100000000refresh_rate = 5   commission = Commission(buycost=0.0003, sellcost=0.0003, unit='perValue')    # 设置手续费
复制代码

导入上交所日历、定义三个因子
  1. # 日期处理cal = Calendar('China.SSE')                               # 导入上海证券交易所交易日历,Cal是优矿自己集成的包# 定义因子名称,市销率、净利润增长率、营业收入增长率factor_name = ['PS','NetProfitGrowRate','OperatingRevenueGrowRate']  
复制代码
  相当于在券商开个户
  1. def initialize(account):                   # 初始化虚拟账户状态    pass
复制代码

策略逻辑部分:

def handle_data(account):                  # 每个交易日的买入卖出指令

设定股票池
  1.   today = account.current_date                                      # 当前交易日  yesterday = cal.advanceDate(today, '-1B')                        # 前一个交易日,B: 工作日,M:月,W:周,Y:年    yesterday_str = yesterday.strftime('%Y%m%d')         # 日期类型转化为字符串     valid_uni = DataAPI.IdxConsGet(ticker=u"399300",intoDate=yesterday_str,field=['consID'],pandas="1")['consID'].tolist()         # 前一交易日HS300(399300)成分股列表    valid_uni = [s for s in account.universe if s in valid_uni]  
复制代码
提取市销率因子 ,这里调取了优矿的因子数据
  1.     Factor_PS = DataAPI.MktStockFactorsOneDayGet(tradeDate=yesterday_str,secID=valid_uni,field=['secID','PS'],pandas="1")    Factor_PS.set_index('secID',inplace=True)
复制代码
按市销率,选市销率最小的30只股票
  1.     sec_list = Factor_PS.sort('PS')[0:30].index.tolist()      
复制代码
提取市销率最小30只股票的净利润增长率和营业收入增长率数据
  1.     Factor = DataAPI.MktStockFactorsOneDayGet(tradeDate=yesterday_str,secID=sec_list,field=['secID','NetProfitGrowRate','OperatingRevenueGrowRate'],pandas="1")    Factor.set_index('secID',inplace=True)   
复制代码
  1. #净利润增长率NetProfitGrowRate Factor_NetProfitGrowRate = Factor['NetProfitGrowRate'].dropna().to_dict()    #dropna()跟to_dict() 是python pandas中的两个函数,在这里的意思是把值为空的剔除掉    signal_NetProfitGrowRate = standardize(winsorize(Factor_NetProfitGrowRate))  # 因子处理:去极值、标准化,去掉极大极小值,让因子之间可加减
复制代码

    # 营业收入增长率OperatingRevenueGrowRate,处理方法同上
  1.     Factor_OperatingRevenueGrowRate = Factor['OperatingRevenueGrowRate'].dropna().to_dict()    signal_OperatingRevenueGrowRate = standardize(winsorize(Factor_OperatingRevenueGrowRate))
复制代码
  1.     # 按净利润增长率和营业收入增长率等权打分    Total_Score = pd.DataFrame(index=Factor.index, columns=['NetProfitGrowRate','OperatingRevenueGrowRate'], data=0)    Total_Score['NetProfitGrowRate'][signal_NetProfitGrowRate.keys()] = signal_NetProfitGrowRate.values()    Total_Score['OperatingRevenueGrowRate'][signal_OperatingRevenueGrowRate.keys()] = signal_OperatingRevenueGrowRate.values()    Total_Score['total_score'] = np.dot(Total_Score, np.array([0.5, 0.5]))  # 综合两个因子的大小,等权求和评分
复制代码

买入列表   
    buylist = Total_Score.sort('total_score').tail(10).index.tolist()       # 选出评分最高的10只股票
  1.     buylist = {s: 0 for s in buylist}
复制代码
买入判断
    for s in account.valid_secpos.keys():
  1.         if s not in buylist:            order_to(s, 0)    each_buymoney= account.reference_portfolio_value / len(buylist)   #将投资组合的价值平分为len(buylist)份,等份买    for s in buylist:        if s in account.security_position:   #如果待买入股票已经持有,则不进行买入,否者就需要计算买入的头寸并下单            continue        amount= each_buymoney / account.reference_price[s] # account.reference_price 意思是获取可买入证券前一日收盘价        order(s, amount)
复制代码
回测曲线:
基本面多因子选股.png
基本面因子选股2.png
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:多因子选股 量化投资 多因子 standardize Commission 营业收入 爱好者 增长率 超级成长 收益

已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 44 + 44 精彩帖子

总评分: 经验 + 44  论坛币 + 44   查看全部评分

本帖被以下文库推荐

沙发
zhouguobin 在职认证  发表于 2016-11-18 15:07:12 |只看作者 |坛友微信交流群
这是推广么

使用道具

藤椅
tushenhao 发表于 2016-11-26 17:10:51 |只看作者 |坛友微信交流群
典型的幸存者偏差错误

使用道具

板凳
datayes2015 发表于 2016-11-28 11:01:22 |只看作者 |坛友微信交流群
tushenhao 发表于 2016-11-26 17:10
典型的幸存者偏差错误
用了动态股票池加每天选,应该还好吧

使用道具

报纸
seanlee91 发表于 2017-5-16 16:16:29 |只看作者 |坛友微信交流群
感谢楼主分享

使用道具

地板
17771024762 发表于 2018-7-2 15:43:30 |只看作者 |坛友微信交流群
谢谢楼主

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-21 00:19