#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因子进行比较,可以分析市场流动性的变化趋势,为政策制定或市场预测提供参考。