Python实现峰度计算与VaR风险价值分析

45、根据偏度的代码,编写一个用于计算峰度的Python函数。将你的函数与scipy.stats.kurtosis()函数进行比较。


以下是根据要求编写的Python代码,用于实现自定义的峰度计算函数,并与`scipy.stats.kurtosis()`函数进行比较:

```python
import numpy as np
from scipy import stats

# 自定义峰度计算函数
# 峰度计算公式:kurtosis = (1/n) * sum(((x - mean)/std)^4) - 3
# 这里计算的是超额峰度,标准正态分布的超额峰度为0
# 输入参数:data为要计算峰度的数据数组
# 返回值:计算得到的峰度值
# 自定义峰度计算函数


def custom_kurtosis(data):
    # 计算数据的均值
    mean = np.mean(data)
    # 计算数据的标准差
    std = np.std(data)
    # 计算数据的长度
    n = len(data)
    # 计算每个数据点与均值的差的四次方除以标准差的四次方的和
    sum_of_fourth_powers = np.sum(((data - mean) / std) ** 4)
    # 计算峰度值
    kurtosis = (sum_of_fourth_powers / n) - 3
    return kurtosis

# 生成一些示例数据,这里使用标准正态分布生成500000个随机数
np.random.seed(12345)
ret = np.random.normal(0, 1, 500000)

# 使用自定义函数计算峰度
custom_result = custom_kurtosis(ret)

# 使用scipy库中的函数计算峰度
scipy_result = stats.kurtosis(ret)

# 输出结果
print(f'自定义函数计算的峰度: {custom_result}')
print(f'scipy.stats.kurtosis()计算的峰度: {scipy_result}')

代码解释:


自定义峰度计算函数

custom_kurtosis




– 首先计算数据的均值和标准差。

– 然后计算每个数据点与均值的差的四次方除以标准差的四次方的和。

– 最后根据峰度的计算公式

(1/n) * sum(((x - mean)/std)^4) - 3

计算峰度值。


生成示例数据

:使用

np.random.normal(0, 1, 500000)

生成500000个来自标准正态分布的随机数。


计算峰度

:分别使用自定义函数和

scipy.stats.kurtosis()

函数计算峰度。


输出结果

:打印出两种方法计算得到的峰度值。

比较结果:

由于

scipy.stats.kurtosis()

函数默认计算的是超额峰度,与我们自定义函数的计算方式一致,因此两种方法的计算结果应该非常接近。在标准正态分布的情况下,峰度值应该接近0。



##46、编写一个Python程序,使用历史价值来生成风险价值(VaR)。函数的结构为VaR_historical(ticker, confidence_level, n_days)。
```python
import numpy as np
import pandas as pd
from scipy.stats import norm
from matplotlib.finance import quotes_historical_yahoo_ochl as getData

def VaR_historical(ticker, confidence_level, n_days):
    # 获取历史数据
    begdate = (2000, 1, 1)
    enddate = (2016, 12, 31)
    x = getData(ticker, begdate, enddate, asobject=True, adjusted=True)
    # 计算收益率
    ret = x.aclose[1:] / x.aclose[:-1] - 1
    # 计算持仓价值
    n_shares = 500
    position = n_shares * x.close[0]
    # 计算n天的收益率
    logret = np.log(1 + ret)
    ddate = []
    for i in range(0, np.size(logret)):
        ddate.append(int(i / n_days))
    y = pd.DataFrame(logret, index=ddate, columns=['retNdays'])
    logRet = y.groupby(y.index).sum()
    retNdays = np.exp(logRet) - 1
    # 对n天收益率排序
    ret2 = np.sort(retNdays)
    n = np.size(ret2)
    leftTail = int(n * (1 - confidence_level))
    # 计算VaR
    VaR = position * ret2[leftTail]
    return VaR

