精华内容
下载资源
问答
  • 多因子选股模型的建立过程主要分为候选因子的选取、选股因子有效性的检验、有效但冗余因子的剔除、综合评分模型的建立和模型的评价及持续改进等5个步骤。
  • 数据分析--单因子选股策略、多因子选股策略(选股) 一、单因子选股策略--小市值策略 二、多因子选股策略--市值+ROE(净资产收益率)选股策略 一、单因子选股策略--小市值策略 因子选股策略 ...

     一、单因子选股策略--小市值策略

    二、多因子选股策略--市值+ROE(净资产收益率)选股策略


    一、单因子选股策略--小市值策略

    因子选股策略 

    因子:选择股票的某种标准

      增长率、市值、市盈率、ROE(净资产收益率)............

    选股策略:

      对于某个因子,选取表现最好(因子最大或最小)的N支股票持仓

      每隔一段时间调仓一次,如果一段时间没有涨可以卖了换

    小市值策略:选取股票池中市值最小的N只股票持仓

     

    例如:选择20支市值最小的股票持有,一个月调一次仓:

    from jqdata import *
    
    def initialize(context):
        set_benchmark('000300.XSHG')
        set_option('use_real_price', True)
        set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
        
        g.security = get_index_stocks('000300.XSHG')
        
        # 选市值作为因子,要从表valuation中market_cap字段获取sqlachmy的query对象
        g.q = query(valuation).filter(valuation.code.in_(g.security))
        g.N = 20      #20支市值最小的股票
        # 假设因子选股策略是每30天执行一次
        #方式一:
        # g.days = -1
        # def handle_data(context,data):
        #     g.days += 1
        #     if g.days % 30 == 0:
        #         pass
        #方式二:
        # 定时执行函数,每个月第1个交易日执行handle函数
        run_monthly(handle, 1)
    def handle(context):
        df = get_fundamentals(g.q)[['code','market_cap']]
        df = df.sort_values('market_cap').iloc[:g.N,:]  #选出20支
        print(df)
        
        to_hold = df['code'].values
        
        for stock in context.portfolio.positions:
            if stock not in to_hold:
                order_target(stock, 0)
        to_buy = [stock for stock in to_hold if stock not in context.portfolio.positions]
        if len(to_buy) > 0:
            cash_per_stock = context.portfolio.available_cash / len(to_buy)
            for stock in to_buy:
                order_value(stock, cash_per_stock)
    小市值策略代码

     

    二、多因子选股策略--市值+ROE(净资产收益率)选股策略 

    多因子选股策略

    如何同时综合多个因子来选股?

    评分模型:

      每个股票针对每个因子进行评分,将评分相加

      选出总评分最大的N只股票持仓

      如何计算股票在某个因子下的评分:归一化(标准化),下面是两种标准化的方式

    比如选择两个因子:市值和ROE(净资产收益率)作为选股评价标准

     

    from jqdata import *
    
    def initialize(context):
        set_benchmark('000300.XSHG')
        set_option('use_real_price', True)
        set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
        
        g.security = get_index_stocks('000300.XSHG')
        
        # 选市值作为因子,要从表valuation中market_cap字段获取sqlachmy的query对象
        g.q = query(valuation, indicator).filter(valuation.code.in_(g.security))
        g.N = 20      #20支股票
    
        run_monthly(handle, 1)
    def handle(context):
        df = get_fundamentals(g.q)[['code','market_cap','roe']]
        df['market_cap'] = (df['market_cap']-df['market_cap'].min())/(df['market_cap'].max()-df['market_cap'].min())
        df['roe'] = (df['roe']-df['roe'].min())/(df['roe'].max()-df['roe'].min())
        
        # 双因子评分:市盈率越大越好,市值越小越好
        df['score'] = df['roe'] - df['market_cap']
        # 对评分排序,选最大的20支股票
        df = df.sort_values('score').iloc[-g.N:,:]
        to_hold = df['code'].values
        
        for stock in context.portfolio.positions:
            if stock not in to_hold:
                order_target(stock, 0)
        to_buy = [stock for stock in to_hold if stock not in context.portfolio.positions]
        if len(to_buy) > 0:
            cash_per_stock = context.portfolio.available_cash / len(to_buy)
            for stock in to_buy:
                order_value(stock, cash_per_stock)
    市值+ROE选股策略

     

     

    posted on 2019-05-31 17:22 要一直走下去 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/staff/p/10956443.html

    展开全文
  • 多因子选股模型的建立过程主要分为候选因子的选取、选股因子有效性的检验、有效但冗余因子的剔除、综合评分模型的建立和模型的评价及持续改进等5个步骤。
  • 机器学习量化多因子选股策略

    千次阅读 2019-07-25 14:25:23
    因子回归是多因子选股策略最常用的方法,它用过去的股票的收益率对因子进行回归,得到一个回归方程,然后把当下的因子数值代入回归方程得到未来股票的预期收益,最后以此为依据进行选股。 机器学习和多因子选股...

    一、前言

    多因子选股策略是一种应用十分广泛的选股策略,其基本思构想就是找到某些和收益率最相关的指标,找出股票收益率与各种指标之间的“关系”,借此“关系”建立股票组合,并期望该组合可以跑赢指数。

    多因子回归是多因子选股策略最常用的方法,它用过去的股票的收益率对多因子进行回归,得到一个回归方程,然后把当下的因子数值代入回归方程得到未来股票的预期收益,最后以此为依据进行选股。

    机器学习和多因子选股策略的结合,从实践的角度来看,机器学习所做的工作是在现有因子的数据集上建立模型,对股票收益率进行拟合,然后对模型进行评估和优化。

    用机器学习做模型预测有一套基本流程:数据获取、数据预处理、模型训练、模型评估和模型预测。接下来本文沿着这套流程用python中的机器学习库sklearn完成一个简单的多因子回归的选股模型。

     

    二、获取数据

    机器学习所需数据主要有两个来源:网络爬虫和专业数据库,这里我们使用的数据为A股股票的历史数据,因此数据来源取自wind数据库。

    原始数据包含了所有A股股票——以2018/06/30当日的股票为准,时间段选取1998/04/30至2018/06/30,每个月度每只股票取数十个不同的指标,以月末最后一日的数据作为截面数据保存。

    由于数据过于冗杂,我们先对数据进行结构化降维,使用csv格式进行存储,每个月度的截面数据保存在一个csv文件中,文件名有序排列。每个csv文件中包含了该月份最后一日所有股票的部分基本信息、下一个月的收益率、和数十个指标因子的值。

     

    三、数据预处理

    首先是特征提取,特征提取这一步主要基于人的经验,对于指导股票投资的模型,则选取作出投资决策中经常考虑的一些数据指标。这里,我们选取以下几类指标进行考量:

    估值指标:营业收入、净利润、净资产等

    成长指标:营收同比增速、净利润同比增速等

    财务指标:毛利率、资产周转率、经营性现金流等

    杠杆指标:流动比率、现金比率等

    流动性指标:N日日均换手率等

    其他绝对指标:市值、股价、股东数、beta 等

    情绪指标:wind评级、wind一直目标价等

    技术指标:MACD、RSI、动量反转……

    特征因子的选取对于模型的拟合结果和预测准确度有很大影响,因此特征因子要精挑细选。以上指标都是市场中各类投资者经常考虑的指标的总结,有效性有待商议,现在先从wind中提取出这些指标。

    接下来是数据清洗,数据清洗需要做的是缺失值填充、数据标准化、数据降维等等。

    由于从wind中所取得的指标有限,而且原始数据因为未上市、停牌、涨跌停等多种原因产生了很多空值、不可使用的数据,这部分因子的数值需要进行缺失值填充;部分指标属于绝对值类指标,不同公司间差异性较大,类似营业收入、净利润、现金流等因子,换做与其市值的比值后横向可比性更强;其他有些数据也因为各种原因存在着去极值、标准化和降维等需要。

    下表为自1998年4月起的第244个月的csv文件部分截图,文件的列结构如下:

    第1列:当前文件所属月份

    第2列:wind股票代码

    第3列:交易状态,1为正常交易,0为ST/停牌/次新股

    第4列:下一个月超额收益率(相对于沪深300)

    5列后已完成数据预处理的特征因子70个

     

    四、模型训练

     1 、模块导入

    该模型依赖的模块主要有:numpy,pandas和sklearn。

    其中numpy是Python做数据处理常用的扩充程序库,主要用于支持高维数组与矩阵运算,同时针对数组运算提供大量的数学函数库;而pandas是基于numpy的高效数据模型库,由于为面板数据分析和时间序列分析提供了很好的支持,因此常备用作金融数据分析的基础工具包。

    sklearn全称是scikit-learn,是谷歌开发的一个机器学习框架,是python重要的机器学习库。sklearn支持包括分类、回归、降维和聚类四大机器学习算法,还包含了特征提取、数据处理和模型评估三大模块。sklearn建立在NumPy和matplotlib库的基础上,利用这几大模块的优势,大大提高机器学习的效率,是机器学习领域最知名的python模块之一。

    sklearn支持的机器学习方式:

    1.Classification 监督学习-分类(预测未来变化方向)

    2.Regression 监督学习-回归(预测未来变化幅度)

    3.Clustering 非监督学习-聚类(选取相近的样本)

    4.Dimensionality reduction 非监督学习-降维(选取有代表性的因子)

    5.Model Selection 模型选择(选择更好的模型)

    6.Preprocessing 数据预处理(如何选择特征,做预处理)

     2 、参数设置

    模型中所有参数都在这一部分进行定义,其中包含样本内数据集、样本外数据集、正反数据比例、验证集比例、随机数种子点、置信度、特征因子序列等等。具体参数如下:

    1.month_in_sample = range(1,141+1)    # 样本内数据月份范围

    2.month_test = range(142,243+1)        # 样本外数据月份范围

    3.percent_select = [0.2,0.2]            # 正例和反例数据的比例

    4.percent_cv = 0.1                       # 验证集比例

    5.seed = 45                             # 随机数种子点

    6.logi_C = 0.0005                        # 置信度

    7.n_stock = 3625                         # 现今股票数

    8.n_stock_select = 10                   # 选出股票数

    9.parameters = ('EP':'bias')   # 模型所使用的特征因子

    这里的参数后期都可以根据不同需要进行调整,以获得更有效的模型。

     3 、数据处理

    对于数据,使用经典的内外划分方式,将整体数据集244个月的A股月数据分为两部分:

    样本内数据,通过设定month_in_sample参数的值,选取1998年4月~2009年12月的数据,用于模型训练

    样本外数据,通过设定month_test参数的值,选取2010年1月~2018年6月的数据,用于模型预测

    对于样本内的数据,先进行数据的进一步清洗和整理,循环读取每一期的csv表:

    1.根据parameters参数,从csv文件中读取相关因子数据,并保存在临时表

    2.删除单元格有空值的股票

    3.加入标签项,根据次月超额收益对个股打标签

    4.根据percent_select的参数留下收益最高和最低的部分股票

    5.将收益最好的股票打标签1,收益最差的股票打标签0

    最终,得到的数据集data_in_sample为处理好的样本内数据集,可以用来进行模型训练,该数据集的部分截图展示如下。

    4 、模型训练

    模型训练前,先将样本内数据集再一次进行拆分,拆分为训练集和验证集,验证集的比例根据percent_cv参数确定,集合的拆分由train_test_split完成,因此具有随机性。

    根据拆分出的训练集,对模型进行训练,模型训练使用sklearn中的函数model.fit。这里可用的模型很多,包括线性回归模型、支持向量机模型、SGD模型等等。这里以线性回归模型为例,在置信度为logi_C的水平下进行线性回归,经过机器学习得到拟合后的model

    五、模型评估

    用此model对样本内数据集的训练集和验证集进行预测,sklearn中有专门的函数predict和decision_function对模型进行预测。

    这样可以得到预测的涨跌标签值以及涨跌的概率,通过将预测数据和真实数据进行比较,metrics中有专门的函数accuracy_score可以进行矩阵直接的比较,最终得到两矩阵的相似性,可以理解为模型预测的准确率。

    因此,若参数按上文中进行设置,可以得到的模型训练集的预测准确率为59%,验证集的预测准确度为58%,系统输出结果如下:

    training set: accuracy = 0.59

    cv set: accuracy = 0.58

    六、策略构建

    使用该model构建多因子选股策略:对于所有A股股票,以月度为频率,取parameters中定义的特征因子进行拟合,给出预测涨跌的概率,对预测涨跌概率进行排序,选取前n_stock_select个股票构建等权组合,进行买入。

    七、策略预测

    有了通过对训练集机器学习后确定的model,就可以对样本外的数据进行回测。在回测之前同样需要对样本外数据进行清洗和整理,然后按月循环带入model,给出每个月每只个股的涨跌预测以及涨跌概率的预测,并根据策略构建投资组合进行轮动。

    回测部分需要有以下输出内容:

    1.将预测涨跌概率的矩阵输出到PredResult.csv,

    2.将股票组合的月收益率序列记录到return_test表,该表的部分展示如下图,

    3.计算出投资组合在样本外预测月份的净值序列,输出到Value.csv。

    八、策略评价

    根据回测中得到的组合月度超额收益率return_test表,以及组合净值Value.csv,可以计算出该策略的超额年化收益波动率信息比率。本策略中,按上文设定的参数给出的投资组合各项指标,输出如下:

    annualized excess return = 0.28

    annualized excess volatility = 0.19

    information ratio = 1.44

    该策略组合的平均超额年化收益率为28%,平均年化收益波动率为0.19,信息比率IR为1.44,每承担1单位波动风险获得1.44的超额收益。

    最后,绘制出回测时间段内,2010年1月~2018年6月,该选股策略下的投资组合净值曲线,输出如:

    九、其他改进

     1 、因子原因

    特征因子的选择对于限行回归模型的有效性有着较大影响,本文的实例中将70个不同层面的特征因子一起放入了sklearn的线性模型中进行拟合,后续可以考虑有选择性的对模型进行带入,或许会有更好的拟合效果。

    例如,在原模型的基础上,去掉技术指标类的特征因子,只保留基本面的特征因子,模型的预测能力和回测评价输出如下:

    training set: accuracy = 0.57

    cv set: accuracy = 0.57

    annualized excess return = 0.25

    annualized excess volatility = 0.17

    information ratio = 1.46

    反之,若只使用技术指标类的特征因子,完全不考虑基本面的指标,模型的预测能力和回测评价输出如下:

    training set: accuracy = 0.58

    cv set: accuracy = 0.57

    annualized excess return = 0.10

    annualized excess volatility = 0.29

    information ratio = 0.33

     2 、变量调参

    可以根据model拟合后的预测准确率指标进行适当的参数调整,将下述输出指标进行优化。

    trainingset: accuracy = 0.59

    cv set: accuracy = 0.58

    例如,将percent_select参数调整为[0.3,0.3],即选择前30%的股票作为正例,后30%的股票作为反例,对模型进行训练,模型的预测能力和回测评价输出如下:

    training set: accuracy = 0.57

    cv set: accuracy = 0.57

    annualized excess return = 0.27

    annualized excess volatility = 0.20

    information ratio = 1.33

    或者,将n_stock_select参数调整为50,即每一期使用model进行预测时选取前50只股票买入,模型的预测能力不会改变,但是回测评价输出如下:

    annualized excess return = 0.24

    annualized excess volatility = 0.18

    information ratio = 1.34

    再或者,将logi_C参数调整为0.005,即对拟合的置信度进行放宽,对模型进行训练,模型的预测能力和回测评价输出如下:

    training set: accuracy = 0.59

    cv set: accuracy = 0.57

    annualized excess return = 0.29

    annualized excess volatility = 0.21

    information ratio = 1.41

     3 、模型改进

    线性回归模型虽然简单、对特征因子选取的依赖性较强,但也是可解释性、可控性较强的模型。除此之外,我们也可以引入其他模型,sklearn中包含了很多机器学习模块可供使用:

    1.逻辑回归(可解释性更强,训练速度更快):

    fromsklearn.linear_model import LogisticRegression

    2.随机森林模型:from sklearn import tree

    3.支持向量机模型(高维非线性拟合,训练速度慢):

    fromsklearn.svm import SVC

    4.K近邻算法:from sklearn import neighbors

    5.多层神经网络(高频海量数据的机器学习,小题大做):

    fromsklearn.neural_network import MLPClassifier

    另一方面,模型的训练和检验方式,也有多种选择,除了交叉验证外,还有滚动训练回测、检验曲线等等。都可以作为后期模型改进可以尝试的方向。

    来源:西藏信托

    拓展阅读:

    1.一个量化策略师的自白(好文强烈推荐)

    2.学习Python量化有哪些书籍?这里有一份书单送给你

    3.学了那么多技术指标为什么还不赚钱?从量化角度告诉你

    4.最科学的仓位管理利器-凯利公式,从方法上胜过99%散户

    5.网格交易法,一个不容易亏钱的投资策略(附源码)

    展开全文
  • 多因子选股之有效因子

    千次阅读 2019-05-08 12:20:03
    多因子选股之有效因子 什么是多因子选股? 玩股票的朋友的朋友应该很清楚,股市之道无外乎:选股、择时、仓控。精通任何一点都可以说在股市中所向披靡。 这次,我们从选股入手,来谈谈量化选股的基本“套路”——...

    原 多因子选股之有效因子

    什么是多因子选股?

    玩股票的朋友的朋友应该很清楚,股市之道无外乎:选股、择时、仓控。精通任何一点都可以说在股市中所向披靡。

    这次,我们从选股入手,来谈谈量化选股的基本“套路”——多因子选股。多因子选股采用一系列的因子(主要考虑使用价值、成长、质量以及市场等四大类因子)作为选股标准,将多个具有逻辑背景的因子策略相结合,选取在各个因子上综合得分较高的股票构建投资组合。通过这种方式选出来的股票通常不会在某个因子上有特别的短板,能够综合很多信息最后得出一个选股结果。同时,因为在不同的市场情况下,总有一些因子会发挥作用,因此多因子模型的表现相对来说也比较稳定。

    比如高考,高校要从高中学生中录取学业优秀的学生进入大学,需要考察学生的综合成绩,对语文、数学、外语、物理、地理、化学等各门成绩进行测评,只有综合成绩高的学生,才能最终进入高校。这里,每门功课都相当于一个候选因子,每一个因子的情况——分数都十分透明,可以帮助高校非常清晰地看清学生的实力。

    各种多因子模型核心的区别第一是在因子的选取上,第二是在如何用多因子综合得到一个最终的判断。

    一般而言,多因子选股模型有两种判断方法,一是打分法,二是回归法。

    打分法就是根据各个因子的大小对股票进行打分,然后按照一定的权重加权得到一个总分,根据总分再对股票进行筛选。回归法就是用过去的股票的收益率对多因子进行回归,得到一个回归方程,然后再把最新的因子值代入回归方程得到一个对未来股票收益的预判,然后再以此为依据进行选股。

    多因子选股模型的建立过程主要分为候选因子的选取、选股因子有效性的检验、有效但冗余因子的剔除、综合评分模型的建立和模型的评价及持续改进等5个步骤。

    候选因子的选取:

    因子类型可以概括为9类:规模因子,估值因子,成长因子,盈利因子,动量反转因子,交投因子,波动率因子,分析师预测因子。

    1、规模类因子:总市值,流通市值,自由流通市值
    2、估值类因子:市盈率(TTM),市净率,市销率,市现率,企业价值倍数

    3、成长类因子:营业收入同比增长率、营业利润同比增长率,归属于母公司的近利润同比增长率、经营活动产生的现金流金额同比增长率
    4、盈利类因子:净资产收益率ROE、总资产报酬率ROA、销售毛利率、销售净利率

    5、动量反转因子:前一个月涨跌幅,前2个月涨跌幅、前3个月涨跌幅、前6个月涨跌幅
    6、交投因子:前一个月日均换手率
    7、波动因子:前一个月的波动率,前一个月的振幅
    8、股东因子:户均持股比例、、户均持股比例变化、机构持股比例变化

    9、分析师因子:预测当年净利润增长率、主营业务收入增长率、最近一个月预测净利润上调幅度、最近一个月越策主营业务收入上调幅度,最近一个月上调评级占比

    我们在掘金平台提供的因子中,选取了以下六个典型因子:

    0_1533176254142_360截图20180802101635551.jpg

    因子有效性的检验:

    一般检验方法主要采用排序的方法检验候选因子的选股有效性。
    具体而言,对于任意一个候选因子,在模型形成期的第一个月初开始计算市场中每只正常交易股票的该因子的大小, 按从小到大的顺序对样本股票进行排序,并平均分为n个组合,一直持有到月末,在下月初再按同样的方法重新构建n个组合并持有到月末,每月如此,一直重复到模型形成期末。

    我们在掘金平台上进行因子有效性检验:
    测试参数:
    回测时间周期:2017-01-01--2018-01-01
    基准指数:IT指数(SZSE.399239)
    股票池:IT指数(SZSE.399239)成分股
    滑点:0
    手续费:0

    基本思想:我们需要采取循环测试,每月按照因子的值升序排序,然后选取某一区间(共十个均分区间)的股票作为标的,全仓等权重买入,每月换仓,统计最终结果。

    过程:
    1、因子有效性测试系统建立在参数优化系统上,循环回测,每次输入不同的区间参数,从而影响每月选取股票的范围。
    2、每月调仓,获取因子并排序(注意去除空值)。
    3、清仓,选取股票,重新买入。
    4、重复第2与第3步,直至测试周期结束。
    5、输入新的区间参数,重复2-4步,直至全部参数输入完毕。

    测试结果(绝对收益):

    0_1533176483217_B1.png

    0_1533176495105_B2.png

    0_1533176520670_B3.png

    0_1533176538288_B4.png

    0_1533176556451_B5.png

    0_1533176582861_B6.png

    总结:

    由上面几幅图可以看出,PB、ROEANNUAL、TAGRT都具有很强的有效性,因子的值从低到高排序,股票组合的超额收益率也是从低到高排列。

    我们再看另外三个因子,PELFYNPAAEI、NEGOTIABLEMV、EVEBITDA。因子的大小与股票组合的超额收益相关性并不明显。
    从而我们得到了PB、ROEANNUAL、TAGRT等因子具有一定有效性。

    后续:
    因子的有效性也会跟随市场的变化而变化,如之前的小市值因子。我们所做的因子的有效性仅仅是作为参考,在大多数情况是有效的,而市场的魅力就是在于它的不确定性。
    最后分享一张因子有效性的图。

    0_1533176645545_B7.jpg

    多因子选股源码:https://www.myquant.cn/community/topic/690

    作者:经纬量化 宋瑞迪    来源:掘金量化社区

    -------------------------------------------------------------------------

    相关拓展阅读:


    《算法导论 第三版英文版》_高清中文版

    《深度学习入门:基于Python的理论与实现》_高清中文版

    《深入浅出数据分析》_高清中文版

    《Python编程:从入门到实践》_高清中文版

    《Python科学计算》_高清中文版

    《深度学习入门:基于Python的理论与实现》_高清中文版

    《深入浅出数据分析》_高清中文版

    《Python编程:从入门到实践》_高清中文版


    展开全文
  • 基于因子情境的机器学习多因子选股模型.pdf
  • 多因子选股模型之因子分析与筛选Ⅰ:估值与财务成长类指标
  • 多因子选股模型

    万次阅读 多人点赞 2018-12-31 16:19:15
    多因子选股模型¶ 基于《【研究】量化选股-因子检验和因子模型的构建》https://zhuanlan.zhihu.com/quantstory/20634542 在源码的基础上添加了一些因子,同时将时间滞后。 1.时间选取11-17年作为样本期,并进行...

    转载自:https://www.joinquant.com/post/15833?tag=algorithm

    多因子选股模型

    基于《【研究】量化选股-因子检验和多因子模型的构建》https://zhuanlan.zhihu.com/quantstory/20634542

    在源码的基础上添加了一些因子,同时将时间滞后。

    1.时间选取11-17年作为样本期,并进行因子筛选及检验。

    2.基准选取上证综指(000001.XSHG)

    模型构建及因子选取

    拟选取以下四个方面的因子:

    1. 价值类因子:市盈率(PE),市净率(PB),市销率(PS),基本每股收益(EPS),账面市值比(B/M)
    2. 成长类因子:净资产收益率(ROE),总资产净利率(ROA),销售毛利率(gross_profit_margin),净利润同比增长率(inc_net_profit_year_on_year),净利润环比增长率(inc_net_profit_annual),营业利润同比增长率(inc_operation_profit_year_on_year),营业利润环比增长率(inc_operation_profit_annual),主营毛利率(GP/R)、净利率(P/R)
    3. 规模类因子:净利润(net_profit),营业收入(operating_revenue),总股本(capitalization),流通股本(circulating_cap),总市值(market_cap),流通市值(circulating_market_cap),资产负债(L/A)、固定资产比例(FAP)
    4. 交投类因子:换手率(turnover_ratio)

    采用排序法对因子的有效性进行验证。

    In [1]:

    import pandas as pd
    from pandas import Series, DataFrame
    import numpy as np
    import statsmodels.api as sm
    import scipy.stats as scs
    import matplotlib.pyplot as plt
    

    月初取出所有因子数值,例如2018-01-01

    In [2]:

    factors = ['PE', 'PB', 'PS', 'EPS', 'B/M',
               'ROE', 'ROA', 'gross_profit_margin', 'inc_net_profit_year_on_year', 'inc_net_profit_annual', 
                         'inc_operation_profit_year_on_year', 'inc_operation_profit_annual', 'GP/R', 'P/R',
               'net_profit', 'operating_revenue', 'capitalization', 'circulating_cap', 'market_cap', 'circulating_market_cap',
                         'L/A', 'FAP',
               'turnover_ratio']
    
    # 月初取出因子值
    def get_factors(fdate, factors):
        stock_set = get_index_stocks('000001.XSHG', fdate)
        q = query(
            valuation.code,
            balance.total_owner_equities/valuation.market_cap/100000000,
            valuation.pe_ratio,
            valuation.pb_ratio,
            valuation.ps_ratio,
            income.basic_eps,
            indicator.roe,
            indicator.roa,
            indicator.gross_profit_margin,
            indicator.inc_net_profit_year_on_year,
            indicator.inc_net_profit_annual,
            indicator.inc_operation_profit_year_on_year,
            indicator.inc_operation_profit_annual,
            income.total_profit/income.operating_revenue,
            income.net_profit/income.operating_revenue,
            income.net_profit,
            income.operating_revenue,
            valuation.capitalization,
            valuation.circulating_cap,
            valuation.market_cap,
            valuation.circulating_market_cap,
            balance.total_liability/balance.total_assets,
            balance.fixed_assets/balance.total_assets,
            valuation.turnover_ratio
            ).filter(
            valuation.code.in_(stock_set),
            valuation.circulating_market_cap
        )
        fdf = get_fundamentals(q, date=fdate)
        fdf.index = fdf['code']
        fdf.columns = ['code'] + factors
        return fdf.iloc[:,-23:]
    
    fdf = get_factors('2018-01-01', factors)
    fdf.head().T
    

    Out[2]:

    code600000.XSHG600004.XSHG600006.XSHG600007.XSHG600008.XSHG
    PE1.143846e+004.827871e-016.119287e-013.655787e-016.300832e-01
    PB6.804400e+002.009680e+011.093361e+022.808410e+013.863470e+01
    PS9.538000e-012.144100e+001.787800e+002.736200e+003.135900e+00
    EPS2.244700e+004.643700e+006.311000e-016.594300e+002.607200e+00
    B/M4.800000e-011.900000e-01-9.700000e-031.800000e-013.390000e-02
    ROE3.413200e+002.754000e+00-2.960000e-012.928800e+001.513400e+00
    ROA2.316000e-011.990600e+00-7.116000e-011.580100e+004.027000e-01
    gross_profit_marginNaN3.798770e+011.084940e+015.062150e+013.024400e+01
    inc_net_profit_year_on_year-1.588900e+008.844300e+00-6.544932e+026.390600e+002.954560e+01
    inc_net_profit_annual-7.200000e-034.770500e+00-2.012624e+033.357990e+01-3.995000e-01
    inc_operation_profit_year_on_year-1.833300e+001.868020e+01-6.605708e+02-4.675000e-011.377109e+02
    inc_operation_profit_annual2.019000e+002.919000e+00-1.447837e+032.506970e+01-2.233990e+01
    GP/R4.344424e-013.085870e-01-4.038174e-023.296453e-011.174919e-01
    P/R3.350075e-012.308729e-01-3.273438e-022.473615e-018.858635e-02
    net_profit1.387400e+103.935985e+08-1.587791e+081.823589e+081.900669e+08
    operating_revenue4.141400e+101.704828e+094.850528e+097.372163e+082.145555e+09
    capitalization2.935208e+062.069320e+052.000000e+051.007282e+054.820614e+05
    circulating_cap2.810376e+062.069320e+052.000000e+051.007282e+054.820614e+05
    market_cap3.695427e+033.041901e+021.170000e+021.726482e+022.477796e+02
    circulating_market_cap3.538264e+033.041901e+021.170000e+021.726482e+022.477796e+02
    L/A9.302917e-012.719476e-016.862103e-014.571281e-016.699646e-01
    FAP4.168150e-033.381332e-011.754063e-011.815366e-011.011792e-01
    turnover_ratio5.820000e-024.095000e-015.574000e-017.120000e-023.734000e-01

    对每个因子大小排序(以流通市值为例)

    In [3]:

    score = fdf['circulating_market_cap'].order()
    score.head()
    

    Out[3]:

    code
    603580.XSHG    5.0777
    603991.XSHG    5.2659
    603330.XSHG    5.3535
    603041.XSHG    5.6300
    603269.XSHG    5.7038
    Name: circulating_market_cap, dtype: float64

    股票个数

    In [4]:

    len(score)
    

    Out[4]:

    1352

    按照流通市值将股票池进行五等分

    In [5]:

    startdate = '2018-01-01'
    enddate = '2018-02-01'
    nextdate = '2018-03-01'
    df = {}
    circulating_market_cap = fdf['circulating_market_cap']
    port1 = list(score.index)[: len(score)/5]
    port2 = list(score.index)[ len(score)/5: 2*len(score)/5]
    port3 = list(score.index)[ 2*len(score)/5: -2*len(score)/5]
    port4 = list(score.index)[ -2*len(score)/5: -len(score)/5]
    port5 = list(score.index)[ -len(score)/5: ]
    

    按流通市值加权计算组合月收益(例如2018-01,2018-02月收益)

    In [6]:

    def calculate_port_monthly_return(port, startdate, enddate, nextdate, circulating_market_cap):
        
        close1 = get_price(port, startdate, enddate, 'daily', ['close'])
        close2 = get_price(port, enddate, nextdate, 'daily', ['close'])
        weighted_m_return = ((close2['close'].ix[0,:]/close1['close'].ix[0,:]-1)*
                             circulating_market_cap).sum()/(circulating_market_cap.ix[port].sum())
        return weighted_m_return
    calculate_port_monthly_return(port1, '2018-01-01', '2018-02-01', '2018-03-01', fdf['circulating_market_cap'])
    

    Out[6]:

    -0.09004705495088357

    计算基准月收益

    In [7]:

    def calculate_benchmark_monthly_return(startdate, enddate, nextdate):
        
        close1 = get_price(['000001.XSHG'],startdate,enddate,'daily',['close'])['close']
        close2 = get_price(['000001.XSHG'],enddate, nextdate, 'daily',['close'])['close']
        benchmark_return = (close2.ix[0,:]/close1.ix[0,:]-1).sum()
        return benchmark_return
    calculate_benchmark_monthly_return('2018-01-01','2018-02-01','2018-03-01')
    

    Out[7]:

    0.029462448444448563

    观察5个组合在2018年初一个月内的收益情况

    从结果可以看出,在构建因子组合之前,前四组的收益跑输大盘。

    In [8]:

    benchmark_return = calculate_benchmark_monthly_return('2018-01-01', '2018-02-01', '2018-03-01')
    df['port1'] = calculate_port_monthly_return(port1,'2018-01-01', '2018-02-01', '2018-03-01', fdf['circulating_market_cap'])
    df['port2'] = calculate_port_monthly_return(port2,'2018-01-01', '2018-02-01', '2018-03-01', fdf['circulating_market_cap'])
    df['port3'] = calculate_port_monthly_return(port3,'2018-01-01', '2018-02-01', '2018-03-01', fdf['circulating_market_cap'])
    df['port4'] = calculate_port_monthly_return(port4,'2018-01-01', '2018-02-01', '2018-03-01', fdf['circulating_market_cap'])
    df['port5'] = calculate_port_monthly_return(port5,'2018-01-01', '2018-02-01', '2018-03-01', fdf['circulating_market_cap'])
    print Series(df)
    print 'benchmark_return %s'%benchmark_return
    
    port1   -0.090047
    port2   -0.088405
    port3   -0.075064
    port4   -0.060624
    port5    0.068629
    dtype: float64
    benchmark_return 0.0294624484444
    

    构建因子组合,计算不同组合月收益率

    时间:2011-2017年,计算1-5组以及benchmark组合的月收益率,形成84×6的面板数据。

    In [9]:

    factors = ['PE', 'PB', 'PS', 'EPS', 'B/M',
               'ROE', 'ROA', 'gross_profit_margin', 'inc_net_profit_year_on_year', 'inc_net_profit_annual', 
                         'inc_operation_profit_year_on_year', 'inc_operation_profit_annual', 'GP/R', 'P/R',
               'net_profit', 'operating_revenue', 'capitalization', 'circulating_cap', 'market_cap', 'circulating_market_cap',
                         'L/A', 'FAP',
               'turnover_ratio']
    #因为研究模块取fundamental数据默认date为研究日期的前一天。所以要自备时间序列。按月取
    year = ['2011','2012','2013','2014','2015','2016','2017']
    month = ['01','02','03','04','05','06','07','08','09','10','11','12']
    result = {}
    
    for i in range(7*12):
        startdate = year[i/12] + '-' + month[i%12] + '-01'
        try:
            enddate = year[(i+1)/12] + '-' + month[(i+1)%12] + '-01'
        except IndexError:
            enddate = '2018-01-01'
        try:
            nextdate = year[(i+2)/12] + '-' + month[(i+2)%12] + '-01'
        except IndexError:
            if enddate == '2018-01-01':
                nextdate = '2018-02-01'
            else:
                nextdate = '2018-01-01'
        # print 'time %s'%startdate
        fdf = get_factors(startdate,factors)
        CMV = fdf['circulating_market_cap']
        #5个组合,23个因子
        df = DataFrame(np.zeros(6*23).reshape(6,23),index = ['port1','port2','port3','port4','port5','benchmark'],columns = factors)
        for fac in factors:
            score = fdf[fac].order()
            port1 = list(score.index)[: len(score)/5]
            port2 = list(score.index)[ len(score)/5+1: 2*len(score)/5]
            port3 = list(score.index)[ 2*len(score)/5+1: -2*len(score)/5]
            port4 = list(score.index)[ -2*len(score)/5+1: -len(score)/5]
            port5 = list(score.index)[ -len(score)/5+1: ]
            df.ix['port1',fac] = calculate_port_monthly_return(port1,startdate,enddate,nextdate,circulating_market_cap)
            df.ix['port2',fac] = calculate_port_monthly_return(port2,startdate,enddate,nextdate,circulating_market_cap)
            df.ix['port3',fac] = calculate_port_monthly_return(port3,startdate,enddate,nextdate,circulating_market_cap)
            df.ix['port4',fac] = calculate_port_monthly_return(port4,startdate,enddate,nextdate,circulating_market_cap)
            df.ix['port5',fac] = calculate_port_monthly_return(port5,startdate,enddate,nextdate,circulating_market_cap)
            df.ix['benchmark',fac] = calculate_benchmark_monthly_return(startdate,enddate,nextdate)
        # print 'factor %s'%fac
        result[i+1]=df
    monthly_return = pd.Panel(result)
    

    取某个因子的5个组合月收益情况(例如市盈率PE)

    In [11]:

    monthly_return[:,:,'PE']
    

    Out[11]:

     12345678910...75767778798081828384
    port1-0.0639610.057468-0.0035380.011939-0.0007670.0280050.048595-0.003958-0.1095660.062509...0.021345-0.006460-0.0011980.0497910.0093380.0493690.0580720.069637-0.0331600.056772
    port2-0.0650090.076102-0.027128-0.018031-0.0669940.0311460.028017-0.046184-0.1200760.034576...0.037914-0.048666-0.0533620.0728870.0403650.0368330.0694510.003253-0.0223270.018349
    port3-0.0569320.079801-0.017569-0.027592-0.0731960.034040-0.025730-0.054367-0.1290130.045660...0.017931-0.045419-0.0530200.0549200.0280660.0189090.0274870.002008-0.0471840.006735
    port4-0.0212930.046165-0.005278-0.011301-0.0695440.019637-0.019397-0.080514-0.1076110.081045...0.004030-0.021088-0.0054800.0573720.0656310.025304-0.0050430.0596990.0169780.023916
    port50.0137600.0249530.0504580.006419-0.0548360.007156-0.035373-0.041296-0.0524940.068615...0.011837-0.0219790.0486630.0214660.0749650.014275-0.003084-0.0033510.0038360.009916
    benchmark-0.0188200.0428590.016612-0.011870-0.0643260.005755-0.020142-0.054642-0.0826490.053409...0.007198-0.038710-0.0130700.0300680.0302660.0226200.0021560.006382-0.0230560.009257

    6 rows × 84 columns

    总收益情况

    In [12]:

    (monthly_return[:,:,'PE'].T+1).cumprod().tail()
    

    Out[12]:

     port1port2port3port4port5benchmark
    802.1739261.6523341.7089281.9804522.4331851.180349
    812.3001711.7670901.7559011.9704652.4256811.182893
    822.4603471.7728391.7594272.0880992.4175531.190442
    832.3787631.7332571.6764092.1235522.4268251.162996
    842.5138091.7650601.6877002.1743382.4508911.173762

    因子检验量化指标

    模型建立后,计算n个组合的年化复合收益、超额收益、不同市场情况下高收益组合跑赢benchmark和低收益组合跑输benchmark的概率。

    检验有效性的量化标准:

    (1)序列1-n的组合,年化复合收益应满足一定排序关系,即组合因子大小与收益具有较大相关关系。假定序列i的组合年化收益为Xi,则Xi与i的相关性绝对值Abs(Corr(Xi,i))>MinCorr。此处MinCorr为给定的最小相关阈值。

    (2)序列1和n表示的两个极端组合超额收益分别为AR1、ARn。MinARtop、MinARbottom表示最小超额收益阈值。 if AR1 > ARn #因子越小,收益越大 则应满足AR1 > MinARtop >0 and ARn < MinARbottom < 0 if AR1 < ARn #因子越小,收益越大 则应满足ARn > MinARtop >0 and AR1 < MinARbottom < 0 以上条件保证因子最大和最小的两个组合,一个明显跑赢市场,一个明显跑输市场。

    (3)在任何市场行情下,1和n两个极端组合,都以较高概率跑赢或跑输市场。 以上三个条件,可以选出过去一段时间有较好选股能力的因子。

    因为开始选择的因子较多,因此三条量化标准的选择更加严格,采用如下标准进行选取:

    (1)记录因子相关性,>0.7或<-0.7合格。

    (2)记录赢家组合和输家组合超额收益。

    (3)记录赢家组合跑赢概率>0.6和输家组合跑输概率>0.4合格。

    In [13]:

    total_return = {}
    annual_return = {}
    excess_return = {}
    win_prob = {}
    loss_prob = {}
    effect_test = {}
    MinCorr = 0.3
    Minbottom = -0.05
    Mintop = 0.05
    for fac in factors:
        effect_test[fac] = {}
        monthly = monthly_return[:,:,fac]
        total_return[fac] = (monthly+1).T.cumprod().iloc[-1,:]-1
        annual_return[fac] = (total_return[fac]+1)**(1./6)-1
        excess_return[fac] = annual_return[fac]- annual_return[fac][-1]
        #判断因子有效性
        #1.年化收益与组合序列的相关性 大于 阈值
        effect_test[fac][1] = annual_return[fac][0:5].corr(Series([1,2,3,4,5],index = annual_return[fac][0:5].index))
        #2.高收益组合跑赢概率
        #因子小,收益小,port1是输家组合,port5是赢家组合
        if total_return[fac][0] < total_return[fac][-2]:
            loss_excess = monthly.iloc[0,:]-monthly.iloc[-1,:]
            loss_prob[fac] = loss_excess[loss_excess<0].count()/float(len(loss_excess))
            win_excess = monthly.iloc[-2,:]-monthly.iloc[-1,:]
            win_prob[fac] = win_excess[win_excess>0].count()/float(len(win_excess))
            
            effect_test[fac][3] = [win_prob[fac],loss_prob[fac]]
            
            #超额收益
            effect_test[fac][2] = [excess_return[fac][-2]*100,excess_return[fac][0]*100]
                
        #因子小,收益大,port1是赢家组合,port5是输家组合
        else:
            loss_excess = monthly.iloc[-2,:]-monthly.iloc[-1,:]
            loss_prob[fac] = loss_excess[loss_excess<0].count()/float(len(loss_excess))
            win_excess = monthly.iloc[0,:]-monthly.iloc[-1,:]
            win_prob[fac] = win_excess[win_excess>0].count()/float(len(win_excess))
            
            effect_test[fac][3] = [win_prob[fac],loss_prob[fac]]
            
            #超额收益
            effect_test[fac][2] = [excess_return[fac][0]*100,excess_return[fac][-2]*100]
    
    #由于选择的因子较多,test标准选取适当严格一些
    #effect_test[1]记录因子相关性,>0.7或<-0.7合格
    #effect_test[2]记录【赢家组合超额收益,输家组合超额收益】
    #effect_test[3]记录赢家组合跑赢概率和输家组合跑输概率。【>0.6,>0.4】合格 (因实际情况,跑输概率暂时不考虑)
    DataFrame(effect_test).T
    

    Out[13]:

     123
    B/M0.6281959[15.1984852636, 8.76175660448][0.690476190476, 0.404761904762]
    EPS0.2488584[14.2720133294, 12.9632231367][0.678571428571, 0.357142857143]
    FAP-0.5671644[13.4503120268, 9.44267504971][0.619047619048, 0.380952380952]
    GP/R0.8064658[13.7519085368, 9.10242336036][0.619047619048, 0.357142857143]
    L/A-0.5898578[16.5046555213, 12.1611504111][0.702380952381, 0.416666666667]
    P/R0.9215462[13.980265264, 9.09336493425][0.642857142857, 0.380952380952]
    PB-0.8818369[13.9012096024, 6.71073706755][0.619047619048, 0.428571428571]
    PE0.1328435[13.9001078939, 13.4085302139][0.607142857143, 0.369047619048]
    PS-0.5030761[14.1865783133, 9.18250270639][0.607142857143, 0.392857142857]
    ROA0.5423133[19.3405425743, 9.77751849214][0.75, 0.380952380952]
    ROE0.6386198[17.9776162079, 9.73910681099][0.654761904762, 0.404761904762]
    capitalization-0.7644211[22.4171821446, 9.86517390072][0.583333333333, 0.404761904762]
    circulating_cap-0.7761155[19.8132954476, 9.86514645415][0.571428571429, 0.369047619048]
    circulating_market_cap-0.8791725[38.1580067747, 10.3384004828][0.714285714286, 0.369047619048]
    gross_profit_margin0.7770139[15.5893122733, 9.22929383936][0.642857142857, 0.452380952381]
    inc_net_profit_annual0.6899743[14.9827068239, 9.99043264863][0.678571428571, 0.392857142857]
    inc_net_profit_year_on_year0.8082138[13.825611634, 3.32909642528][0.630952380952, 0.416666666667]
    inc_operation_profit_annual0.5963116[13.1949471333, 9.79858245467][0.654761904762, 0.404761904762]
    inc_operation_profit_year_on_year0.8663793[14.0478401847, 3.17046201915][0.654761904762, 0.404761904762]
    market_cap-0.8262643[44.3574164544, 10.5284689923][0.738095238095, 0.369047619048]
    net_profit0.04857344[12.1195026493, 8.12374126557][0.642857142857, 0.380952380952]
    operating_revenue-0.7751005[23.9766654178, 11.219895262][0.630952380952, 0.345238095238]
    turnover_ratio-0.6218568[10.175151521, 4.22831336907][0.619047619048, 0.511904761905]

    有效因子

    同时满足上述三个条件的有:

    (1)价值类因子:市盈率(B/M)

    (2)成长类因子:主营毛利率(P/R),销售毛利率(gross_profit_margin),净利润同比增长率(inc_net_profit_year_on_year),营业利润同比增长率( inc_operation_profit_year_on_year)

    (3)规模类因子:营业收入(operating_revenue),总股本(capitalization),流通股本(circulating_cap),总市值(market_cap),流通市值(circulating_market_cap),资产负债(L/A)

    有效因子总收益

    In [14]:

    effective_factors = ['B/M','L/A','P/R', 'capitalization', 'circulating_cap', 'circulating_market_cap', 'gross_profit_margin', 
                         'inc_net_profit_year_on_year', 'inc_operation_profit_year_on_year', 'market_cap', 'operating_revenue']
    DataFrame(total_return).ix[:,effective_factors].T
    

    Out[14]:

     port1port2port3port4port5benchmark
    B/M0.9182281.4806581.1420451.1481551.6864980.173762
    L/A1.8700861.5265320.8437021.1241051.2970990.173762
    P/R0.9527241.0608591.1836191.6499511.5241960.173762
    capitalization2.8373461.6560631.3727311.9647151.0350160.173762
    circulating_cap2.3824491.6927371.1703791.7476331.0350130.173762
    circulating_market_cap6.8127512.6195961.2481711.0639171.0868870.173762
    gross_profit_margin0.9670121.0866520.8995551.1833251.7403730.173762
    inc_net_profit_year_on_year0.4213560.9941271.0550842.4462681.5041890.173762
    inc_operation_profit_year_on_year0.4086450.8018971.3814422.1837901.5329790.173762
    market_cap9.1165291.8637491.8645670.8960071.1080290.173762
    operating_revenue3.1333991.3252401.2678161.0063261.1864490.173762

    有效因子年化收益

    In [15]:

    DataFrame(annual_return).ix[:,effective_factors].T
    

    Out[15]:

     port1port2port3port4port5benchmark
    B/M0.1146800.1634860.1353720.1359110.1790470.027062
    L/A0.1921090.1670450.1073420.1337810.1486740.027062
    P/R0.1179960.1280840.1390150.1763580.1668650.027062
    capitalization0.2512340.1768100.1548920.1985710.1257140.027062
    circulating_cap0.2251950.1795030.1378610.1834770.1257140.027062
    circulating_market_cap0.4086420.2391100.1445590.1283630.1304460.027062
    gross_profit_margin0.1193550.1304250.1128640.1389900.1829550.027062
    inc_net_profit_year_on_year0.0603530.1219120.1275560.2290180.1653180.027062
    inc_operation_profit_year_on_year0.0587670.1031170.1555980.2128970.1675400.027062
    market_cap0.4706360.1916690.1917260.1125170.1323470.027062
    operating_revenue0.2668290.1510070.1462200.1230530.1392610.027062

    各个因子6组收益的时间序列图:

    In [16]:

    def draw_return_picture(df):
        plt.figure(figsize =(10,4))
        plt.plot((df.T+1).cumprod().ix[:,0], label = 'port1')
        plt.plot((df.T+1).cumprod().ix[:,1], label = 'port2')
        plt.plot((df.T+1).cumprod().ix[:,2], label = 'port3')
        plt.plot((df.T+1).cumprod().ix[:,3], label = 'port4')
        plt.plot((df.T+1).cumprod().ix[:,4], label = 'port5')
        plt.plot((df.T+1).cumprod().ix[:,5], label = 'benchmark')
        plt.xlabel('return of factor %s'%fac)
        plt.legend(loc=0)
    for fac in effective_factors:
        draw_return_picture(monthly_return[:,:,fac])
    

    冗余因子的剔除

    有些因子,因为内在的逻辑比较相近等原因,选出来的组合在个股构成和收益等方面相关性较高。所以要对这些因子做冗余剔除,保留同类因子中收益最好、区分度最高的因子。 由于本人能力有限,未完成此步骤,具体方法:

    (1)对不同因子的n个组合打分。收益越大分值越大。分值达到好将分值赋给每月该组合内的所有个股。

    if AR1 > ARn #因子越小,收益越大

    则组合i的分值为(n-i+1)

    if AR1 < ARn #因子越小,收益越小

    则组合i的分值为i

    (2)按月计算个股不同因子得分的相关性矩阵。得到第t月个股的因子得分相关性矩阵Score_Corrt,u,v。u,v为因子序号。

    (3)计算样本期内相关性矩阵的平均值。即样本期共m个月,加总矩阵后取1/m。

    (4)设定得分相关性阈值MinScoreCorr。只保留与其他因子相关性较小的因子。

    模型建立和选股

    根据选好的有效因子,每月初对市场个股计算因子得分,按一定权重求得所有因子的平均分。如遇因子当月无取值时,按剩下的因子分值求加权平均。通过对个股的加权平均得分进行排序,选择排名靠前的股票交易。

    以下代码段等权重对因子分值求和,选出分值最高的股票进行交易

    In [17]:

    def score_stock(fdate):
        #B/M, L/A, P/R, capitalization, circulating_cap, circulating_market_cap, market_cap, operating_revenue
        #八个因子越小收益越大,分值越大,应降序排;gross_profit_margin, inc_net_profit_year_on_year, 
        #inc_operation_profit_year_on_year三个因子越大收益越大应顺序排
        effective_factors = {'inc_net_profit_year_on_year':True,'gross_profit_margin':True,'inc_operation_profit_year_on_year':True,
                             'B/M':False,'L/A':False,'P/R':False, 'capitalization':False, 'circulating_cap':False,
                            'circulating_market_cap':False, 'market_cap':False, 'operating_revenue':False}
        fdf = get_factors(fdate)
        score = {}
        for fac,value in effective_factors.items():
            score[fac] = fdf[fac].rank(ascending = value,method = 'first')
        print DataFrame(score).T.sum().order(ascending = False).head(5)
        score_stock = list(DataFrame(score).T.sum().order(ascending = False).index)
        return score_stock,fdf['circulating_market_cap']
    def get_factors(fdate):
        factors = ['B/M','L/A','P/R', 'capitalization', 'circulating_cap', 'circulating_market_cap', 'gross_profit_margin', 
                         'inc_net_profit_year_on_year', 'inc_operation_profit_year_on_year', 'market_cap', 'operating_revenue']
        stock_set = get_index_stocks('000001.XSHG',fdate)
        q = query(
            valuation.code,
            balance.total_owner_equities/valuation.market_cap/100000000,
            balance.total_liability/balance.total_assets,
            income.net_profit/income.operating_revenue,
            valuation.capitalization,
            valuation.circulating_cap,
            valuation.circulating_market_cap,
            indicator.gross_profit_margin,
            indicator.inc_net_profit_year_on_year,
            indicator.inc_operation_profit_year_on_year,
            valuation.market_cap,
            income.operating_revenue
            ).filter(
            valuation.code.in_(stock_set)
        )
        fdf = get_fundamentals(q,date = fdate)
        fdf.index = fdf['code']
        fdf.columns = ['code'] + factors
        return fdf.iloc[:,-11:]
    [score_result,circulating_market_cap] = score_stock('2017-01-01')
    
    code
    603859.XSHG    10554
    603189.XSHG    10521
    600817.XSHG    10451
    600385.XSHG    10372
    603518.XSHG    10326
    dtype: float64
    

    6个组合和benchmark在7年中的月收益率

    计算port1-port5以及TOP20和benchmark的月收益率,时间跨度为7×12=84个月,并将所有数据储存在panel中。

    In [18]:

    year = ['2011','2012','2013','2014','2015','2016','2017']
    
    month = ['01','02','03','04','05','06','07','08','09','10','11','12']
    factors = ['B/M','L/A','P/R', 'capitalization', 'circulating_cap', 'circulating_market_cap', 'gross_profit_margin', 
              'inc_net_profit_year_on_year', 'inc_operation_profit_year_on_year', 'market_cap', 'operating_revenue']
    result = {}
    
    for i in range(7*12):
    
        startdate = year[i/12] + '-' + month[i%12] + '-01'
        try:
            enddate = year[(i+1)/12] + '-' + month[(i+1)%12] + '-01'
        except IndexError:
            enddate = '2018-01-01'
        try:
            nextdate = year[(i+2)/12] + '-' + month[(i+2)%12] + '-01'
        except IndexError:
            if enddate == '2018-01-01':
                nextdate = '2018-02-01'
            else:
                nextdate = '2018-01-01'
        print 'time %s'%startdate
        #综合11个因子打分后,划分几个组合
        df = DataFrame(np.zeros(7),index = ['Top20','port1','port2','port3','port4','port5','benchmark'])
        [score,circulating_market_cap] = score_stock(startdate)
        port0 = score[:20]
        port1 = score[: len(score)/5]
        port2 = score[ len(score)/5+1: 2*len(score)/5]
        port3 = score[ 2*len(score)/5+1: -2*len(score)/5]
        port4 = score[ -2*len(score)/5+1: -len(score)/5]
        port5 = score[ -len(score)/5+1: ]
        print len(score)
     
        df.ix['Top20'] = calculate_port_monthly_return(port0,startdate,enddate,nextdate,circulating_market_cap)
        df.ix['port1'] = calculate_port_monthly_return(port1,startdate,enddate,nextdate,circulating_market_cap)
        df.ix['port2'] = calculate_port_monthly_return(port2,startdate,enddate,nextdate,circulating_market_cap)
        df.ix['port3'] = calculate_port_monthly_return(port3,startdate,enddate,nextdate,circulating_market_cap)
        df.ix['port4'] = calculate_port_monthly_return(port4,startdate,enddate,nextdate,circulating_market_cap)
        df.ix['port5'] = calculate_port_monthly_return(port5,startdate,enddate,nextdate,circulating_market_cap)
        df.ix['benchmark'] = calculate_benchmark_monthly_return(startdate,enddate,nextdate)
        result[i+1]=df
        
    
    time 2011-01-01
    code
    600671.XSHG    8250
    600506.XSHG    8065
    600365.XSHG    8040
    600634.XSHG    7864
    600647.XSHG    7843
    dtype: float64
    867
    time 2011-02-01
    code
    600671.XSHG    8275
    600365.XSHG    8059
    600506.XSHG    8055
    600634.XSHG    7874
    600647.XSHG    7855
    dtype: float64
    867
    time 2011-03-01
    code
    600671.XSHG    8266
    600506.XSHG    8034
    600365.XSHG    7951
    600634.XSHG    7852
    600647.XSHG    7842
    dtype: float64
    866
    time 2011-04-01
    code
    600671.XSHG    8285
    600365.XSHG    7943
    600634.XSHG    7902
    600617.XSHG    7852
    600077.XSHG    7834
    dtype: float64
    874
    time 2011-05-01
    code
    600671.XSHG    8522
    600340.XSHG    8239
    600365.XSHG    8209
    600562.XSHG    8103
    600613.XSHG    8097
    dtype: float64
    885
    time 2011-06-01
    code
    600671.XSHG    8506
    600365.XSHG    8221
    600149.XSHG    8120
    600562.XSHG    8104
    600613.XSHG    8104
    dtype: float64
    885
    time 2011-07-01
    code
    600671.XSHG    8518
    600365.XSHG    8240
    600149.XSHG    8140
    600613.XSHG    8111
    600562.XSHG    8098
    dtype: float64
    885
    time 2011-08-01
    code
    600671.XSHG    8534
    600149.XSHG    8126
    600613.XSHG    8116
    600562.XSHG    8076
    600520.XSHG    7937
    dtype: float64
    886
    time 2011-09-01
    code
    600634.XSHG    8410
    600562.XSHG    8198
    600671.XSHG    8059
    600476.XSHG    7986
    600077.XSHG    7970
    dtype: float64
    901
    time 2011-10-01
    code
    600634.XSHG    8416
    600562.XSHG    8113
    600671.XSHG    8071
    600476.XSHG    8037
    600077.XSHG    7963
    dtype: float64
    902
    time 2011-11-01
    code
    600671.XSHG    8693
    600705.XSHG    8048
    600421.XSHG    8030
    600476.XSHG    8030
    600576.XSHG    8006
    dtype: float64
    913
    time 2011-12-01
    code
    600671.XSHG    8707
    600576.XSHG    8080
    600705.XSHG    8064
    600476.XSHG    8043
    600571.XSHG    7970
    dtype: float64
    913
    time 2012-01-01
    code
    600671.XSHG    8688
    600576.XSHG    8088
    600705.XSHG    8074
    600476.XSHG    8044
    600421.XSHG    7984
    dtype: float64
    913
    time 2012-02-01
    code
    600671.XSHG    8695
    600136.XSHG    8190
    600576.XSHG    8103
    600705.XSHG    8086
    600476.XSHG    8068
    dtype: float64
    913
    time 2012-03-01
    code
    600671.XSHG    8702
    600136.XSHG    8178
    600576.XSHG    8088
    600476.XSHG    8047
    600571.XSHG    7994
    dtype: float64
    912
    time 2012-04-01
    code
    600671.XSHG    8748
    600365.XSHG    8250
    600576.XSHG    8223
    600136.XSHG    8201
    600733.XSHG    8149
    dtype: float64
    914
    time 2012-05-01
    code
    600671.XSHG    8792
    600593.XSHG    8544
    600562.XSHG    8469
    600513.XSHG    8430
    600576.XSHG    8395
    dtype: float64
    920
    time 2012-06-01
    code
    600634.XSHG    8708
    600593.XSHG    8620
    600513.XSHG    8496
    600562.XSHG    8481
    600455.XSHG    8228
    dtype: float64
    922
    time 2012-07-01
    code
    600634.XSHG    8705
    600593.XSHG    8637
    600562.XSHG    8493
    600513.XSHG    8400
    600571.XSHG    8239
    dtype: float64
    922
    time 2012-08-01
    code
    600634.XSHG    8707
    600593.XSHG    8636
    600562.XSHG    8496
    600513.XSHG    8409
    600571.XSHG    8249
    dtype: float64
    922
    time 2012-09-01
    code
    600136.XSHG    9255
    600485.XSHG    8874
    600733.XSHG    8834
    600749.XSHG    8725
    600520.XSHG    8476
    dtype: float64
    933
    time 2012-10-01
    code
    600136.XSHG    9251
    600485.XSHG    8875
    600733.XSHG    8824
    600749.XSHG    8732
    600758.XSHG    8475
    dtype: float64
    933
    time 2012-11-01
    code
    600634.XSHG    9496
    600733.XSHG    8811
    600365.XSHG    8663
    600758.XSHG    8474
    600647.XSHG    8473
    dtype: float64
    940
    time 2012-12-01
    code
    600634.XSHG    9494
    600733.XSHG    8859
    600365.XSHG    8682
    600647.XSHG    8520
    600758.XSHG    8480
    dtype: float64
    940
    time 2013-01-01
    code
    600634.XSHG    9494
    600733.XSHG    8849
    600365.XSHG    8678
    600647.XSHG    8525
    600758.XSHG    8484
    dtype: float64
    940
    time 2013-02-01
    code
    600634.XSHG    9480
    600733.XSHG    8821
    600647.XSHG    8538
    600758.XSHG    8493
    600980.XSHG    8458
    dtype: float64
    940
    time 2013-03-01
    code
    600634.XSHG    9482
    600733.XSHG    8832
    600647.XSHG    8548
    600758.XSHG    8504
    600599.XSHG    8498
    dtype: float64
    942
    time 2013-04-01
    code
    600634.XSHG    9396
    600613.XSHG    8620
    600985.XSHG    8602
    600599.XSHG    8492
    600647.XSHG    8442
    dtype: float64
    942
    time 2013-05-01
    code
    600634.XSHG    9449
    600136.XSHG    8910
    600980.XSHG    8731
    600985.XSHG    8607
    600599.XSHG    8545
    dtype: float64
    942
    time 2013-06-01
    code
    600485.XSHG    9022
    600136.XSHG    8892
    600980.XSHG    8726
    600576.XSHG    8345
    600706.XSHG    8332
    dtype: float64
    941
    time 2013-07-01
    code
    600485.XSHG    9032
    600136.XSHG    8902
    600980.XSHG    8712
    600706.XSHG    8331
    600576.XSHG    8318
    dtype: float64
    941
    time 2013-08-01
    code
    600485.XSHG    9037
    600980.XSHG    8705
    600576.XSHG    8343
    600706.XSHG    8313
    600379.XSHG    8302
    dtype: float64
    941
    time 2013-09-01
    code
    600365.XSHG    8997
    600485.XSHG    8938
    600980.XSHG    8832
    600615.XSHG    8649
    600593.XSHG    8545
    dtype: float64
    941
    time 2013-10-01
    code
    600365.XSHG    8983
    600485.XSHG    8922
    600980.XSHG    8826
    600615.XSHG    8655
    600234.XSHG    8566
    dtype: float64
    941
    time 2013-11-01
    code
    600733.XSHG    8684
    600485.XSHG    8457
    600758.XSHG    8422
    600099.XSHG    8401
    600520.XSHG    8390
    dtype: float64
    941
    time 2013-12-01
    code
    600733.XSHG    8723
    600758.XSHG    8423
    600520.XSHG    8402
    600099.XSHG    8397
    600146.XSHG    8356
    dtype: float64
    941
    time 2014-01-01
    code
    600733.XSHG    8666
    600485.XSHG    8421
    600758.XSHG    8417
    600520.XSHG    8400
    600099.XSHG    8391
    dtype: float64
    941
    time 2014-02-01
    code
    600733.XSHG    8702
    600758.XSHG    8421
    600146.XSHG    8411
    600520.XSHG    8403
    600099.XSHG    8393
    dtype: float64
    941
    time 2014-03-01
    code
    600733.XSHG    8683
    600485.XSHG    8460
    600758.XSHG    8424
    600520.XSHG    8422
    600146.XSHG    8392
    dtype: float64
    941
    time 2014-04-01
    code
    600146.XSHG    8422
    600781.XSHG    8411
    600506.XSHG    8409
    600576.XSHG    8357
    600485.XSHG    8354
    dtype: float64
    944
    time 2014-05-01
    code
    600539.XSHG    9141
    600980.XSHG    9020
    600753.XSHG    8852
    600593.XSHG    8846
    600355.XSHG    8760
    dtype: float64
    948
    time 2014-06-01
    code
    600539.XSHG    9140
    600980.XSHG    9039
    600753.XSHG    8873
    600593.XSHG    8854
    600355.XSHG    8765
    dtype: float64
    948
    time 2014-07-01
    code
    600539.XSHG    9115
    600980.XSHG    9006
    600753.XSHG    8899
    600593.XSHG    8853
    600355.XSHG    8729
    dtype: float64
    947
    time 2014-08-01
    code
    600539.XSHG    9151
    600980.XSHG    8984
    600593.XSHG    8846
    600576.XSHG    8844
    600753.XSHG    8838
    dtype: float64
    947
    time 2014-09-01
    code
    600365.XSHG    8977
    600099.XSHG    8765
    600355.XSHG    8750
    600847.XSHG    8742
    600539.XSHG    8677
    dtype: float64
    951
    time 2014-10-01
    code
    600365.XSHG    8988
    600355.XSHG    8806
    600099.XSHG    8776
    600847.XSHG    8773
    600476.XSHG    8696
    dtype: float64
    951
    time 2014-11-01
    code
    600599.XSHG    9072
    600696.XSHG    8995
    600419.XSHG    8905
    600136.XSHG    8883
    600539.XSHG    8838
    dtype: float64
    968
    time 2014-12-01
    code
    600696.XSHG    9009
    600599.XSHG    8950
    600419.XSHG    8910
    600136.XSHG    8875
    600539.XSHG    8836
    dtype: float64
    969
    time 2015-01-01
    code
    600696.XSHG    9094
    600599.XSHG    9039
    600136.XSHG    8901
    600419.XSHG    8895
    600539.XSHG    8755
    dtype: float64
    969
    time 2015-02-01
    code
    600696.XSHG    9076
    600599.XSHG    8999
    600419.XSHG    8902
    600136.XSHG    8895
    600539.XSHG    8756
    dtype: float64
    969
    time 2015-03-01
    code
    600696.XSHG    9078
    600599.XSHG    9007
    600419.XSHG    8906
    600539.XSHG    8785
    600892.XSHG    8737
    dtype: float64
    969
    time 2015-04-01
    code
    600696.XSHG    9142
    600099.XSHG    8952
    603601.XSHG    8946
    600539.XSHG    8857
    600599.XSHG    8817
    dtype: float64
    982
    time 2015-05-01
    code
    603869.XSHG    9587
    603088.XSHG    9461
    600455.XSHG    9348
    603898.XSHG    9339
    603988.XSHG    9335
    dtype: float64
    1020
    time 2015-06-01
    code
    603869.XSHG    9577
    603088.XSHG    9544
    603988.XSHG    9415
    600455.XSHG    9412
    600365.XSHG    9389
    dtype: float64
    1030
    time 2015-07-01
    code
    603869.XSHG    9757
    603088.XSHG    9632
    603988.XSHG    9517
    600455.XSHG    9494
    603636.XSHG    9465
    dtype: float64
    1039
    time 2015-08-01
    code
    603869.XSHG    9701
    603988.XSHG    9515
    600365.XSHG    9356
    603010.XSHG    9319
    600136.XSHG    9305
    dtype: float64
    1041
    time 2015-09-01
    code
    600506.XSHG    9835
    603099.XSHG    9546
    600520.XSHG    9501
    600593.XSHG    9441
    600136.XSHG    9397
    dtype: float64
    1060
    time 2015-10-01
    code
    600506.XSHG    9834
    603099.XSHG    9563
    600520.XSHG    9541
    600593.XSHG    9476
    600365.XSHG    9389
    dtype: float64
    1060
    time 2015-11-01
    code
    603918.XSHG    9637
    600980.XSHG    9520
    600599.XSHG    9420
    603601.XSHG    9391
    600371.XSHG    9374
    dtype: float64
    1060
    time 2015-12-01
    code
    600980.XSHG    9522
    600753.XSHG    9475
    603918.XSHG    9472
    603010.XSHG    9364
    600599.XSHG    9322
    dtype: float64
    1060
    time 2016-01-01
    code
    603918.XSHG    9641
    600980.XSHG    9549
    600753.XSHG    9509
    600599.XSHG    9438
    603601.XSHG    9389
    dtype: float64
    1066
    time 2016-02-01
    code
    603918.XSHG    9725
    603778.XSHG    9652
    600599.XSHG    9615
    600980.XSHG    9538
    603085.XSHG    9419
    dtype: float64
    1071
    time 2016-03-01
    code
    603918.XSHG    9743
    603778.XSHG    9706
    600599.XSHG    9683
    600980.XSHG    9576
    600419.XSHG    9429
    dtype: float64
    1073
    time 2016-04-01
    code
    600599.XSHG    9913
    600419.XSHG    9801
    603778.XSHG    9739
    600080.XSHG    9710
    603918.XSHG    9669
    dtype: float64
    1078
    time 2016-05-01
    code
    603601.XSHG    9916
    603918.XSHG    9907
    600137.XSHG    9836
    600733.XSHG    9693
    603023.XSHG    9673
    dtype: float64
    1080
    time 2016-06-01
    code
    600137.XSHG    9964
    600733.XSHG    9869
    603601.XSHG    9766
    600506.XSHG    9756
    603023.XSHG    9724
    dtype: float64
    1088
    time 2016-07-01
    code
    600137.XSHG    10035
    600733.XSHG     9957
    600506.XSHG     9864
    603601.XSHG     9716
    603066.XSHG     9699
    dtype: float64
    1096
    time 2016-08-01
    code
    600137.XSHG    10049
    603322.XSHG     9969
    603601.XSHG     9892
    600506.XSHG     9862
    600733.XSHG     9801
    dtype: float64
    1100
    time 2016-09-01
    code
    600455.XSHG    10155
    600980.XSHG     9933
    603088.XSHG     9885
    603027.XSHG     9881
    603838.XSHG     9849
    dtype: float64
    1114
    time 2016-10-01
    code
    600455.XSHG    10177
    600980.XSHG    10053
    603027.XSHG     9976
    603088.XSHG     9970
    603779.XSHG     9969
    dtype: float64
    1123
    time 2016-11-01
    code
    603859.XSHG    10604
    600817.XSHG    10441
    603779.XSHG    10403
    603189.XSHG    10400
    600385.XSHG    10387
    dtype: float64
    1130
    time 2016-12-01
    code
    603859.XSHG    10599
    600817.XSHG    10443
    603189.XSHG    10410
    603779.XSHG    10400
    600385.XSHG    10391
    dtype: float64
    1130
    time 2017-01-01
    code
    603859.XSHG    10554
    603189.XSHG    10521
    600817.XSHG    10451
    600385.XSHG    10372
    603518.XSHG    10326
    dtype: float64
    1130
    time 2017-02-01
    code
    603189.XSHG    10618
    603859.XSHG    10489
    600817.XSHG    10474
    600385.XSHG    10409
    603779.XSHG    10399
    dtype: float64
    1131
    time 2017-03-01
    code
    603189.XSHG    10638
    600817.XSHG    10488
    603859.XSHG    10467
    603779.XSHG    10438
    600385.XSHG    10420
    dtype: float64
    1131
    time 2017-04-01
    code
    603189.XSHG    10792
    603779.XSHG    10609
    600385.XSHG    10587
    603022.XSHG    10441
    603088.XSHG    10438
    dtype: float64
    1152
    time 2017-05-01
    code
    603088.XSHG    11346
    603903.XSHG    11275
    603960.XSHG    11187
    603040.XSHG    11168
    603319.XSHG    11143
    dtype: float64
    1240
    time 2017-06-01
    code
    603088.XSHG    11410
    603040.XSHG    11337
    603903.XSHG    11331
    603960.XSHG    11255
    603966.XSHG    11254
    dtype: float64
    1245
    time 2017-07-01
    code
    603088.XSHG    11429
    603903.XSHG    11410
    603040.XSHG    11369
    603966.XSHG    11275
    603960.XSHG    11264
    dtype: float64
    1246
    time 2017-08-01
    code
    603903.XSHG    11545
    603088.XSHG    11454
    603040.XSHG    11379
    603960.XSHG    11310
    603966.XSHG    11286
    dtype: float64
    1248
    time 2017-09-01
    code
    603040.XSHG    11983
    600455.XSHG    11890
    603326.XSHG    11672
    603429.XSHG    11576
    603229.XSHG    11490
    dtype: float64
    1309
    time 2017-10-01
    code
    603040.XSHG    12019
    600455.XSHG    11897
    603326.XSHG    11673
    600506.XSHG    11525
    603229.XSHG    11497
    dtype: float64
    1309
    time 2017-11-01
    code
    603960.XSHG    12511
    603232.XSHG    12503
    603859.XSHG    12377
    603383.XSHG    12297
    603500.XSHG    12238
    dtype: float64
    1352
    time 2017-12-01
    code
    603232.XSHG    12533
    603960.XSHG    12437
    603859.XSHG    12353
    603500.XSHG    12288
    603040.XSHG    12275
    dtype: float64
    1352
    

    In [19]:

    df = pd.Panel(result)
    

    绘制六个组合的月超额收益率

    In [20]:

    matplotlib.rcParams['axes.unicode_minus']=False
    index = ['Top20','port1','port2','port3','port4','port5']
    def draw_backtest_picture(ind):
        plt.figure(figsize =(10,4))
        plt.plot(df.ix[:,ind,0]-df.ix[:,'benchmark',0], label = 'excess return: %s'%ind)
        plt.xlabel('backtest excess return of factor %s'%ind)
        plt.legend(loc=0)
        grid()
        
    for ind in index:
        draw_backtest_picture(ind)
        
    

    展开全文
  • 多因子选股策略步骤

    千次阅读 2020-01-13 16:55:49
    多因子选股策略研究步骤如下: 初步建立因子库 初步建立的因子库将涉及财务、行情、预期以及其他四类因子,这是作者通过阅读学术论文、研究报告及运用所学专业知识综合确定下来的。在确定几大类因子之后,又将大类...
  • 多因子选股有因

    2019-05-03 09:32:42
    多因子选股之有效因子 什么是多因子选股? 玩股票的朋友的朋友应该很清楚,股市之道无外乎:选股、择时、仓控。精通任何一点都可以说在股市中所向披靡。 这次,我们从选股入手,来谈谈量化选股的基本“套路”...
  • 多因子选股之策略实

    2019-05-06 16:25:21
    多因子选股之有效因子 什么是多因子选股? 玩股票的朋友的朋友应该很清楚,股市之道无外乎:选股、择时、仓控。精通任何一点都可以说在股市中所向披靡。 这次,我们从选股入手,来谈谈量化选股的基本“套路”——...
  • 多因子选股的策略实现(附:源码)

    万次阅读 多人点赞 2019-06-26 10:15:58
    经过前两篇文章,我们把多因子选股策略三大步骤:因子的选取,检验,冗余因子剔除等介绍了一遍,接下来这一篇将利用已经得到的结论,完成最后一步,策略的实现。 我们根据前两篇文章的内容,我们选取以下因子来构建...
  • 一、因子选股策略 1、因子  因子:选择股票的某种标准。因子是能够预测股票收益的变量。 (1)基本面因子  基本面因子描述了一个公司的财务状况,最常见的基本面因子是由利润表,资产负债表以及现金流量表中的数据...
  • 使用财务数据构建一个多因子选股模型,在支持向量机分类上进行预测优化。选股上使用排序法对数据进行预处理,再使用支持向量机对股票收益进行分类预测,最后使用数据到分离超平面的距离进行排序,优化支持向量机的...
  • 一文说透多因子选股

    2020-07-08 14:24:43
    多因子选股模型是量化选股版图中的一个非常重要的组成部分,所谓多因子选股,就是利用历史数据,选取某些可能影响股价波动的因素去选择股票买入持有一段时间,然后分析收益率、回撤率等相关数据,最终确定哪些因素...
  • 基于多因子选股的半监督核聚类算法改进研究.pdf
  • 国泰君安_金融工程专题报告_基于组合权重优化的多因子选股策略,构建市值中性、行业中性、风格中性的最优投资组合。
  • 多因子选股策略 理论 因子模型是应用最广泛的一种选股模型,基本原理是采用一系列的因子作为选股标准,满足这些因子的股票被买入,不满足的股票被卖出。 例如,当很投资者认为低市盈率(PE,公司市值/净利润)的...
  • 一千个读者眼里有一千个哈姆雷特。其实,每个投资者脑中都有一个因子量化模型。信奉价值投资的基金经理会选择估值低、基本面较好的股票,也许还会考虑过去一段时间的涨跌幅,这就涉及了至少3个因子...在多因子选股...
  • 101 Formulaic Alphas - Zura Kakushadze 基于短周期价量特征的多因子选股体系--数量化专题之九十三--国泰君安
  • 多因子选股中,因子的有效性检验是不可避免的工作,以下介绍笔者日常学习过程中摘下的几种有效性检验方法,以供日后使用。 本文将介绍目前学术界和业界普遍使用的两种方法,以供参考: 相关性检验 单调性检验 ...
  • 基本面量化:一种多因子选股策略

    千次阅读 2019-12-05 10:49:23
    基本面多因子选股策略的有效性,已在韩国、新加坡、我国香港等市场得到验证。 一本介绍以量化投资实现阿尔法收益的原理和途径的新书《阿尔法经济学:赢取资本超额收益的法则》,因被若干美国对冲基金经理推崇今年在...
  • 多因子选股之策略的实现

    千次阅读 2019-05-02 22:19:47
    多因子选股之策略的实现 经过前两篇文章,我们把多因子选股策略三大步骤:因子的选取,检验,冗余因子剔除等介绍了一遍,接下来这一篇将利用已经得到的结论,完成最后一步,策略的实现。 我们根据前两篇文章的...
  • 多因子选股之策略的实现 经过前两篇文章,我们把多因子选股策略三大步骤:因子的选取,检验,冗余因子剔除等介绍了一遍,接下来这一篇将利用已经得到的结论,完成最后一步,策略的实现。 我们根据前两篇文章的...
  • 因子筛选与因子正交化方法 引言 在因子研究框架中,如果已经检验出个有效的因子,而在实际因子选股的过程中,各个有效的因子可能会相互影响, 何为正交化?
  • 多因子模型是量化股票组合投资领域的基本工具,介绍性的资料很。但学习这些资料之后,甚至一些老手也很难判断自己掌握到什么程度,或是在哪些方面有所缺失。因此,我们几位从业者合力整理了这份多因子模型水平测试...
  • 最近毕设的课题选择是xgboost多因子选股,看了很的文献 首先第一个:《TS-Boost因子选股框架初探——机器学习实战系列之一》长江证券 这篇研报的特点,是提出了一个新的模型,TS-Boost模型的特点是在于解决样本...
  • 多因子选股Alpha策略

    千次阅读 2019-07-22 14:25:40
    这可能是由于小盘相对大盘更不容易受到投资者关注,从而更可能形成价值洼地,并且当出现利好的信息时小盘由于市值规模较小,只需有不的市场资金追捧,股价就会大幅攀升。而价值型股票优于成长型股票的原因是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,399
精华内容 1,359
关键字:

多因子选股