回报率与正态分布

正态分布

正态分布是一种连续型概率分布,也被称为高斯分布或钟形曲线分布。它被广泛应用于统计学和自然科学中,如在财务分析、生物学、物理学、心理学和社会科学等领域中。

正态分布的特点是具有单峰性,即它的概率密度函数具有一个峰值,而且峰值对称地位于均值的左右两侧。它还具有标准差和方差的特征,这些特征可以用来测量数据的分散程度。正态分布的形状可以通过均值和标准差来调整。

正态分布的概率密度函数是:

f ( x ∣ μ , σ 2 ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 f(x | \mu,\sigma^2) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(x-\mu)^2}{2\sigma^2}} f(xμ,σ2)=σ2π 1e2σ2(xμ)2

其中, x x x 是随机变量的取值, μ \mu μ 是均值, σ \sigma σ 是标准差。这个函数的图形是一个钟形曲线,对称于均值 μ \mu μ

正态分布具有一些重要的性质。首先,它的累积分布函数是一个特殊的函数,称为标准正态分布函数。其次,许多重要的统计量,如样本均值和样本方差,都可以被看作正态分布的函数。根据中心极限定理,当从一个总体中抽取n个独立的、相同分布的样本时(一般来说 n ≥ 0 n\geq 0 n0),这些样本的平均值将遵循正态分布。

因此,正态分布是统计学中最常用的分布之一,它对于我们理解和解释数据非常重要。

导入库

接下来我们导入这篇示例会用到的库。

# Import Pandas, Numpy and Scipy
import pandas as pd
import numpy as np
from scipy.stats import norm

# Import matplotlib for visualization
import matplotlib
import matplotlib.pyplot as plt

# Plot settings
plt.style.use('ggplot')
matplotlib.rcParams['figure.figsize'] = [12.0, 8.0]
matplotlib.rcParams['font.size'] = 14
matplotlib.rcParams['lines.linewidth'] = 2.0

# ignore warnings
import warnings
warnings.filterwarnings('ignore')

这里我们会用到第一篇博客中用到的纳斯达克数据,这些数据可以在Yahoo finance上下载。读取csv数据,并展示dataframe。

# Load the CSV file
nasdaq = pd.read_csv('./NasdaqAll.csv', index_col=0, parse_dates=True, dayfirst=True)[:'2023']  

# Output first five values
nasdaq
# Verify the datetime format
nasdaq.index
# get last 300 index values
nasdaq.index[-300:]

基于纳斯达克历史数据,绘制出调整后收盘价的折线图。

# Visualize the plot to verify the data
plt.plot(nasdaq.index, nasdaq['Adj Close'])
plt.title('NASDAQ Index : 1971 - 2023');

在这里插入图片描述

计算回报率

回报率是以percentage difference计算的,我们可以直接使用pct_change()方程。
算出来的回报率另起一列,加到原来的dataframe里。

# Calculate returns and add it to existing DataFrame as a column
nasdaq['Return'] = nasdaq['Adj Close'].pct_change().fillna(0)

# Get first 5 rows
nasdaq['Return'].head()

在这里插入图片描述

计算均值和标准差

# Calculate mean and sigma
mu = np.mean(nasdaq['Return'])
sigma = np.std(nasdaq['Return'])

print(f'Mean {
      
      mu:.6f}, Sigma {
      
      sigma:.6f}')

得到均值为0.000444,标准差为0.012692。

计算缩放收益

在金融领域,缩放收益是指已经调整或标准化的收益,用以考虑为实现该收益所承担的风险水平。这是通过将收益除以风险度量,例如收益的标准差或贝塔系数来完成的。

例如,假设投资者在给定时期内的投资组合上实现了10%的收益,但投资组合的波动性(以收益的标准差表示)为20%。在这种情况下,缩放收益将为10%/20%= 0.5。这表示投资者为每承担一单位的风险而获得了0.5单位的收益(发现了吗,它是夏普比率!妙蛙!)。

缩放收益对于比较可能具有不同风险水平的不同投资或投资组合的表现非常有用。它们可以帮助投资者评估其投资组合相对于承担的风险水平在产生收益方面的效率。

这里,我们简单的把它数学化,即对之前算得的回报率进行标准化。

我们把算出来的缩放收益另起一列,加到之前的的dataframe里。

# Calculate the scaled return
nasdaq['Scaled_Return'] = nasdaq['Return'].apply(lambda x: (x - mu)/sigma)

# Check the output
nasdaq.head()

计算Bin Range

Bin range是用于将连续变量划分为离散类别(discrete categories)或“箱子(bin)”的一组值或间隔,以进行数据分析。

在统计学和数据分析中,分箱是将数据点分组为较少数量的类别或“箱子”的技巧,用以简化数据分析和可视化。当变量的值范围很大时,使用所有个体数据点进行比较或可视化通常很困难,分箱可以帮助简化问题。

为了创建箱子,变量的值范围被分成等间隔的区间,每个区间被分配到一个类别或“箱子”中。例如,如果我们有一组表示一群人身高的数据,我们可以为不同的身高范围创建区间,例如150-160厘米,161-170厘米,171-180厘米等。

选择适当的区间很重要,以便准确地表示数据并避免结果的偏见或误解。选择区间的选择可能取决于具体的研究问题、数据集的大小和所需的分析细节级别。

# Calculate minimum and maximum bin range
sr_min = np.min(nasdaq['Scaled_Return'])
sr_max = np.max(nasdaq['Scaled_Return'])

print(f'Minimum {
      
      sr_min:.6f}, Maximum {
      
      sr_max:.6f}')

得到结果为:Minimum -9.742914, Maximum 11.131985

# Define bins
x = np.linspace(sr_min, sr_max, 200)

# Calculate normal probability density function
y = (1/np.sqrt(2*np.pi)*np.exp(-0.5*x**2))          # can also use norm.pdf(x,0,1)

# Plot histogram of scaled returns
plt.hist(nasdaq['Scaled_Return'], bins=200, density=True, color = 'orange', label = 'Empirical', alpha=0.75)

# Plot norm pdf
plt.plot(x, y, color = 'red', label = 'Normal', alpha=1)

# Set x and y axis limits
plt.xlim(-4,4)
plt.ylim(0,0.75)

# Set title
plt.title('Empirical vs Normal Distribution')

# Set legends
plt.legend();

在这里插入图片描述
金融理论中,一般我们把回报率看作是随机的。随机回报率通常假设他们遵从正态分布。这不是非常严谨,但我们先以这个假设开个头,后面的博客再慢慢细聊。如果我们用的不是纳斯达克数据,而是用单一一只股票或者其他金融工具的历史数据,经过这篇博客同样的代码和分析,我们也可以得出结论,说这只股票的回报率是随机的,并且这个回报率遵从正态分布;而对于这只股票,或者说这个资产的价格,遵从对数正态分布(lognormal distribution),并且这个资产价格模型可以表示为一个随机微分方程(stochastic differential equation)。

猜你喜欢

转载自blog.csdn.net/Pet_a_Cat/article/details/129891930