python数据分析-量化分析

一、研究背景

随着经济的发展和金融市场的不断完善,股票投资成为了人们重要的投资方式之一。汽车行业作为国民经济的重要支柱产业,其上市公司的股票表现备受关注。Fama-French 三因子模型是一种广泛应用于股票市场的资产定价模型,它考虑了市场风险、规模因素和价值因素对股票收益的影响。通过对汽车行业上市公司股票数据的分析,可以深入了解该行业的投资特征和风险状况,为投资者提供决策参考。

二、量化分析

接下来进行量化分析

数据是十家汽车行业上市公司在2012.1.1-2021.12.31期间每日的股票交易和Fama-French三因子的数据,十家上市公司分别是:

序号

股票代码

1

000550

2

000572

3

000625

4

000800

5

002594

6

600006

7

600104

8

600418

9

601238

10

601633

每个csv数据文件中均包含以下指标:

数据集和完整代码

变量

含义

变量

含义

stkcd

证券代码

opnprc

日开盘价

year

hiprc

日最高价

month

loprc

日最低价

day

clsprc

日收盘价

trddt

交易日期

dnshr

日个股交易量

ret

日个股回报率

risk

日市场风险溢价因子

smb

日市值因子

hml

日账面市值比因子

首先利用pandas读入所提供的股票数据,保存成DataFrame格式的变量,将日期列转换成Datetime格式,并设置成为DataFrame的index。计算每只股票数据中包含多少个交易日

读取数据集

# 调整读取方法,处理日期列
stock_data = {}
for path in file_paths:
    # 读取CSV文件,制定分隔符为'\t'
    df = pd.read_csv(path, delimiter='\t')
    
    # 转换日期格式
    df['trddt'] = pd.to_datetime(df['trddt'])
    
    # 按日期排序
    df = df.sort_values(by='trddt')
    
    # 设置日期为索引
    df.set_index('trddt', inplace=True)
    
    # 存储处理后的DataFrame
    stock_data[path.split('/')[-1].split('.')[0]] = df

# 显示每只股票包含的交易日数量
trading_days = {stock: len(data.index) for stock, data in stock_data.items()}
trading_days

虽然所有股票都在同一时间段内被观察,但它们的交易日数量略有不同。 这可能是由于不同的市场假期、停牌、或是某些股票在该时间段内上市的时间不同所致。

接下来选择一支股票,绘制该只股票自2020年以来的K线图,并在K线图上添加30日均线

 

# 将日期列设为DataFrame的索引并按日期排序
df.set_index('date', inplace=True)
df.sort_index(inplace=True)

# 筛选自2020年以来的数据
stock_002594 = df.loc['2020':]

# 准备股票价格和交易量数据,用于绘图
stock_002594_mpf = stock_002594[['opnprc', 'hiprc', 'loprc', 'clsprc', 'dnshr']].copy()
stock_002594_mpf.columns = ['Open', 'High', 'Low', 'Close', 'Volume']

# 计算30日均线
stock_002594_mpf['30_MA'] = stock_002594_mpf['Close'].rolling(window=30).mean()

# 定义图表和坐标轴
fig, ax = plt.subplots(figsize=(16,8))

# 绘制收盘价
ax.plot(stock_002594_mpf.index, stock_002594_mpf['Close'], label='收盘价', color='black')

# 绘制30日均线
ax.plot(stock_002594_mpf.index, stock_002594_mpf['30_MA'], label='30日均线', color='blue')

# 设置标题和坐标轴标签
ax.set_xlabel('日期')
ax.set_ylabel('价格')
ax.set_title('股票002594价格与30日均线')
ax.legend()

# 设置x轴的日期格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
ax.xaxis.set_major_locator(mdates.MonthLocator())

# 旋转日期标签以便更好地显示
plt.xticks(rotation=45)

# 显示网格
plt.grid(visible=True)

# 显示图表
plt.show()

价格趋势:可以看到,股价在2020年至2021年间呈现出显著的上升趋势,尤其是在2020年中到2021年初,股价有一个大幅的上升期。 波动性:股价在上升期间也显示出一定的波动性,尤其是在大幅上升后,股价有过一些急剧的回调,但总体趋势依然向上。 30日均线:30日均线平滑了价格的日常波动,提供了一个关于股票短期趋势的更清晰视角。 在股价上升期,30日均线持续上升,并在大多数时间内位于日收盘价之下,这通常被视为上升趋势的确认。而在股价下跌期, 30日均线开始下降,并且在某些时段内位于日收盘价之上,可能表示一个短期内的下降趋势。 均线与价格的交叉:在图中,我们可以看到股价与30日均线 

随后利用OLS回归计算10只股票在三个因子(risk, smb, hml)上的系数,即因子暴露。将10只股票在每个因子上的因子暴露按照从大到小排序并打分(分值从大到小依次为10、8、6、4、2),计算每只股票在三个因子上的加权得分(三个因子等权重)

 

# 对每个股票进行OLS回归
for stock, data in stock_data.items():
    # 回归模型
    X = data[['risk', 'smb', 'hml']]
    y = data['ret']
    X = sm.add_constant(X)  # 添加常数项
    model = sm.OLS(y, X).fit()
    
    # 存储每个股票的因子暴露度
    factor_exposures[stock] = model.params[1:]  # 排除常数项
# 分配分数(10、8、6、4、2)
scores_mapping = {1: 10, 2: 8, 3: 6, 4: 4, 5: 2}
scores_df = ranked_exposures.applymap(lambda x: scores_mapping.get(x, 0))

# 计算每只股票的加权得分
scores_df['Total Score'] = scores_df.mean(axis=1)

# 结果
scores_df

从给定的分数来看,股票000800和000572的总分最高,达到了6分,这可能意味着从这三个因子的角度看,它们的投资吸引力较高。而股票000550的总分最低,为0分,可能意味着从这些因素来看,它的投资吸引力较低。

三、小结

本研究成功地读取了十家汽车行业上市公司的股票数据,并将日期列转换为 Datetime 格式,设置为 DataFrame 的 index。经过排序后,计算出了每只股票数据中包含的交易日数量。根据题目要求,选择了对应序号的股票,并绘制了该只股票自 2020 年以来的 K 线图,并添加了 30 日均线。K 线图可以直观地展示股票价格的走势,而 30 日均线则可以帮助投资者判断股票的短期趋势。利用 OLS 回归计算了 10 只股票在三个因子(risk, smb, hml)上的系数,即因子暴露。通过对因子暴露的排序和打分,计算出了每只股票在三个因子上的加权得分。这些结果可以帮助投资者了解股票的风险特征和投资价值,为投资决策提供参考。

需要注意的是,以上结论仅基于题目要求和提供的数据,实际情况可能会有所不同。在进行股票投资时,投资者还需要综合考虑其他因素,如公司基本面、行业发展趋势、宏观经济环境等。

创作不易,希望大家多点赞关注评论!!!(类似代码或报告定制可以私信)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值