【scau统计学】Python实验三比较两支股票

该文章介绍了如何从两个股票的日交易数据中计算收盘价与开盘价的差值,评估股票的波动性,检验差值分布的正态性和对称性,并通过可视化展示数据分布。
摘要由CSDN通过智能技术生成

题目要求:

下载两个数据文件,数据分别为某两股票为期一年的日交易信息,请根据每只股票的收盘价与开盘价计算每天的股票价格的收开盘的差值,计算一年来那只股票的这种差值的波动大?此差值的分布是否服从正态分布,分布是否是对称的?

文件地址:

‪C:\Users\Administrator\Desktop\daily_20240428200125.csv

‪C:\Users\Administrator\Desktop\daily_20240428200156.csv

运行结果:

d0628607416e40b186856c7f2a54f9de.png

130ecda2ee2549fb95693e1628285013.png

e6946d0596bd4f96a85439b3448a0d74.png

源代码:

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")

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值