低频量化策略大揭秘:如何通过动量和均线因子打造盈利模型

772 阅读11分钟

低频量化策略大揭秘:如何通过动量和均线因子打造盈利模型

image.png

低频量化策略为什么要聊动量和均线

你是不是也在想,为什么这么多量化投资策略都离不开“动量”和“均线”这两个词?如果你对这些因子有些迷茫,或者对它们的实际应用不太理解,不用担心,今天咱们就来深入探讨这两个低频量化策略的核心因子。

动量和均线是量化策略中最基础的因子,它们不仅简单直观,而且各自都有独特的优势。在实际的股市投资中,尤其是低频量化策略中,它们可以帮助我们抓住市场的主要趋势,进而做出科学的买入或卖出决策。

一、动量因子:顺势而为,掌握趋势的节奏

动量因子,简单来说就是用来衡量一段时间内价格变动的幅度。换句话说,它告诉你,某个股票有没有可能继续涨下去。如果你是个追涨型的投资者,动量因子肯定是你投资策略里重要的一环。

动量因子的计算

假设我们要计算一个简单的动量因子——momentum_10,它代表的是当前价格与10个交易日前价格的差值。就是看看最近10天的涨跌幅,假如涨得多,那很可能未来还会涨。

import pandas as pd

# 假设df是包含股票数据的DataFrame,其中'close'为收盘价
df['momentum_10'] = df['close'] / df['close'].shift(10) - 1

你看,动量的核心逻辑很简单:价格有惯性,涨得多的股票往往还会继续涨

常见的动量因子
  • momentum_10:最近10日的收益率。
  • momentum_20:最近20日的收益率。
  • momentum_diff:10日与30日收益差。
df['momentum_20'] = df['close'] / df['close'].shift(20) - 1
df['momentum_30'] = df['close'] / df['close'].shift(30) - 1
df['momentum_diff'] = df['momentum_10'] - df['momentum_30'] 
动量因子的优缺点

优点:

  • 动量因子能捕捉到市场中的主升段趋势,选股非常直观,信号也比较明确。
  • 对于抓住那些暴涨的股票,动量因子有着天然的优势。

缺点:

  • 在震荡市场中容易误判。你知道的,市场总有点“波动”,动量因子就容易“高买低卖”,这需要有很强的风控措施来配合。

二、均线因子:趋势一旦形成,通常会延续

你可能会想:“那动量不行的时候,怎么办?”嘿嘿,没问题!这就有了均线因子。均线的作用其实就是把价格数据平滑一下,让你更清晰地看到市场的趋势。

均线因子的计算

我们最常见的均线因子是ma10,就是过去10个交易日的收盘价的平均值。然后,你还可以通过定义均线的偏离度,来看到股价与均线之间的关系。

df['ma10'] = df['close'].rolling(window=10).mean()
df['ma5'] = df['close'].rolling(window=5).mean()

均线因子的核心逻辑就是:趋势一旦形成,通常会延续。如果价格在均线之上,就意味着多头占优,市场可能会继续上涨。

常见的均线因子
  • price > ma10:看看当前价格是不是高于10日均线。
  • ma5 > ma10:短期均线上穿中期均线,这个叫做“金叉”,是一个典型的买入信号。
  • ma_slope:均线的斜率,表示趋势的强弱。
df['price_above_ma10'] = df['close'] > df['ma10']
df['ma5_above_ma10'] = df['ma5'] > df['ma10']
df['ma_slope'] = df['ma10'].diff()
均线因子的优缺点

优点:

  • 均线因子能够很好地抗噪声,信号也比较稳定,特别适合趋势行情中的“确认型入场”。
  • 如果市场已经有了明显的上涨或下跌,均线能给你提供比较稳健的入场点。

缺点:

  • 均线滞后,意味着你可能会错过行情的初期。
  • 如果单独使用,选股效果有限,一般需要搭配动量等因子一起使用。

三、动量 vs 均线:对比分析,选择你适合的

你可能会问:“动量因子和均线因子到底有啥区别,哪一个更适合我?”嗯,这个问题,得根据你的交易风格和风险偏好来选择。

