题目要求:
下载两个数据文件,数据分别为某两股票为期一年的日交易信息,请根据每只股票的收盘价与开盘价计算每天的股票价格的收开盘的差值,计算一年来那只股票的这种差值的波动大?此差值的分布是否服从正态分布,分布是否是对称的?
文件地址:
C:\Users\Administrator\Desktop\daily_20240428200125.csv
C:\Users\Administrator\Desktop\daily_20240428200156.csv
运行结果:
源代码:
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
from scipy import stats
# 读取数据
df_a = pd.read_excel('C:/Users/Administrator/Desktop/daily_20240428200125.xlsx', sheet_name='daily_20240428200125')
df_b = pd.read_excel('C:/Users/Administrator/Desktop/daily_20240428200156.xlsx', sheet_name='daily_20240428200156')
# 计算每只股票每天的收开盘差值
df_a['差值'] = df_a['收盘价'] - df_a['开盘价']
df_b['差值'] = df_b['收盘价'] - df_b['开盘价']
# 计算每只股票差值的波动大小(标准差)
std_a = df_a['差值'].std()
std_b = df_b['差值'].std()
# 输出波动大小
print(f"股票A的波动率(标准差): {std_a}")
print(f"股票B的波动率(标准差): {std_b}")
# 判断哪只股票的波动更大
if std_a > std_b:
print("股票A的波动率更大")
else:
print("股票B的波动率更大")
# 检验分布的正态性
# 使用Shapiro-Wilk test
w_a, p_a = stats.shapiro(df_a['差值'])
w_b, p_b = stats.shapiro(df_b['差值'])
# 解释正态性检验结果
alpha = 0.05 # 显著性水平
def int_nor_te(w, p, name):
if p < alpha:
print(f"{name}的差值分布不服从正态分布 (p={p:.4f})")
else:
print(f"{name}的差值分布服从正态分布 (p={p:.4f})")
print(p_a)
print(p_b)
int_nor_te(w_a, p_a, "股票A")
int_nor_te(w_b, p_b, "股票B")
# 评估对称性(通过偏度)
skew_a = df_a['差值'].skew()
skew_b = df_b['差值'].skew()
# 解释偏度
def interpret_skewness(skew, name):
if skew > 0:
print(f"{name}的差值分布呈现正偏态")
elif skew < 0:
print(f"{name}的差值分布呈现负偏态")
else:
print(f"{name}的差值分布大致对称")
interpret_skewness(skew_a, "股票A")
interpret_skewness(skew_b, "股票B")
拓展可视化(可选):
# 可视化分布(可选)
# 绘制直方图与正态分布拟合线
def plot_distribution(df, col_name, title):
plt.figure(figsize=(10, 6))
plt.hist(df[col_name], bins=30, alpha=0.6, color='g', density=True)
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, loc=df[col_name].mean(), scale=df[col_name].std()) # 修改这里
plt.plot(x, p, 'k', linewidth=2)
plt.title(title)
plt.show()
plot_distribution(df_a, '差值', "A_diff")
plot_distribution(df_b, '差值', "B_diff")