IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    量化投资

    vgbhfive发表于 2024-03-03 08:26:41
    love 0

    概述

    量化是指一种投资交易策略,利用统计学、数学、计算机、人工智能等方法取代传统人工做出决策,通过模型来实现资产交易进而构建投资组合。即利用计算机技术和数学模型来实现投资策略的过程。

    主观投资与量化投资的对比:

    主观投资量化投资
    基于基金经理的判断基于模型运算的客观结果
    基金经理对宏观环境、行业、公司的研究,预测未来趋势核心在于利用计算机技术在海量数据中寻找到投资规律
    注重研究深度,对少数资产进行深入研究注重广度,全市场筛选标的,多维度分析
    持股集中,稳定性略差持股分散,组合投资
    交易依靠主管认知与判断模型自主下单

    优势:

    • 投资范围广泛。借助计算机技术,可以分析整体市场,促进更多的投资机会。
    • 程序化交易,避免主观因素干扰。通过回测验证策略的有效性和可行性,自助下单,程序化交易。
    • 数据处理快速响应,创造交易价值。利用计算机技术,分析海量数据,支持高频交易,可及时验证每个决策后模型的有效性。

    风险:

    • 策略失效。量化投资最大的风险是策略失效,但更大的风险在于策略在何时失效。
    • 流通性风险。量化投资由于很多因素很容易导致同质化,带来的问题就是会产生共振,更容易产生系统性的风险。
    • 模型本身风险。量化投资需要借助模型,而建立模型需要设定各种参数,由于参数的不确定性可能会导致巨大损失。

    一般流程:

    • 策略设计。基于金融理论、历史数据或其他分析方法,构建量化投资策略。
    • 回测验证。使用历史数据对策略进行回测,检验策略的有效性和可行性,以及找到优化策略的方法。
    • 模拟盘验证。使用虚拟账户和资金进行模拟交易,检验策略在实际市场中的表现,根据反馈及时调整和优化策略。
    • 实盘交易。经过前面的验证和优化后,将策略投入实际交易中执行。

    量化投资的策略设计和实施过程需要严谨、科学、系统化的方法,同时也需要一定的技术和数学功底。成功的量化投资不仅仅依赖于策略的设计,也需要严格的风险控制和资金管理。


    数据收集

    资产数据

    资产数据信息根据来源和分析方法的不同,可以分为两类:

    • 技术面数据。技术面数据主要是根据资产的历史价格和交易量等市场数据进行分析和计算得出的指标信息。
    • 基本面数据。通过分析公司的财务状况、业绩表现、竞争力等信息得出的评估信息。

    技术面常见指标

    移动平均线 MA

    移动平均线是通过计算一段时间内的资产平均价格来平滑价格波动。

    常见的移动平均线有两种:

    • 简单移动平均线(SMA),最基本的移动平均线类型,通过将一段时间内的资产收盘价相加,然后除以时间段的天数来计算。简单移动平均线可以平滑价格波动,显示出长期趋势。
    • 指数移动平均线(EMA),对近期价格给予更高的权重,可以反映市场更近期的变化。计算指数移动平均线时,当前价格会根据选定的时间段和权重系数,与之前的移动平均线值相结合。

    移动平均线的应用主要有以下几个方面:

    • 确定趋势:使用不同期限的移动平均线来确定趋势的强度和方向。
    • 交叉信号:移动平均线的交叉均可以提供买入和卖出的信号。
    • 支撑与阻力线:移动平均线经常被称为支撑线和阻力线的参考。

    均线八大买卖法则:

    • 买点 1:均线整体上行,价格由下至上上穿均线,此为黄金交叉,形成第一个买点。
    • 买点 2:价格出现下跌迹象,但尚未跌破均线,此时均线成为支撑线,形成第二个买点。
    • 买点 3:价格仍处于均线上方,但呈现急剧下跌趋势,当跌破均线时,形成第三个买点。
    • 买点 4:价格和均线均处于下降通道,且价格处于均线下方,严重远离均线,出现第四个买点。
    • 卖点 1:均线由上升状态变为缓慢下降状态,价格开始下跌,当价格跌破均线时,此为死亡交叉点,形成第一个卖点。
    • 卖点 2:价格仍处于均线之下,但价格开始呈现上涨趋势,当价格无限接近均线但尚未突破时,此时均线变为阻力线,形成第二个卖点。
    • 卖点 3:价格终于突破均线,处于均线上方,但持续时间不长,价格开始下跌,直至再一次跌破均线,形成第三个卖点。
    • 卖点 4:价格和均线均在上涨,价格上涨速度大于均线上涨速度,当价格严重便宜均线时,出现第四个卖点。

    Snipaste_2024-02-03_15-37-16.jpg

    相对强弱指数 RSI

    RSI 是一种用于衡量资产价格变动强度和速度的技术指标。可以帮助投资者判断资产市场的超买和超卖情况,以及价格的反转和确认信号。RSI 是一种短期的指标,对价格的反应较为敏感。

    RSI 的计算基于一定时期内资产价格的平均涨幅和跌幅。通常情况下 RSI的取值范围在 0~100 之间。
    RSI 指标的常用参数为 14,计算步骤如下:

    • 首先计算 14 个交易周期内涨幅和跌幅的平均值。
    • 计算涨幅平均值与跌幅平均值的相对强弱比率(Relative Strength, RS)。
      RS = 交易周期内涨幅平均值 / 交易周期内跌幅平均值
    • 计算相对强弱指数(RSI)。
      RSI = 100 - (100 / (1 + RS))

    RSI 的数值解读如下:

    • 指数在 0~30 之间:表示资产市场被超卖,可能存在价格反弹的机会。
    • 指数在 70~100 之间:表示资产市场被超买,可能存在价格下跌的机会。
    • 指数在 30~70 之间:表示资产市场相对平稳,没有明显的超买或超卖信号。
    MACD

    MACD 指标是资产技术分析中常用的趋势追踪和买卖信号指标,其通过比较两条移动平均线的差异,来判断资产价格的趋势以及价格的买卖信号。MACD 指标是一种相对较慢的指标,较长时间的移动平均线会导致滞后性。

    MACD 指标由以下几个元素组成:

    • DIF(Difference Line):短期指数移动平均线减去长期指数移动平均线得到的差值线。DIF 线可以较为敏感地反应价格的短期波动。
    • DEA(Signal Line):对 DIF 线进行平滑处理,一般使用 DIF 线的 9 日移动平均线得到。DEA 线可以平滑 DIF 线的波动,更好地体现价格的中期趋势。
    • MACD(MACD Histogram): DIF 线与 DEA 线的差值,可将价格的快速波动变化显示为柱状图。

    MACD 指标的应用主要包括以下几个方面:

    • 趋势判断:当 DIF 线与 DEA 线发生金叉(DIF 线向上穿过 DEA 线)时,表示价格可能出现上涨趋势;当 DIF 线与 DEA 线发生死叉(DIF 线向下穿过 DEA 线)时,表示价格可能出现下跌趋势。
    • 买卖信号:当 MACD 柱由负值转为正值时,被视为买入信号;当 MACD 柱由正值转为负值时,被视为卖出信号。这些转折点可能表示价格快速波动的转变。
    • 背离信号:观察价格和 MACD 指标的背离情况。例如,当价格创新高而 MACD 指标未能创新高时,可能表示价格上涨动能下降,可能出现价格回调。
    成交量

    成交量指标衡量了资产交易的活跃程度。当资产价格上涨时,成交量增加可以视为价格上涨的确认,而当资产价格下跌时,成交量增加可能表示价格下跌的确认。成交量指标相对于价格指标而言,属于非价格类指标。

    成交量指标的计算非常简单,即某一时间周期内的总成交量。

    成交量指标的应用主要包括以下几个方面:

    • 确认趋势:成交量指标可以用来确认价格趋势的有效性。在上涨趋势中,成交量增加可能意味着买盘增加,市场看涨情绪强烈。而在下跌趋势中,成交量增加可能意味着卖盘增加,市场看跌情绪强烈。如果价格和成交量出现背离,即价格上涨而成交量下降,或价格下跌而成交量增加,可能意味着趋势反转的可能性。
    • 确认突破:成交量指标也可用于确认价格突破的有效性。当价格突破重要的价格水平(如支撑或阻力线)时,如果成交量也大幅增加,可能预示着价格突破的力度和可持续性增加。
    • 观察分析:通过观察成交量指标的变化,研究市场情绪和买卖压力。
    • 交易量模型:使用成交量指标构建交易量模型,例如量价分析(Volume Price Analysis)或成交量波动指标(Volume Oscillator),这些模型通过比较成交量与价格的关系,以此寻找特定的交易信号。
    随机指标

    随机指标用于判断资产价格的超买和超卖情况,以及价格反转的可能性。可以帮助确定适合买入或卖出资产的时机。随机指标是一种短期的技术指标,可以辅助投资者判断市场价格走势和买卖时机,但并不是绝对准确的。

    随机指标的计算基于一段时间内的收盘价与最高价和最低价的关系。该指标通常使用 %K 线和 %D 线两条线,并结合超买区和超卖区进行解读。

    随机指标的计算步骤如下:

    • 首先计算一定时间段(常见为 14 个交易日)内的最高价和最低价。
    • 计算当前收盘价与该时间段内最低价的差值(收盘价-最低价),并除以最高价和最低价的差值(最高价-最低价)。
      %K = (收盘价 - 最低价)/ (最高价 - 最低价) * 100
    • 计算 %K 的移动平均值作为 %D 线的值,通常使用 3 日平均。
      %D = %K 的 3 日简单移动平均线

    随机指标的数值解读如下:

    • 当 %K 线从下方穿越 %D 线时,被视为买入信号,可能预示着价格的反转和上涨。
    • 当 %K 线从上方穿越 %D 线时,被视为卖出信号,可能预示着价格的反转和下跌。
    • 当 %K 线位于高位(一般超过80)时,表示市场可能超买,价格的下跌风险增加。
    • 当 %K 线位于低位(一般低于20)时,表示市场可能超卖,价格的上涨机会增加。

    基本面常见指标

    每股收益

    每股收益用于衡量公司每股可供股东分配的净利润,即每股盈利能力。每股收益是投资者评估公司盈利能力和估值的重要参考指标。

    每股收益的计算公式为:EPS = 净利润 / 流通股本。
    净利润是指公司在一定会计周期内所创造的净收益,即扣除各项费用和税后利润。流通股本是指公司已经发行并在市场上自由交易的资产数量。

    每股收益指标的应用主要包括以下几个方面:

    • 估值比较:每股收益可以作为比较不同公司的盈利能力和估值水平的重要依据。通常情况下,具有更高每股收益的公司往往被认为具有更好的盈利能力。
    • 成长趋势:观察每股收益的变化趋势可以了解公司盈利能力的增长速度和稳定性。持续增长的每股收益可能意味着公司业绩好于预期,具有良好的成长潜力。
    • 盈利稳定性:通过比较每股收益的波动程度,可以判断公司的盈利稳定性。较小的波动通常被认为是公司盈利稳定性较好的表现。
    市净率

    市净率也称为股价净资产比,是一种用于衡量当前市场价格与每股净资产之间关系的指标,是用来评估公司的市场估值是否低估或高估的重要指标。

    市净率的计算公式为:市净率 = 总市值 / 净资产。
    总市值是指公司所有已发行资产的市值之和,而净资产是指公司的总资产减去总负债。

    市净率是一个相对指标,一般用来比较同行业或同一市场的公司。较低的市净率通常被认为是公司被低估的迹象,而较高的市净率可能意味着公司被高估。
    根据市净率可以得出以下几个判断:

    • 市净率低于1:通常表示公司的市场价值低于其净资产,资产可能被低估。
    • 市净率约等于1:表示公司的市场价值大致等于其净资产,资产被市场公平估价。
    • 市净率高于1:通常表示公司的市场价值高于其净资产,资产可能被高估。
    股息收益率

    股息收益率用于衡量资产派发的股息相对于资产的价格的比率。股息是公司利润的一部分,以现金或资产形式派发给股东,股息收益率可以帮助投资者评估持有一只资产所能获得的现金回报。

    股息收益率的计算公式为:股息收益率 = 每股股息 / 资产价格。
    每股股息是指公司每股派发的股息金额,资产价格是资产在市场上的交易价格。

    股息收益率指标的应用主要包括以下几个方面:

    • 现金回报:股息收益率可以帮助投资者了解持有资产所能获得的现金回报,尤其对于偏好分红收入的投资者而言,具有重要意义。较高的股息收益率可能表示股东获得较高的分红回报。
    • 盈利比较:通过比较不同公司的股息收益率,可以了解公司的盈利能力和分红政策。
    • 市场情绪:股息收益率也可以反映市场对公司的情绪和风险偏好。一般而言,较高的股息收益率可能意味着市场对公司前景持谨慎态度,或者公司面临一定的困境。
    净利润

    净利润用于衡量一家公司在特定会计期间内实际获得的净收益,即扣除各项费用和税后利润。净利润是评估公司盈利能力和基本经营状况的重要指标。

    净利润的计算公式为:净利润 = 总收入 - 总成本 - 税收 - 其他费用。
    其中:

    • 总收入:是指公司在特定会计期间内所实现的总销售收入或营业收入。
    • 总成本:包括直接成本和间接成本,指用于生产和销售产品或提供服务的成本。
    • 税收:是指公司应缴纳的所得税或其他税收费用。
    • 其他费用:包括财务费用、管理费用、营销费用等。

    净利润是衡量公司盈利能力的重要指标,主要应用包括以下几个方面:

    • 盈利能力评估:净利润是评估盈利能力的核心指标之一。较高的净利润意味着公司创造了更多的利润,具有较好的盈利能力。
    • 盈利趋势分析:观察净利润的变化趋势可以了解盈利的增长趋势和稳定性。
    • 盈利比较:通过比较不同公司的净利润,投资者可以了解公司的盈利水平和和业绩相对强弱。对于同行业的公司,较高的净利润可能意味着公司的竞争力较强。
    负债与资产比率

    负债与资产比率用于衡量公司的资本结构和债务风险水平。该比率反映了公司负债占总资产的比例(财务杠杆),可以了解公司负债情况以及对负债承受能力的评估。

    负债与资产比率的计算公式为:负债与资产比率 = 总负债 / 总资产。
    总负债是指公司在特定时点上的所有债务总额,包括长期负债和短期负债。总资产是指公司在特定时点上的全部资产,包括流动资产和固定资产。

    负债与资产比率指标的应用主要包括以下几个方面:

    • 资本结构评估:通过负债与资产比率,投资者可以评估公司的资本结构,了解公司通过负债融资来支持业务运营和发展的程度。
    • 债务风险评估:负债与资产比率可以帮助投资者评估公司的债务风险水平。
    • 行业比较:通过比较同行业内不同公司的负债与资产比率,投资者可以了解公司在行业内的相对债务水平。

    选股策略

    选股的原因

    在经济学的有效市场理论模型中,根据有效性可以将当前证券市场分为四种类型:

    • 无效市场。当前价格未反应历史价格信息,那么未来的价格将进一步对过去的价格做出反应。
    • 弱有效市场。通过技术分析的交易已经无法获取利润,而基本面分析还可以获取利润。
    • 半强有效市场。基本面全部失效,此时通过内幕消息可以获得利润。
    • 强有效市场。价格已经充分反应所有信息,此时只能采取保守策略。

    以上几种类型是为了研究而构建出的理想模型,在现实中未必全部对应,但市场如果可以将历史价格信息、基本面和内幕消息反映到资产价格上,那么该市场就是有效的。

    效用函数

    为了简化问题,假设我们每个人都有自己的效用函数,它的输入是预备投入的金额,输出是可以带来多少效用。效用简单来说就是产出的金额,其具有两个性质:

    • 如果 x < y,那么 u(x) <= u(y),即产出的金额越多越好。
    • 如果 d >= 0,并且 x < y,那么 u(x+d)−u(x) >= u(y+d)−u(y)。即输入相同的金额,但本金较少的那个人效用最大。

    那也就是说如果某一个人的效用函数为 u,面对 n 中选项,这些选项的结果为 $X_1, X_2 … X_n$,那么这个人会选择的就是 E[u(X)] 最大的那个选项。

    现代资产配置理论模型

    现代资产配置理论模型(Modern Portfolio Theory, MPT)模型核心思想是以最小化标准差并最大化预期收益为目标进行资产配置,也被称为均值-方差分析。

    假设和模型

    假设市场中存在 n 个不同的资产,对于某个资产 i,使用 $r_i$ 表示该资产的收益率的随机变量,$E[r_i]$ 表示预期收益率,$\sigma_i$ 表示 $r_i$ 的标准差。

    市场中所有收益率没有不确定的资产称无风险资产,并且所有无风险资产的收益率都是一致的,称为无风险利率 $r_f$ 。

    风险资产配置(risky portfilio, P)是由风险资产 i=1,2 ... n 按照权重比例组成,每个资产 i 在 P 中的权重是 $\omega_i$,所有权重满足 $sum_{i-1}^n \omega_i = 1$。
    根据单个资产的收益率,可以计算资产配置的收益变量,资产组合收益率的随机变量 $r_p = sum_{i=1}^n \omega_i r_i$,其预期收益为:
    $$E[r_p] = E[sum_{i=1}^n \omega_i r_i] = sum_{i=1}^n \omega_i E[r_i]$$
    方差为:
    $$Var(r_p) = E[r_p - E[r_p]] = sum_{i=1}^n sum_{j=1}^n \omega_i \omega_j Cov(r_i, r_j) $$

    有效前沿

    对于任意一个预期收益值 $\mu$,均可以找到一个由配置权重 $\omega = (\omega_1, \omega_2, …, \omega_n)$ 定义的风险资产配置 $P$,其预期收益率为 $\mu$,并且在所有可以配置出预期收益率为 $\mu$ 的资产组合中,$P$ 的方差是最小的。最优化问题的目标函数如下:
    $$ Min \quad Var(r_p) = E[r_p - E[r_p]] = sum_{i=1}^n sum_{j=1}^n \omega_i \omega_j Cov(r_i, r_j) $$
    $$ 满足 \quad E[r_p] = E[sum_{i=1}^n \omega_i r_i] = sum_{i=1}^n \omega_i E[r_i] = \mu, sum_{i=1}^n \omega_i = 1 $$

    上面的问题可以使用 Lagrange 乘子的方法解决,对于每一个值 $\mu$,会得到一个风险资产配置 $P$,满足 $E[r_p] = \mu$,并且 $\delta_p$ 是最小的。
    将上述结果输出,则可以在标准差-预期的坐标上可以一条线,该线被称为有效前沿(efficient frontier),由于其形状类似子弹也被称为马科维兹子弹(Markowitz bullet)。
    有效前沿存在一个波动率最小的位置 A,并且该点以上的位置才是真正有效的,其含义是在固定风险的前期下选择最大的预期收益。

    Snipaste_2024-02-26_11-56-51

    夏普比率

    有效前沿的左侧区域是通过风险资产无法配置的,但如果在资产配置中加入无风险资产则可以获取到左侧的某些位置。
    选择有效前沿上的某个资产配置 P,并选择比例 $\alpha > 0$,将本金的 $\alpha$ 配置于 P,将 $1-\alpha$ 配置于无风险资产。

    • $\alpha <= 1$,则 $1-\alpha >= 0$,也就是将 $1-\alpha$ 倍的本金购买无风险资产,以此获得无风险利率。
    • $\alpha >= 1$,则 $1-\alpha <= 0$,也就是贷款本金 $\alpha-1$ 倍的资金支付无风险利率,并用贷款和本金一起配置 P。

    以 $\alpha$ 为系数,使用无风险资产和资产组合 P,可以配置出一个投资组合,那么其收益随机变量为 $r_\alpha$,计算可得:
    $$ E[r_\alpha] = E[\alpha r_p + (1-\alpha) r_f] = E[\alpha r_p] + (1-\alpha)r_f $$
    $$ \sigma_\alpha = {\sqrt {Var(\alpha r_p + (1-\alpha) r_f)}} = \sigma \alpha_p $$

    以上投资组合在期望收益率-标准差曲线上表现为一条经过有效边界上一点的射线,该线被称为资本配置线(Capital Allocation Line, CAL),该线上的每个点都表示一个风险资产和无风险资产的投资组合。

    Snipaste_2024-02-27_17-49-49

    CAL 的斜率 $ Sharpe(P) = {\frac {E[r_p] - r_f} {\alpha_p}} $,该比率被称为报酬-波动性比率(reward-to-variability ratio),又被称为夏普比率。

    资本市场线

    用市场信息计算得来的有效前沿上必定有一个夏普比率最高的点 M,称其为市场组合;穿过 M 的资产配置线 CAL(M) 称为资本市场线(capital market line)。资本市场线的意义在于固定标准差,那么市场上预期收益最高的投资组合就在该线上;或者固定预期收益,那么标准差最低的投资组合就在该线上。因此资本市场线可以通俗理解为最佳配置线。

    资本资产定价模型

    资本资产定价模型(Capital Asset Pricing Model, CAPM)是建立在 MPT 之上,其用简单的数学公式表达资产的收益率与风险系数 $\beta$ 以及系统性风险之间的关系。

    假设和模型

    CAPM 假设市场上所有的投资者均对于风险和收益的评估仅限于对于收益变量的预期值和标准值的分析。并且市场是完全公开的,对于任何投资者信息和机会完全均等,任何投资者均可以以唯一的无风险利率无限制地贷款或借出。

    为了最大化预期收益并最小化标准差,所有的投资者均选择资本市场线上的某一个点作为资产配置,即所有投资者都按一定比例持有现金和市场组合 M。因此市场组合的波动性和不确定性不单单是组合的风险,而是整个市场的风险,其被称为系统性风险。

    公式

    CAPM 公式表达的是任意风险资产的收益率与市场组合的收益率之间的关系,在该公式中任何风险资产的收益率都可以被分为两部分:无风险收益和风险收益 $\beta$。

    $$ E[r_S] = r_f + \beta_S(E[r_M] - r_f) $$
    $r_S$ 表示 S 的收益变量,$r_M$ 表示市场组合的收益变量,$r_f$ 表示市场的无风险利率,$\beta_S = {\frac {Cov(r_S, r_M)} {Var(r_M)}}$ 表示组合 S 对于市场风险的敏感度。
    $E[r_M] - r_f$ 是市场组合的风险收益,$\beta_S(E[r_M] - r_f)$ 是资产组合 S 的风险收益,因此可以理解为资产组合 S 承担 $\sigma_S$ 倍的市场风险,其将会承担相应倍数的风险补偿。

    通过 CAPM 公式可以得到资产组合 S 的夏普比率与市场组合 M 的夏普比率之间的关系:
    $$ Sharpe(S) = Corr(r_S, r_M) Sharpe(M) $$
    从公式可以得出 S 与 M 的相关性越高,则 S 的夏普比率越高,相应的风险与收益的比值也就越大。

    风险组合 S 的预期收益与 $\beta_S$ 有关,而与其自身风险 $\sigma_S$ 无关。

    应用

    在现实环境中,可以将一个概括市场整体的组合(比如大盘指数)作为市场组合,并以其为基准计算每个风险资产的系统性风险 $\beta$,这样就可以根据对市场整体趋势的判断以及对需要的风险进行控制,进而选择合适的 $\beta$ 进行资产配置。

    套利定价理论

    套利定价理论 APT 可以理解为 CAPM 的一个推广,由 APT 给出的定价模型是将收益归因到不同的因子之上,而 CAPM 仅把收益归咎于市场变化着一个因子。

    APT 模型认为在现有市场中,套利行为是市场价格均衡形成的一个决定因素,如果市场价格未达到均衡状态时,则会存在无风险套利机会,而套利行为会使得市场价格回归均衡状态。
    APT 模型使用多个因素来解释风险资产的收益,并根据无套利原则,得出风险资产的收益与多个因素之间存在近似的线性关系,也就是说资产的预期收益率与一组影响他们的系统性因素的预期收益率是线性相关的,即影响资产收益率的因素从 CAPM 的单一因素拓展到多个因素。多因子模型(Multiple-Factor Model, MFM)正是基于 APT 模型的思想发展而来的完整风险模型。
    多因子模型定量刻画了资产收益率与每个因子之间的线性关系,数学表达式如下:
    $$ \bar r_j = sum_{k=1}^K X_{jk} * \bar f_k + \bar u_j $$

    $ \bar X_{jk}$ 表示资产 j 在因子 k 上的载荷;$ \bar f_k$ 表示因子 k 的收益;$\bar u_j$ 表示资产 j 的残差收益。

    多因子模型

    多因子模型是一个用于选择投资组合的策略,其通过多个与预期收益相关的因子来选择投资组合,而因子可以通过历史数据计算来预测未来的收益表现,以期望达到全面、稳定的预测。
    多因子模型常见的三类因子如下:

    • 基本面因子:包括市盈率 PE、市净率 PB、营业收入增长率、估值、营业收入、净利润、负债等。
    • 技术分析因子:包括动量 Momentum、波动率 Volatility、换手率、量比等。
    • 宏观经济因子:包括利率、通货膨胀率、GDP 增长、工业增加值、CPI、利率、M1、M2等。
    多因子选股实践

    在实现多因子选股模型时,需要进行以下步骤:

    • 确定目标和约束条件。
    • 选择因子并计算。
    • 异常值处理。
    • 因子标准化。
    • 确定因子权重。
    • 构建多因子模型。
    • 资产筛选和组合优化。
    • 回测和调整。

    代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import pandas as pd
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LinearRegression
    from sklearn.model_selection import train_test_split

    # 读取和准备数据
    df = pd.read_csv('stock_data.csv')
    X = df[['PE', 'PB', 'ROE']] # 特征因子
    y = df['Returns'] # 目标变量

    # 拆分训练数据和测试数据
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # 标准化处理
    scaler = StandardScaler()
    X_train = scaler.fit_transform(X_train)
    X_test = scaler.transform(X_test)

    # 构建线性回归模型
    model = LinearRegression()
    model.fit(X_train, y_train)

    # 查看模型系数,确定因子权重
    print('Factor weights:', model.coef_)

    # 使用模型预测测试数据的收益
    y_pred = model.predict(X_test)

    # 创建一个 DataFrame 来保存资产的预测收益
    predicted_returns = pd.DataFrame({'Stock': X_test.index, 'Predicted return': y_pred})

    # 根据预测收益选择资产
    selected_stocks = predicted_returns[predicted_returns['Predicted return'] > 0.1]
    print('Selected stocks:', selected_stocks)

    以上示例实现了一个线性回归的多因子模型,通过 PE、PB、ROE 三个因子来预测资产收益,利用模型系数作为因子权重,采用线性回归作为预测模型,但在实际情况下,可以根据需求调整和改进更多因子,同时使用更复杂的模型,例如神经网络、随机森林等,或者使用更复杂的特征工程技术,例如 PCA、特征选择等。另外该模型未进行任何形式的模型验证,例如交叉验证、超参数调优等,可进一步针对优化。


    择时策略

    量化择时策略即采用数量化分析方法,利用单个或多个技术指标的组合,来对交易标的资产或资产指数进行低买高卖的操作,期望获得超越简单买入持有策略的收益风险表现。

    量化择时策略的核心是客观型技术分析。客观型技术分析,是指其分析过程中所用到的分析方法,具有 100% 客观的定义标准,不包含任何主观定义的部分。

    常用策略方法:

    • 趋势择时。趋势择时的基本思想来自于技术分析,技术分析认为趋势存在延续性,主要指标有 MA、MACD、DMA 等。
    • Hurst 指数。
    • SWARCH 模型。该模型主要刻画了货币供应量 M2 和大盘走势之间的关系,揭示证券市场指数变化与货币供应量之间的相关关系。
    • 异常指标择时。异常指标择时主要处理一些特殊情况下的择时,主要有:市场噪声、行业集中度和兴登堡凶兆3个策略。
    • 市场情绪择时。
    • SVM 分类。SVM 择时是利用 SVM 技术进行大盘趋势的模式识别,将大盘区分为几个明显的模式,从而找出其中的特征,然后利用历史数据学习的模型来预测未来的趋势。
    • 有效资金模型。有效资金是指市场上能对趋势产生影响的资金流,同样的资金量,在趋势顶部和底部的时候,对市场的影响是不一样的。
    • 牛熊线。

    双均线择时策略

    策略原理:使用两根均线,一根长周期均线,一根短周期均线。当短期均线从下往上穿越长周期均线的时候,买入;当短期均线从上往下穿越长周期均线的时候,卖出。均线八大法则也是一种双均线策略,其短周期均线为M1(当日收盘价)。
    均线根据不同周期有以下分类:

    • 短期均线:5、7、10 用于预测短期走势,MA5 和 MA10 又称为短期监测线。
    • 中期均线:20、30、60 用于预测中期走势,MA20 和 MA30 又称为警戒线,MA60 则称之为生死线。
    • 长期均线:120、250 用于长期走势,MA120 又称为确认线,MA250 则通常被看做反转线,也称为牛熊分界线。

    策略缺陷:

    • 滞后性:均线归根到底是一种平均值,在应用中存在的最大问题就是滞后性。当出现买入卖出信号时,最佳时机早已过去。
    • 长短周期难以选择:如果两根均线的周期接近可能会造成很大的亏损,因此两个参数选择的很重要,趋势性越强的品种,均线策略越有效。

    策略优化尝试方向:

    • 使用加权移动平均值:均线策略的一大缺陷是指标具有滞后性,因此可以使用加权移动平均值代替移动平均值。计算时将短期(如昨天)的权重增大,以加强指标的敏感性。
    • 不局限于收盘价:可以尝试将最高价、最低价等加入到加权移动平均值的计算中。
    • 自适应调整均线周期:价格走势进入单边上涨趋势,自适应均线自动缩短周期,采用短期均线,转为向上移动;市场走势进入横盘震荡,自适应均线自动延长周期,采用长期均线,转为横向移动。

    代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt

    # 获取资产数据,选取最近日期的 500 条数据
    df = pd.read_csv('000001.csv', header=None)
    df = df[-500:]

    # 计算短期均线和长期均线
    df['MA5'] = df['close'].rolling(window=5).mean()
    df['MA20'] = df['close'].rolling(window=20).mean()
    df['MA60'] = df['close'].rolling(window=60).mean()

    # 图表展示
    plt.figure(figsize=(18,8))
    plt.plot(df['MA5'], label='MA5')
    plt.plot(df['MA20'], label='MA20')
    plt.plot(df['MA60'], label='MA60')
    plt.legend()
    plt.show()

    Snipaste_2024-02-02_11-31-48.png

    MACD 均线择时策略

    异同移动平均线(Moving Average Convergence and Divergence, MACD)是由指数均线演变而来,通过对资产的收盘价进行平滑处理,生成两线一柱,其中两线为快速线(Difference Line, DIF)和慢速线(Signal Line, DEA),一柱是 MACD。

    MACD 指标是 DIF 与 DEA 之间的差,其可以反映出最近价格走势的强弱变化和能量,把握准确的买卖点。

    指标计算公式:

    • 短期 EMA :短期(如 12 天)的收盘价指数移动平均值,一般采用 EMA(price, 12)。
    • 长期 EMA :长期(如 26 天)的收盘价指数移动平均值,一般采用 EMA(price, 26)。
    • DIF :短期 EMA 与长期 EMA 的差值,即 DIF = EMA(price, 12) - EMA(price, 26)。
    • DEA :DIF 的多日指数移动平均值,即 DEA=EMA(DIF, 9)。
    • MACD :DIF 与 DEA 线的差值,即 MACD = DIF - DEA。

    代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import numpy as np
    import pandas as pd
    import talib as ta
    import matplotlib.pyplot as plt

    # 使用最近 500 天的收盘价数据
    data = pd.read_csv('000001.csv', header=None)
    data = data[-500:]

    # 用 talib 库中的相应函数计算 MACD 指标
    dif, dea, macd = ta.MACD(data['close'])

    # 图表展示
    plt.figure(figsize=(18,8))
    plt.plot(dif)
    plt.plot(dea)
    plt.bar(macd.index, macd.values)
    plt.legend(["dif", "bea", "macd"], loc="upper left")
    plt.show()

    Snipaste_2024-02-02_14-17-18.png


    调仓策略

    最优化计算仓位

    之前根据多因子模型和择时策略对资产进行未来收益的预测;在多因子模型中根据同一个时间截面上不同因子的指标,通过线性、非线性的方法将多个因子综合成多因子作为资产未来收益率高低的预测值;在择时策略中,通过计算资产的离散时序信号连续化,连续信号的差异化使得各个资产的择时信号能够进行比较。至此可能就会发现上述预测并没有说明购买风险资产的数量,即如何分配资金。

    常用符号约定如下:

    • N:资产数量
    • $\omega$:权重向量
    • $\omega_i$:资产 i 的权重
    • $\mu$:预期收益率
    • $\sigma$:波动率
    • $\sigma_i$:资产 i 的波动率
    • $\sigma_{ij}$:资产 i 与资产 j 之间的协方差
    • $\Sigma$:方差协方差矩阵
    • $\sigma_p$:组合波动率
    • $\mu_p$:组合收益率
    • $\lambda$:风险厌恶系数
    • $r_f$:无风险收益率
    等权重

    顾名思义即在没有任何信息的情况下,等权重是最简单的方法,即每个资产都赋予相同的价值。$$ \omega_i = {\frac {1} {N}} $$

    市值加权

    在没有任何信息的情况下,另外的一种方法就是根据市值进行加权。
    $$ \omega_i = Cap_i / sum_i{Cap_i}$$
    $ Cap_i $ 为资产 i 的市值。
    市值加权会给与过高估值的资产更多权重,因此在某些情况下并不占优。

    最小方差组合

    前两种方法都是没有任何信息时才使用,而在实际中可以通过历史收益率的方差来作为代理变量,追求组合整体的方差最小,其数学表达式为:
    $$ Min \quad \sigma_p = \omega^` \Sigma_w $$

    最大分散度

    从组合的方差-协方差矩阵中可知,组合中的一部分风险来源于各个资产的方差,而另外一部分风险来源于资产之间的协方差,因此想要降低风险就要分散投资,其数学表达式为:
    $$ Max \quad D(\omega) = {\frac {\omega^` \sigma} {\sqrt {\omega^` \Sigma_w} }} $$

    目标函数被称为分散比率,其分母为组合波动率,分子为成分波动率加权平均。即可以最大化资产线性加权波动率与投资组合波动率的比值,因此称为最大分散化资产配置组合。

    风险平价

    风险平价是从风险的角度出发,追求所有对组合的风险贡献一致。首先定义边界风险,即每增加 1 单位资产的权重 $\omega_i$ 所引起的组合整体风险变化:
    $$
    \begin{equation}
    \begin{split}
    MRC_i &= {\frac {\delta \sigma_p} {\delta \omega_i}} = {\frac {\omega_i \sigma_i^2 + sum_{j!=i} \omega_j \rho_{ij} \sigma_i \sigma_j} {\sigma_p}} \\
    &= \frac {sum_{j-1}^N \omega_j \rho_{ij} \sigma_i \sigma_j} {\sigma_p} \\
    &= \frac {\rho_{ip} \sigma_i \sigma_p} {\sigma_p} \\
    &= (\frac {\rho_{ip} \sigma_i} {\sigma_p}) * \sigma_p \\
    &= \beta_i \sigma_p
    \end{split}
    \nonumber
    \end{equation}
    $$

    其中 $\beta_i$ 表示资产 i 收益率对于投资组合收益率的 $\beta$ 系数,在定义过边界风险后,根据其权重就可以得到风险贡献:
    $$ RC_i = \omega_i * MRC_i = \omega_i {\frac {\delta \sigma_p} {\delta \omega_i}} $$

    因此风险平价组合的目标函数为:
    $$ Min \quad sum_{i-1}^N sum_{j-1}^N \quad (RC_i - RC_j)^2 $$

    资产的权重与其相对于组合的 $\beta$ 成反比,即 $\beta$ 越高,其权重越低,由此有效地降低风险,每个资产对组合的边界风险贡献相同。

    均值方差优化

    上面说的最小方差、最大分散度、风险平价都是从风险的角度出发的优化方法,而均值方差优化则是在从收益最大化方面出发,实现收益最大化或特定收益风险最小化。即均值方差优化,其目标函数如下:
    $$ Max \quad \omega^T \mu - {\frac {\lambda} {2}} \omega^` \Sigma_\omega $$

    从理论上讲,组合成分间存在无数种可能性,而每种可能性都会有风险收益对,而将多有的结果集合在一起就会形成一个可行域。可行域中的每个结果并非都是好结果,只有在侧边缘的值才是最优解,即 MOV 的解。
    其中 A ~ D 之间连线,这条线被称为有效前沿,任何异于有效前沿上的点,均能找到相同风险下收益率更高的组合。

    自无风险收益率起做一条切线,其与有效前沿相切于 B 点,该点即所有可行域中夏普比率最大的点,也被称为最大夏普组合,即最大化组合夏普比率目标函数如下:
    $$ Max \quad {\frac {\omega^` \mu} {\sqrt{\omega^` \Sigma_\omega}}} $$

    相比之前的各种优化方法,均值方差优化引入了较多的参数,尤其是预期收益率的估计,因此优化结果对于参数会非常敏感,体现就是权重在时序上波动较大,容易出现极端值。其后续优化可以参考 Black-Litterman 模型。

    常见约束
    • 单资产权重的范围限制
    • 做空限制
    • 行业中性化
    • 风险敞口限制

    资本资产定价模型

    资本资产定价模型(Capital Asset Pricing Model, CAPM)是在 MPT 基础上发展而来,其表述的是任何一种风险资产的收益率相对于市场组合收益率之间的关系:
    $$ E(r_s) = r_f + \beta_s(E(r_M) - r_f) $$
    $r_s$ 表示的是某种风险资产的收益;$r_f$ 表示为无风险资产收益;$r_M$ 表示市场组合收益率;$\beta_s$ 表示该风险资产相对于市场的敏感度,其反映该风险资产随着市场组合收益变动的关联性大小。
    $$ \beta_s = {\frac {cov(r_s, r_M)} {var(r_M)}} = {\frac {sum_{i-1}^N w_i cov(r_s, r_i)} {sum_{i-1}^N sum_{j-1}^N w_i w_j cov(r_i, r_j)}} $$
    在牛市期间,如果买入 $\beta_s > 1$ 的资产,可以获得比市场平均收益更多;在熊市期间,如果持有 $\beta_s < 1$ 的资产则可以避免损失,甚至可以获取收益。
    综上所述资本资产定价模型的本质就是如果想获得更多的收益,那就必须承担更多的风险。风险与机遇并存。


    量化回测

    量化回测主要用于评估策略在真实市场环境下的好坏,需要从收益、稳定性、胜率、风险等方面来综合评估策略,常见的指标可以看净值变化、波动率、最大回撤、夏普比率等。

    回测评估指标

    数据准备

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import pandas as pd
    import matplotlib.pyplot as plt

    # 读取中国平安000001、贵州茅台600519、沪深300 000300 数据
    data1 = pd.read_csv('./000001.csv', index_col=0, header=None)
    data2 = pd.read_csv('./600519.csv', index_col=0, header=None)
    data3 = pd.read_csv('./000300.csv', index_col=0, header=None)

    # 取最近 500 天的日交易数据
    data1_close = data1[2][-500:]
    data2_close = data2[2][-500:]
    data3_close = data3[2][-500:]

    # 取当日的收盘价整合为待处理数据
    df = pd.DataFrame()
    df['000001'] = data1_close
    df['600519'] = data2_close
    df['000300'] = data3_close
    净值曲线

    净值曲线是一组时间序列曲线,其含义表示为资产或基金在不同时间的价值对比最初价值的倍数。

    1
    2
    3
    4
    5
    6
    # 以 500 天的收盘价作为基准,计算净值并绘制曲线
    df_worth = df / df.iloc[0]
    df_worth.plot(figsize=(15,6))
    plt.title('Trend of stock value', fontsize=10)
    plt.xticks(df.index, fontsize=10)
    plt.show()

    Snipaste_2024-02-22_20-37-08

    年化收益率

    累计收益率计算公式如下:
    $$ R_t = {\frac {P_T - P_t} {P_t}} $$
    $P_T$ 表示期末的价格,$P_t$ 表示期初的价格。
    年化收益率其最直观的理解就是每年的收益是多少。年化收益率计算公式如下:
    $$ R_p = (1 + R)^{\frac {m} {n}} - 1$$
    $R$ 表示期间总收益率,m, n 表示相对应的计算周期,m 使用 252, 52, 12 分别表示日、周、年的转换,n 表示期间自然日天数。

    1
    2
    3
    4
    5
    6
    7
    # 区间累积收益率
    total_return = df_worth.iloc[-1]-1
    total_return = pd.DataFrame(total_return.values, columns=['累计收益率'], index=total_return.index)
    total_return
    # 年化收益率
    annual_return = pd.DataFrame((1 + total_return.values) ** (252 / 1826) - 1, columns=['年化收益率'], index=total_return.index)
    annual_return

    Snipaste_2024-02-22_20-37-21
    Snipaste_2024-02-22_20-37-32

    波动率

    波动率是对收益变动的衡量,其本质是风险,用于衡量收益率的不确定性。
    年波动率计算公式如下:
    $$ V = {\sqrt{ {\frac {252} {n-1}} sum_{i=1}^n (r_p - {\bar {r_p} })^2 }} $$
    $r_p$ 表示每日收益率,${\bar {r_p} }$ 表示每日收益率的平均值,$n$ 表示策略执行的天数。

    1
    2
    3
    4
    5
    6
    # 波动率
    df_return = df / df.shift(1) - 1
    df_return = ((df_return.iloc[1:] - df_return.mean()) ** 2)

    volatility = pd.DataFrame(np.sqrt(df_return.sum() * 252 / (1826-1)), columns=['波动率'], index=total_return.index)
    volatility

    Snipaste_2024-02-22_20-37-41

    最大回撤

    表示在选定的某一周期往后推,在最低点时的收益率回撤的最大幅度。其主要用于描述最坏的情况,是量化中最重要的指标。
    最大回撤计算公式如下:
    $$ MaxDD = {\frac {max(P_i, P_j)} {P_i}} $$
    $P$ 为某一天资产的净值,$P_i, P_j$ 分别表示当天和明天的净值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 最大回撤
    def max_drawdown_cal(df):
    md = ((df.cummax() - df) / df.cummax()).max()
    return round(md, 4)

    max_drawdown = {}
    max_drawdown['000001'] = max_drawdown_cal(df['000001'])
    max_drawdown['600519'] = max_drawdown_cal(df['600519'])
    max_drawdown['000300'] = max_drawdown_cal(df['000300'])

    max_drawdown = pd.DataFrame(max_drawdown, index=['最大回撤']).T
    max_drawdown

    Snipaste_2024-02-22_20-37-53

    Alpha 系数和 Beta 系数

    Alpha 系数是指投资中的非系统性风险,可获得与市场无关的回报,而 Beta 系数则是指投资中的系统性风险。
    使用资本资产定价模型来评估策略的 Alpha 和 Beta 系数:
    $$ E(r_i) = r_f + \beta(E(r_m) - r_f) $$
    $E(r_i)$ 表示投资组合的预期收益;$r_f$ 表示无风险利率;$r_m$ 表示市场指数利率;$\beta$ 表示波动风险与投资中的系统性风险;

    因此 CAPM 的计量模型可以表示为:
    $$ r_i = \alpha + \beta r_m + \epsilon_\alpha $$
    $\epsilon_\alpha$ 表示随机扰动,可以理解其为个体风险。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # alpha 和 beta 系数
    from scipy import stats

    # 计算每日收益率 收盘价缺失值(停牌),使用前值代替
    rets=(df.iloc[:, :3].fillna(method='pad')).apply(lambda x:x/x.shift(1)-1)[1:]

    # # 市场指数为x,个股收益率为y
    x = rets.iloc[:,1].values
    y = rets.iloc[:,:3].values
    capm = pd.DataFrame()
    alpha = []
    beta = []
    for i in range(3):
    b, a, r_value, p_value, std_err = stats.linregress(x, y[:,i])
    # alpha 转化为年化
    alpha.append(round(a*250, 3))
    beta.append(round(b, 3))

    capm['alpha'] = alpha
    capm['beta'] = beta
    capm.index = rets.columns[:3]
    capm

    Snipaste_2024-02-22_20-38-06

    夏普比率

    夏普比率是指在承担多一重风险时,可获得的超额回报。该比率是在资本资产定价模型中通过转换而得来。
    夏普比率计算公式如下:
    $$ SharpRatio = {\frac {R_p - R_f} {\delta_p}} $$
    $R_p$ 表示策略的年化收益率,$R_f$ 表示无风险收益率,$\delta_p$ 表示年化标准差。

    1
    2
    3
    4
    5
    6
    7
    8
    # 夏普比率
    # 超额收益率以无风险收益率为基准,假设无风险收益率为年化 3%
    ex_return=rets - 0.03/250

    # 计算夏普比率
    sharpe_ratio = np.sqrt(len(ex_return)) * ex_return.mean() / ex_return.std()
    sharpe_ratio = pd.DataFrame(sharpe_ratio, columns=['夏普比率'])
    sharpe_ratio

    Snipaste_2024-02-22_20-38-16

    信息比率

    信息比率与夏普比率类似,不过其参照的是策略的市场基准收益率。
    $$ SharpRatio = {\frac {R_p - R_f} {\delta_t}} $$
    $R_p$ 表示策略的年化收益率,$R_f$ 表示无风险收益率,$\delta_t$ 表示策略与每日基准收益率差值的年化标准差。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 信息比率(参考的是市场基准收益率)
    ex_return = pd.DataFrame()
    ex_return['000001'] = rets.iloc[:,0] - rets.iloc[:,2]
    ex_return['600519'] = rets.iloc[:,1] - rets.iloc[:,2]

    # 计算信息比率
    information_ratio = np.sqrt(len(ex_return)) * ex_return.mean() / ex_return.std()
    # 信息比率的输出结果
    information_ratio = pd.DataFrame(information_ratio, columns=['信息比率'])
    information_ratio

    Snipaste_2024-02-22_20-38-25


    引用

    WhaleQuant
    ta-lib


    个人备注

    此博客内容均为作者学习所做笔记,侵删!
    若转作其他用途,请注明来源!



沪ICP备19023445号-2号
友情链接