逻辑核心
  • 动量:趋势延续,适合快速反应。
  • 均线:趋势确认,适合稳步跟随。
入场时机
  • 动量:早!动量因子能帮你捕捉到趋势的早期,适合那些喜欢快速进场的投资者。
  • 均线:稍晚!因为均线确认了趋势之后才发力,所以入场会稍微迟一些。
风险偏好
  • 动量:如果你偏激进,喜欢追涨,动量因子更合适。
  • 均线:如果你稳健一些,注重趋势确认,那均线因子就是你的朋友。
适用行情
  • 动量:适合单边强趋势市场,短期波动大时,动量因子表现更好。
  • 均线:适合市场平缓上升的趋势,波动较小。
信号波动性
  • 动量:灵敏,信号波动性大,容易出现假信号。
  • 均线:平滑,滞后但稳健,适合更为稳定的趋势确认。

四、因子融合:动量和均线的完美组合

很多优秀的策略都会将动量因子和均线因子结合起来,发挥它们各自的优势。比如,你可以给每个因子加权,构建一个综合得分:

df['score'] = 0.6 * df['momentum_20'] + 0.4 * (df['close'] / df['ma10'] - 1)

通过这种加权方式,我们既考虑了市场的短期动量,又确认了趋势的稳定性。这样一来,策略不仅能更好地抓住上涨行情,还能控制风险。


五、回测与策略优化:如何验证我们的因子策略

很多量化投资的初学者都会面临一个问题:“我有了动量因子和均线因子,那怎么验证它们的有效性呢?”这个问题其实很简单,回测就是解决方案!回测是量化策略的重要环节,它可以帮助我们验证策略在历史数据中的表现,找出潜在的优缺点。

回测不仅可以检验策略,还能帮助我们优化策略,看看哪个因子、哪些参数的组合会让我们的策略表现最好。

1. 从CSV读取行情文件

首先,我们需要从本地CSV文件读取数据,这样就能方便地进行策略回测了。假设我们有一个包含股票历史数据的CSV文件,文件里有日期、收盘价、开盘价、最高价、最低价、成交量等字段。

import pandas as pd

# 读取本地CSV文件
df = pd.read_csv('your_data.csv')

# 这里假设数据有一个列名叫'close',存放的是收盘价
# 如果数据中有日期列,转换成时间格式
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)

# 查看数据的前几行,确保数据加载正确
print(df.head())

这样,我们就可以利用读取的数据开始进行后续的策略回测了。

2. 构建简单的动量 + 均线策略

我们将结合动量因子和均线因子来构建一个简单的策略。例如,如果动量因子(如momentum_10)大于0,并且当前价格高于10日均线(close > ma10),我们就买入。

# 计算动量因子
df['momentum_10'] = df['close'] / df['close'].shift(10) - 1

# 计算10日均线
df['ma10'] = df['close'].rolling(window=10).mean()

# 创建买入信号:动量大于0且当前价格高于10日均线
df['buy_signal'] = (df['momentum_10'] > 0) & (df['close'] > df['ma10'])

# 创建卖出信号:动量小于0或者价格跌破10日均线
df['sell_signal'] = (df['momentum_10'] < 0) | (df['close'] < df['ma10'])

# 打印买卖信号
print(df[['close', 'momentum_10', 'ma10', 'buy_signal', 'sell_signal']].tail())
3. 回测框架搭建

回测就是验证策略是否有效。我们可以创建一个简单的回测框架,通过模拟买入、卖出,计算收益率等。

# 设定初始资金
initial_capital = 100000
capital = initial_capital
position = 0

# 记录每次交易后的资金变化
capital_history = []

# 模拟回测
for i in range(1, len(df)):
    # 如果有买入信号且没有持仓,买入
    if df['buy_signal'].iloc[i] and position == 0:
        position = capital // df['close'].iloc[i]  # 买入股票
        capital -= position * df['close'].iloc[i]  # 扣除资金
        capital_history.append(capital + position * df['close'].iloc[i])  # 记录资金变化
    
    # 如果有卖出信号且有持仓,卖出
    elif df['sell_signal'].iloc[i] and position > 0:
        capital += position * df['close'].iloc[i]  # 卖出股票,收回资金
        position = 0  # 清空持仓
        capital_history.append(capital)  # 记录资金变化

