【量化交易】多因子策略与理论介绍

今日学习目标:记忆股票的多因子策略的理论基础

一、什么是多因子选股策略

多因子选股策略是一种应用十分广泛的选股策略,其基本思想就是找到某些和收益率最相关的因子

二、多因子(Alpha因子)的种类

  • 按照因子分析的角度

【量化交易】多因子策略与理论介绍_第1张图片

  • 1、基本面因子
    • 价值因子
    • 盈利因子
    • 成长因子
    • 资本结构因子
    • 运营因子
    • 流通性因子

  • 2、技术因子
    • 动量因子
    • 趋势因子
    • 市值因子
    • 波动因子
    • 成交量因子

  • 按照因子来源的角度

【量化交易】多因子策略与理论介绍_第2张图片

  • 公司层面
    • 价值因子
    • 成长因子
    • 规模因子
    • 等、
  • 市场层面
    • 趋势因子
    • 动量因子
    • 市值因子
  • 外部环境层面
    • 宏观环境
    • 行业环境

大类因子细分

【量化交易】多因子策略与理论介绍_第3张图片

三、多因子策略的优势

  • 多元因子,阿尔法收益的来源丰富,多因子持续稳定
  • 根据市场环境的变化选取最优因子和权重,模型可修改

多因子策略的理论来源?(重要)什么影响股票的收益率?

四、资产定价模型(CAPM)

【量化交易】多因子策略与理论介绍_第4张图片

  • ri:证券的收益率
  • rF:无风险利率
  • rM:市场收益率
  • rM-rF: 风险溢价
  • β: 某个公司与市场的相关性
这个模型可以理解为单因子模型-系统风险,我们的收益只跟市场走。

五、套利定价理论(APT模型)

假设证券收益率与一组未知因子(特征)线性相关

APT模型其实就是相当于一个多因子模型,证券收益通过权重系数回归得到。但是并没有指出其中具体的因子(特征)是什么

六、FF三因子模型

Fama和French 1992年对美国股票市场决定不同股票回报率差异的因素的研究发现(发现市值较小、市值账面比较低的两类公司更有可能取得优于市场水平的平均回报率),超额回报率可由它对三个因子来解释。市场资产组合、市值因子(SMB)、账面市值比因子(HML)。

三因子模型指出了规模因子、价值因子。

发现市值较小、市值账面比较低的两类公司更有可能取得优于市场水平的平均回报率
意味着那些市值较小的公司组成的投资组合,可以预期能带来更高的回报,与更高的风险。所以在2017年之前一段时间之内,大多数量化公司在市值小的指标进行筛选就能获取很高的回报

在过去20年里面,很多学者对三因子模型进行实证分析,发现有些股票的alpha显著不为0,这说明三因子模型中的三个风险(因素)并不能解释所有超额收益。

七、FF五因子模型

Fama和French发现在上述风险之外,还有盈利水平风险、投资水平风险也能带来个股的超额收益,并于2015年提出了五因子模型

其实五因子模型就是增加了盈利因子和成长因子这两类因子

与三因子类似,参数估计的方法仍然是用多元线性回归的方法,这里的a_i则是五因子模型里面尚未解释的超额收益。

八、关于挖掘与怎么做

【量化交易】多因子策略与理论介绍_第5张图片

【量化交易】多因子策略与理论介绍_第6张图片

九、案例:市值因子(Alpha因子)的选股策略

9.1 结果

【量化交易】多因子策略与理论介绍_第7张图片

9.2 从市值中选择值小的股票

  • 选定财务数据筛选
  • 进行每日调仓(多因子选股调仓周期频率会小一些)

9.3 代码

def init(context):
    context.limit = 20


def before_trading(context):
    # 获取财务数据中的市值,然后按照市值大小排序
    fund = get_fundamentals(
        query(
            fundamentals.eod_derivative_indicator.market_cap
        ).order_by(
            fundamentals.eod_derivative_indicator.market_cap.asc()
        ).limit(
            context.limit
        )
    )

    # 将这20支股票的代号
    context.stocks = fund.columns


def handle_bar(context, bar_dict):
    # 先得出投资组合当中的仓位有没有股票,注意这里的仓位即使为0,但是
    # 股票名字还在
    holding = []

    for stock in context.portfolio.positions.keys():

        # 判断当前的股票是否有持有股份
        if context.portfolio.positions[stock].quantity > 0:
            holding.append(stock)

    # 判断哪些要卖出去,哪些要买入
    to_sell = set(holding) - set(context.stocks)
    to_buy = context.stocks

    # 进行买卖判断
    for sell in to_sell:
        order_target_percent(sell, 0)

    # 购买的比例
    percent = 1.0 / len(to_buy)

    for buy in to_buy:
        order_target_percent(buy, percent)

你可能感兴趣的:(人工智能,python,量化交易)