Bootstrap

量化交易策略[附代码] #37

在这里插入图片描述
在这里插入图片描述

#37 Amihud illiquidity

import pandas as pd

def calculate_amihud_illiq(df):
    """
    计算每只股票和月份的Amihud非流动性因子。
    
    参数:
    df (pd.DataFrame): 包含'股票代码'、'日期'、'日收益率'、'日成交金额'列的DataFrame
    
    返回:
    pd.DataFrame: 包含'股票代码'、'月份'、'amihud_illiq'列的DataFrame
    """
    # 确保日期列为datetime格式
    df['日期'] = pd.to_datetime(df['日期'])
    
    # 提取月份和年份
    df['月份'] = df['日期'].dt.to_period('M')
    
    # 计算绝对日收益率与成交金额的比率
    df['比率'] = df['日收益率'].abs() / df['日成交金额']
    
    # 按股票和月份分组,计算平均比率
    illiq_df = df.groupby(['股票代码', '月份']).agg(
        amihud_illiq=('比率', 'mean'),
        交易天数=('比率', 'count')
    ).reset_index()
    
    # 过滤出交易天数不少于15天的月份
    illiq_df = illiq_df[illiq_df['交易天数'] >= 15]
    
    # 删除交易天数列,因为不再需要
    illiq_df = illiq_df.drop(columns=['交易天数'])
    
    return illiq_df

# 示例数据
data = {
    '股票代码': ['A', 'A', 'A', 'B', 'B', 'B'],
    '日期': ['2023-06-01', '2023-06-02', '2023-06-03', '2023-06-01', '2023-06-02', '2023-06-03'],
    '日收益率': [0.01, -0.02, 0.03, 0.04, -0.01, 0.02],
    '日成交金额': [1000, 2000, 1500, 1200, 1800, 1100]
}

df = pd.DataFrame(data)
amihud_illiq_df = calculate_amihud_illiq(df)
print(amihud_illiq_df)

这段代码实现了以下功能:

  • calculate_amihud_illiq 函数接收包含 股票代码日期日收益率日成交金额 列的DataFrame。
  • 它计算每只股票的绝对日收益率与成交金额的比率。
  • 按股票和月份对数据进行分组,然后计算该比率的平均值。
  • 过滤出交易天数不少于15天的月份。
  • 最后返回一个包含每只股票和月份的Amihud非流动性因子的DataFrame。

点评
优点

简单易懂:该因子计算方法简单,仅需股票的日收益率和日成交金额。
直观性强:通过将价格变动与成交金额的比率进行平均,可以直观地反映股票的流动性情况。
数据需求低:相比一些复杂的流动性测度方法,Amihud非流动性因子所需的数据较少,易于获取。

缺点

忽略市场深度:该因子仅考虑了价格变动与成交金额的比率,未能考虑市场深度(如买卖挂单的数量和价差)。
容易受到极端值影响:若某天的成交金额极低而价格变动较大,则该因子会被极大地放大,可能会引入噪音。
不适合高频交易分析:该因子通常按月计算,无法反映更高频率(如分钟、小时)内的流动性变化。
线性假设:Amihud因子假设价格变动和成交金额之间呈线性关系,但在实际市场中,这种关系可能是非线性的。

实践应用

风险管理:非流动性高的股票在市场波动时可能面临更高的流动性风险,投资者可以根据Amihud因子调整投资组合以降低流动性风险。
资产定价:研究表明,非流动性高的股票往往需要更高的预期收益率以补偿流动性风险,投资者可以利用Amihud因子在资产定价模型中做调整。
市场分析:通过对不同股票或市场的Amihud因子进行比较,可以分析市场流动性的变化趋势,为政策制定或市场预测提供参考。
;