47、从雅虎财经(http://finance.yahoo.com)下载几家公司(如IBM、WMT和花旗集团C)过去五年的价格数据。检验它们的日回报率是否服从正态分布。

以下是一个Python代码示例,用于从雅虎财经下载指定公司过去五年的价格数据,并检验它们的日回报率是否服从正态分布:


import yfinance as yf
import pandas as pd
from scipy import stats

# 定义要下载数据的股票代码
symbols = ['IBM', 'WMT', 'C']

# 下载过去五年的数据
end_date = pd.Timestamp.now()
start_date = end_date - pd.DateOffset(years=5)

for symbol in symbols:
    # 下载数据
    data = yf.download(symbol, start=start_date, end=end_date)

    # 计算日回报率
    returns = data['Close'].pct_change().dropna()

    # 进行Shapiro-Wilk检验
    stat, p = stats.shapiro(returns)

    # 输出结果
    alpha = 0.05
    if p > alpha:
        print(f'{symbol}的日回报率可能服从正态分布,p值: {p}')
    else:
        print(f'{symbol}的日回报率不服从正态分布,p值: {p}')

代码解释:


导入必要的库


yfinance

用于下载股票数据,

pandas

用于数据处理,

scipy.stats

用于进行Shapiro-Wilk正态性检验。


定义股票代码

:指定要下载数据的股票代码,这里是

'IBM'


'WMT'


'C'


确定时间范围

:计算过去五年的开始日期和结束日期。


循环下载数据

:对于每个股票代码,下载其过去五年的价格数据。


计算日回报率

:使用

pct_change()

方法计算每日收盘价的百分比变化,并删除缺失值。


进行Shapiro-Wilk检验

:使用

stats.shapiro()

函数进行正态性检验,得到统计量和 p 值。


输出结果

:根据 p 值判断日回报率是否服从正态分布,并输出相应的信息。

48、假设当前股票价格为10.25美元,过去五年的均值为9.35美元,标准差为4.24美元。编写一个Python程序来生成1000个未来价格。


# Python程序:根据当前股票价格生成未来价格

以下是一个Python程序,用于根据给定的当前股票价格、过去五年的均值和标准差来生成1000个未来价格。这里我们假设股票价格的变化服从正态分布。

```python
import numpy as np

# 给定参数
current_price = 10.25
mean_value = 9.35
std_dev = 4.24
num_prices = 1000

# 生成1000个服从正态分布的随机数,表示价格的变化
price_changes = np.random.normal(mean_value, std_dev, num_prices)

# 计算未来价格
future_prices = current_price + price_changes

# 打印前10个未来价格作为示例
print(future_prices[:10])

代码解释:


导入必要的库

:导入

numpy

库,用于生成随机数和进行数值计算。


定义参数

:定义当前股票价格

current_price

、过去五年的均值

mean_value

、标准差

std_dev

和要生成的未来价格数量

num_prices


生成价格变化

:使用

np.random.normal()

函数生成1000个服从正态分布的随机数,表示价格的变化。


计算未来价格

:将当前股票价格加上价格变化,得到未来价格。


打印结果

:打印前10个未来价格作为示例。



##49、下载过去10年中10家公司股票的价格数据。构建一个等权重投资组合,并对该投资组合的日收益率进行Shapiro - Wilk检验。这10家公司分别是:戴尔公司(DELL)、国际商业机器公司(IBM)、通用电气公司(GE)、微软公司(MSFT)、谷歌公司(GOOG)、家庭美元商店(FDO)、苹果公司(AAPL)、沃尔玛商店(WMT)、易贝公司(EBAY)、麦当劳公司(MCD)
为完成此任务,可按以下步骤进行:

1. **数据下载**:可以使用如 `yfinance` 库从雅虎财经下载这 10 只股票过去 10 年的价格数据。

2. **构建等权重投资组合**:计算每只股票的日收益率,然后将各股票日收益率按等权重(每只股票权重为 1/10)组合得到投资组合的日收益率。

3. **进行 Shapiro-Wilk 检验**:使用 `scipy.stats` 库中的 `shapiro` 函数对投资组合的日收益率进行检验。

---

### 示例代码:

```python
import yfinance as yf
import pandas as pd
from scipy import stats

# 定义股票代码
tickers = ['DELL', 'IBM', 'GE', 'MSFT', 'GOOG', 'FDO', 'AAPL', 'WMT', 'EBAY', 'MCD']

# 下载过去10年的价格数据
start_date = pd.Timestamp.now() - pd.DateOffset(years=10)
end_date = pd.Timestamp.now()
data = yf.download(tickers, start=start_date, end=end_date)['Close']

# 计算日收益率
returns = data.pct_change().dropna()

# 构建等权重投资组合
portfolio_returns = returns.mean(axis=1)

# 进行Shapiro-Wilk检验
statistic, p_value = stats.shapiro(portfolio_returns)
print(f'Shapiro-Wilk统计量: {statistic}')
print(f'p值: {p_value}')

# 判断是否通过检验
if p_value > 0.05:
    print('投资组合的日收益率服从正态分布。')
else:
    print('投资组合的日收益率不服从正态分布。')

上述代码首先使用

yfinance

库下载股票价格数据,接着计算日收益率,然后构建等权重投资组合,最后使用

scipy.stats.shapiro

函数进行 Shapiro-Wilk 检验,并根据 p 值判断投资组合的日收益率是否服从正态分布。


注意

:代码中的

FDO

可能需要根据实际情况调整,因为家庭美元商店可能已被收购或代码有变更。

50、对于20个股票代码,下载它们的每日价格并保存为20个不同的CSV文件。编写一个Python程序,随机选择五只股票,并估计它们等权重投资组合的回报和风险。

以下是一个实现该功能的Python示例代码:


import pandas as pd
import numpy as np
import yfinance as yf
from random import sample

# 假设这是20个股票代码
tickers = ['AAPL', 'MSFT', 'GOOG', 'AMZN', 'FB', 'TSLA', 'NVDA', 'JPM', 'V', 'PG', 'JNJ', 'UNH', 'HD', 'MA', 'BAC', 'DIS', 'PYPL', 'CMCSA', 'NFLX', 'ADBE']

# 下载并保存每日价格为20个不同的CSV文件
for ticker in tickers:
    data = yf.download(ticker, period='1y')
    data.to_csv(f'{ticker}.csv')

# 随机选择五只股票
selected_tickers = sample(tickers, 5)

# 读取所选股票的数据
selected_data = {}
for ticker in selected_tickers:
    selected_data[ticker] = pd.read_csv(f'{ticker}.csv', index_col='Date', parse_dates=True)['Close']

# 合并数据
portfolio_data = pd.DataFrame(selected_data)

# 计算每日收益率
returns = portfolio_data.pct_change().dropna()

# 等权重投资组合权重
weights = np.ones(len(selected_tickers)) / len(selected_tickers)

# 计算投资组合每日收益率
portfolio_returns = returns.dot(weights)

# 估计投资组合的平均回报
portfolio_mean_return = portfolio_returns.mean()

# 估计投资组合的风险(标准差)
portfolio_risk = portfolio_returns.std()

print(f'随机选择的五只股票: {selected_tickers}')
print(f'等权重投资组合的平均回报: {portfolio_mean_return:.4f}')
print(f'等权重投资组合的风险(标准差): {portfolio_risk:.4f}')

代码说明:


导入必要的库


pandas

用于数据处理,

numpy

用于数值计算,

yfinance

用于下载股票数据,

random.sample

用于随机选择股票。


下载并保存数据

:使用

yfinance

下载20个股票的一年数据,并保存为20个不同的CSV文件。


随机选择五只股票

:使用

random.sample

从20个股票代码中随机选择5个。


读取所选股票的数据

:读取所选股票的CSV文件,并提取收盘价。


计算每日收益率

:使用

pct_change

方法计算每日收益率,并去除缺失值。


计算等权重投资组合的权重

:将权重设置为相等。


计算投资组合的每日收益率

:使用

dot

方法将每日收益率与权重相乘。


估计投资组合的平均回报和风险

:计算投资组合每日收益率的平均值和标准差。


输出结果

:打印随机选择的五只股票、等权重投资组合的平均回报和风险。

51、重复之前编写的一个处理股票数据的程序,但将结果保存为一个文件而不是20个单独的CSV文件。同时,生成一个名为ticker的额外变量用于记录股票代码。

要完成这个任务,我们可以将不同股票的数据合并到一个DataFrame中,然后将其保存为一个CSV文件。同时,需要添加

ticker

变量来记录股票代码。以下是实现该功能的Python代码示例:


import pandas as pd
import numpy as np
import datetime
import tempfile

# 假设这里有一个包含20个股票代码的列表
# 这里只是示例,你可以根据实际情况修改
stock_tickers = ['AAPL', 'IBM', 'GOOG', 'MSFT', 'AMZN', 'FB', 'TSLA', 'NVDA', 'JPM', 'BAC', 'V', 'MA', 'PG', 'KO', 'PEP', 'NFLX', 'DIS', 'ADBE', 'CRM', 'INTC']

all_data = []

for ticker in stock_tickers:
    path = 'your_path_replace_ttt_with_ticker'  # 请替换为实际的文件路径模式
    x = np.array(pd.read_csv(path.replace('ttt', ticker), skiprows=7, header=None))
    date = []
    for i in np.arange(0, len(x)):
        if x[i][0][0] == 'a':
            t = datetime.datetime.fromtimestamp(int(x[i][0].replace('a', '')))
            print(ticker, t, x[i][1:])
            date.append(t)
        else:
            date.append(t + datetime.timedelta(minutes=int(x[i][0])))

    final = pd.DataFrame(x, index=date)
    final.columns = ['a', 'CLOSE', 'LOW', 'OPEN', 'VOL']
    del final['a']
    final['ticker'] = ticker  # 添加ticker列
    all_data.append(final)

# 合并所有股票的数据
combined_data = pd.concat(all_data)

# 保存为一个CSV文件
fp = tempfile.TemporaryFile()
combined_data.to_csv('c:/temp/all_stocks_data.csv')
print(combined_data.head())

代码说明:


股票代码列表


stock_tickers

列表包含了20个股票代码,你可以根据实际情况修改。


循环处理每个股票

:使用

for

循环遍历每个股票代码,读取相应的CSV文件,并进行数据处理。


添加

ticker



:在处理每个股票的数据时,添加一个名为

ticker

的列,用于记录该数据所属的股票代码。


合并数据

:使用

pd.concat()

函数将所有股票的数据合并到一个DataFrame中。


保存为一个CSV文件

:将合并后的数据保存为一个CSV文件,文件名为

all_stocks_data.csv

请确保将

path

变量替换为实际的文件路径模式,以便正确读取每个股票的CSV文件。

52、一个班级有30名学生。编写一个程序来随机选择其中的7名学生。

以下是使用Python实现从30名学生中随机选择7名学生的程序:


import random

# 假设学生编号从1到30
students = list(range(1, 31))

# 设置随机种子以保证结果可复现
random.seed(123)

# 随机选择7名学生
selected_students = random.sample(students, 7)

print(selected_students)

在上述代码中,首先创建了一个包含从1到30的学生编号的列表

students

。然后使用

random.seed(123)

设置随机种子,这样每次运行程序时都会得到相同的随机结果。最后,使用

random.sample()

函数从

students

列表中随机选择7个元素,存储在

selected_students

列表中并打印输出。

53、通常我们观察到投资组合的波动性和投资组合中股票数量之间存在负相关关系。编写一个程序来展示投资组合的方差和其中股票数量之间的关系。


# 投资组合方差与股票数量关系的Python程序示例

以下是一个Python程序示例,用于展示投资组合的方差和其中股票数量之间的关系。这个程序会模拟不同数量的股票组成的投资组合,并计算每个组合的方差。

```python
import numpy as np
import matplotlib.pyplot as plt

# 模拟股票回报数据
np.random.seed(0)
num_stocks_range = range(2, 51)  # 股票数量从2到50
num_periods = 100  # 每个股票的回报周期数
variances = []

for num_stocks in num_stocks_range:
    # 生成随机回报数据
    returns = np.random.randn(num_periods, num_stocks)
    # 计算权重(等权重)
    weights = np.ones(num_stocks) / num_stocks
    # 计算协方差矩阵
    cov_matrix = np.cov(returns, rowvar=False)
    # 计算投资组合的方差
    portfolio_variance = weights.T @ cov_matrix @ weights
    variances.append(portfolio_variance)

# 绘制投资组合方差和股票数量的关系图
plt.plot(num_stocks_range, variances)
plt.xlabel('Number of Stocks in Portfolio')
plt.ylabel('Portfolio Variance')
plt.title('Relationship between Portfolio Variance and Number of Stocks')
plt.grid(True)
plt.show()

代码解释:


导入必要的库

:使用

numpy

进行数值计算,

matplotlib.pyplot

进行绘图。


设置参数

:定义股票数量的范围(从2到50)和每个股票的回报周期数(100)。


循环计算不同股票数量下的投资组合方差



– 生成随机回报数据。

– 计算等权重的投资组合权重。

– 计算回报数据的协方差矩阵。

– 根据权重和协方差矩阵计算投资组合的方差。


绘制关系图

:使用

matplotlib

绘制投资组合方差和股票数量的关系图。

运行这个程序后,你将看到一个图形,展示了投资组合的方差随着股票数量的增加而变化的趋势,通常会呈现出负相关关系。

“`

© 版权声明

相关文章

暂无评论

none
暂无评论...