# 最后的资金总额
final_capital = capital + position * df['close'].iloc[-1]
print(f"回测结束,最终资金:{final_capital:.2f}")
4. 策略优化:尝试不同参数

在策略回测时,我们往往会遇到需要优化参数的情况。例如,我们可能想要尝试不同的均线窗口(如10日均线、20日均线等),或者不同的动量因子周期。这个过程就是策略优化。

在实践中,我们可以通过简单的循环或网格搜索来尝试不同参数的组合,找到最适合我们策略的参数。

# 策略优化:尝试不同的均线窗口和动量周期
best_capital = 0
best_params = None

for ma_window in [10, 20, 30]:  # 尝试不同的均线窗口
    for momentum_window in [10, 20, 30]:  # 尝试不同的动量周期
        # 计算新的动量因子
        df['momentum'] = df['close'] / df['close'].shift(momentum_window) - 1
        # 计算新的均线
        df['ma'] = df['close'].rolling(window=ma_window).mean()
        
        # 重新计算买卖信号
        df['buy_signal'] = (df['momentum'] > 0) & (df['close'] > df['ma'])
        df['sell_signal'] = (df['momentum'] < 0) | (df['close'] < df['ma'])
        
        # 回测
        capital = initial_capital
        position = 0
        capital_history = []
        
        for i in range(1, len(df)):
            if df['buy_signal'].iloc[i] and position == 0:
                position = capital // df['close'].iloc[i]
                capital -= position * df['close'].iloc[i]
                capital_history.append(capital + position * df['close'].iloc[i])
            elif df['sell_signal'].iloc[i] and position > 0:
                capital += position * df['close'].iloc[i]
                position = 0
                capital_history.append(capital)
        
        final_capital = capital + position * df['close'].iloc[-1]
        
        # 记录最优参数
        if final_capital > best_capital:
            best_capital = final_capital
            best_params = (ma_window, momentum_window)

print(f"最优参数:均线窗口 = {best_params[0]},动量周期 = {best_params[1]}")
print(f"回测结束,最优策略的最终资金:{best_capital:.2f}")
5. 总结优化结果

通过优化过程,你会发现不同的参数会对策略的回测结果产生不同的影响。这个过程也体现了量化策略中“不断调整、优化”的特性。量化投资就是通过不断的优化和调整,找到最适合自己风险偏好的策略。


六、进一步的完善与建议

  1. 多因子结合优化:不仅仅可以通过动量和均线,后期你还可以引入其他因子,如市盈率(PE)、波动率等,进行多因子组合优化。
  2. 数据集扩展:为了测试策略的有效性,可以尝试将数据集扩大,包括更多的股票和更长时间的历史数据,来验证策略的稳健性。
  3. 风险管理:策略中的风险控制部分可以进一步扩展,像是止损、止盈、仓位控制等,帮助提高策略的稳健性。
  4. 使用回测框架:如果你想要更专业的回测框架,可以尝试使用backtraderzipline等库,这些框架提供了更加灵活的功能,能支持多种复杂的策略和风险管理。

交易哲学:选择动量还是均线?

那么,问题来了:选择动量因子还是均线因子,得看你对趋势的理解。动量因子适合那些愿意冒点风险、追求快速收益的交易者,而均线因子则适合那些稳健型投资者,做趋势确认。

不过,作为一名成熟的量化投资者,你肯定会明白:最强的策略不是单一因子,而是多个因子融合后的智慧


结语

动量和均线是低频量化策略中的两个核心因子,搞清楚它们的逻辑,不仅能帮助你在市场中游刃有余,还能为你搭建因子组合提供思路。如果你深入理解了这两个因子,往后你就能轻松上手因子组合建模、风格融合策略等更复杂的量化技术。

好啦,今天的干货分享就到这里。希望你从中获得一些启发,去尝试自己的量化策略。如果你对量化交易有任何问题,欢迎随

时给我留言,我们一起交流成长!