Python金融系列第四篇:置信区间和假设检验

2023-11-15

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


第一篇:计算股票回报率,均值和方差

第二篇:简单线性回归

第三篇:随机变量和分布

第四篇:置信区间和假设检验

第五篇:多元线性回归和残差分析

第六篇:现代投资组合理论

第七篇:市场风险

第八篇:Fama-French 多因子模型


介绍

在上一章中,我们讨论了随机变量和随机分布。现在我们将使用我们学到的分布来检验我们的假设,并对财务数据进行建模。在指定交易策略时,进行一些研究是必不可少的工作。但是,你将无法使用所有数据测试你的想法,因为它是无限的。你只能使用样本进行试验。这就是为什么我们需要了解总样本和样本之间的差异,然后使用置信区间来检验我们的假设。

正如我们之前提到的,均值和标准差都是点估计,它们可能是骗人的,因为样本均值与总样本均值不同。将来每天都会产生新的财务数据,因此即使我们可以使用所有可用的数据,但它仍然只是一个样本数据。这就是为什么我们需要使用置信区间来尝试确定我们的样本平均估计的准确度。

置信区间

样本误差

让我们使用从 2010 年 8 月到现在的标准普尔 500 指数的每日回报。如果我们采用最近的 10 个每日回报来计算平均值,它是否与人口平均值相同?如何将样本量增加到 1000?

from pandas_datareader import data as pdr
import fix_yahoo_finance as yf

spy_table = pdr.get_data_yahoo("SPY")
spy_total = spy_table[['Open','Close']]
#calculate log returns
spy_log_return = np.log(spy_total.Close).diff().dropna()
print('Population mean:', np.mean(spy_log_return))
#[out]: Population mean: 0.0004301219214913361
print('Population standard deviation:',np.std(spy_log_return))
#[out]: Population standard deviation: 0.009226632108137144

现在让我们查看最近 10 天的样本和最近 1000 天的样本:

print('10 days sample returns:', np.mean(spy_log_return.tail(10)))
#[out]: 10 days sample returns: -0.0014384211472198594
print('10 days sample standard deviation:', np.std(spy_log_return.tail(10)))
#[out]: 10 days sample standard deviation: 0.003372809234788933
print('1000 days sample returns:', np.mean(spy_log_return.tail(1000)))
#[out]: 1000 days sample returns: 0.0004351380532074112
print('1000 days sample standard deviation:', np.std(spy_log_return.tail(1000)))
#[out]: 1000 days sample standard deviation: 0.00802234416274219

正如我们所料,这两个样本具有不同的均值和方差。

置信区间

为了估计样本平均值的范围,我们定义平均值的标准误差如下:

S E = σ n SE = \frac{\sigma}{\sqrt{n}} SE=n σ

其中, σ \sigma σ 是样本的标准差,n 是样本的总数。

通常,如果我们想要估计样本区间,一般我们都是使用 95% 为分界线,也就是说我们希望有 95% 的样本可以落在样本区间内,具体如下:

( μ − 1.96 ∗ S E , μ + 1.96 ∗ S E ) (\mu - 1.96*SE, \mu + 1.96 * SE) (μ1.96SE,μ+1.96SE)

其中, μ \mu μ 是样本均值,SE 是标准误差。

此区间称为置信区间。我们通常使用 1.96 来计算 95% 置信区间,因为我们假设样本均值遵循正太分布。我们稍后会详细介绍。让我们尝试使用上面的例子计算置信区间:

#apply the formula above to calculate confidence interval
bottom_1 = np.mean(spy_log_return.tail(10))-1.96*np.std(spy_log_return.tail(10))/(np.sqrt(len((spy_log_return.tail(10)))))
upper_1 = np.mean(spy_log_return.tail(10))+1.96*np.std(spy_log_return.tail(10))/(np.sqrt(len((spy_log_return.tail(10)))))
bottom_2 = np.mean(spy_log_return.tail(1000))-1.96*np.std(spy_log_return.tail(1000))/(np.sqrt(len((spy_log_return.tail(1000)))))
upper_2 = np.mean(spy_log_return.tail(1000))+1.96*np.std(spy_log_return.tail(1000))/(np.sqrt(len((spy_log_return.tail(1000)))))
#print the outcomes

print('10 days 95% confidence inverval:', (bottom_1,upper_1))
#[out]: 10 days 95% confidence inverval: (-0.0035289099690756585, 0.0006520676746359399)
print('1000 days 95% confidence inverval:', (bottom_2,upper_2))
#[out]: 1000 days 95% confidence inverval: (-6.209198946181664e-05, 0.000932368095876639)

正如我们所看到的,如果我们将样本大小从 10 增加到 1000,95% 的置信区间将变得更窄。想象一下,如果 N 变为正无穷大,那么我们有 lim ⁡ n → ∞ σ n = 0 \lim_{n\rightarrow \infty }\frac{\sigma}{\sqrt{n}}=0 limnn σ=0 。置信区间将成为一个定值,也就是样本均值。

正太分布的置信区间

正太分布是非常常见的一个分布,我们应该能够记住它的一些关键词。具体而言,我们通常使用 90%,95% 和 99% 作为置信区间的置信水平。这三个置信水平的临界值分别为 1.64,1.96 和 2.32。换一种说法,比如 90% 的置信区间上下界限为:

u p p e r a b n d = μ + 1.64 ∗ S E upperabnd = \mu + 1.64 * SE upperabnd=μ+1.64SE

l o w e r b a n d = μ − 1.64 ∗ S E lowerband = \mu - 1.64 * SE lowerband=μ1.64SE

其他置信区间也是如此。记住与正太分布相关的著名的 “Three sigma rule” 或者称为 “68-95-99.7” 。数学上的具体表示为:

P ( μ − σ ≤ X ≤ μ + σ ) ≈ 0.6827 P(\mu-\sigma \leq X \leq \mu + \sigma) \approx 0.6827 P(μσXμ+σ)0.6827

P ( μ − 2 σ ≤ X ≤ μ + 2 σ ) ≈ 0.9545 P(\mu-2\sigma \leq X \leq \mu + 2\sigma) \approx 0.9545 P(μ2σXμ+2σ)0.9545

P ( μ − 3 σ ≤ X ≤ μ + 3 σ ) ≈ 0.9973 P(\mu-3\sigma \leq X \leq \mu + 3\sigma) \approx 0.9973 P(μ3σXμ+3σ)0.9973

我们也可以用图表来进行表示:

在这里插入图片描述

中心极限理论

正如我们所提到的,如果我们使用样本来估计置信区间,那么 95% 置信区间为:

( μ − 1.96 ∗ S E , μ + 1.96 ∗ S E ) (\mu - 1.96*SE, \mu + 1.96*SE) (μ1.96SE,μ+1.96SE)

现在你可能对数字 1.96 有了一定的了解。这是正太分布 95% 的临界值。这是否意味着我们假设样本均值遵循正太分布?答案是肯定的。这个假设得到中心极限定理的支持。该定理告诉我们,如果来自具有有限方差水平的裙子的足够大的样本大小,那么来自相同群体的所有样本的平均值将近似等于群体的平均值,并且样本的平均值将近似正太分布。这是群体平均置信区间估计的基础。

假设检验

现在我们可以谈论假设检验。假设检验基本上是根据样本检验你的推理。让我们使用我们的数据集,标普 500 每日回报。假设我们不知道这个数据的平均值。我们先假设一下这个数据的平均值是 0。我的猜测是否正确呢?我需要用我的样本来测试这个假设。让我们从观察我们的样本开始:

mean_1000 = np.mean(spy_log_return.tail(1000))
std_1000 = np.std(spy_log_return.tail(1000))
mean_10 = np.mean(spy_log_return.tail(10))
std_10 = np.std(spy_log_return.tail(10))
s = pd.Series([mean_10,std_10,mean_1000,std_1000],index = ['mean_10', 'std_10','mean_1000','std_1000'])
print(s)

'''
[out]:
mean_10     -0.001438
std_10       0.003373
mean_1000    0.000435
std_1000     0.008022
dtype: float64
'''

我们现在知道如何计算置信区间了。如果我是对的,即总体样本的均值是 0,则样本的 90% 置信区间应该为:

bottom = 0 - 1.64*std_1000/np.sqrt(1000)
upper = 0 + 1.64*std_1000/np.sqrt(1000)
print((bottom, upper))
#[out]: (-0.000416049627539558, 0.000416049627539558)

我们的样本均值超出了 90% 的置信区间。这意味着在 90% 的置信水平上,我们可以声称我们的样本均值不是 0。换句话说,我们拒绝了从 2010 年 8 月起标普 500 指数的每日回报为 0 的假设。那么我们可以认为是拥有 95% 的置信水平吗?

bottom = 0 - 1.96*std_1000/np.sqrt(1000)
upper = 0 + 1.96*std_1000/np.sqrt(1000)
print((bottom, upper))
#[out]: (-0.0004972300426692278, 0.0004972300426692278)

这次样本均值在置信区间内。因此,我不能拒绝我们的假设。换句话说,我们不能以 95% 的置信水平声称平均回报是正的,即使我们能够以 90% 的置信度声称它。我们实际上已经完成了上面的假设检验!一般来说,我们有零假设 $ H_{0}$ 和替代假设。它们通常采用以下形式:

H 0 : μ ˉ = 0 H_0 : \bar{\mu} = 0 H0:μˉ=0

H 0 : μ ˉ ≠ 0 H_{0} : \bar{\mu} \neq 0 H0:μˉ̸=0

如果测试值超出置信区间,我们拒绝零假设,或者接受替代假设;如果测试值在置信区间内,我们不能拒绝零假设。虽然我们上面使用的假设检验方法非常简单,但是实施起来并不那么方便。相反,我们会颠倒过程来计算临界值或者 Z 分数。Z 分数定义为:

Z = X − μ σ n Z = \frac{X-\mu}{\frac{\sigma}{\sqrt{n}}} Z=n σXμ

让我们从样本中计算出 Z 分数:

print(np.sqrt(1000)*(mean_1000 - 0)/std_1000)
#[out]: 1.7152434710263085

我们知道 90% 置信水平的临界值是 1.64,而 95% 置信水平的临界值是 1.96。Z 分数越高,测试值越远离假设值(在该示例中为 0)。因此,在 90% 的置信水平下,我们距离零很远,所以我们拒绝零假设。然而,在 95% 的置信水平下,我们离零点不远,所以我们不能拒绝零假设。这样做的一个原因是我们可以知道我们的置信区间有多宽。在我们的实例中,Z 分数为 1.9488。我们可以知道宽度是指正太分布表的置信区间。当然我们可以用 Python 做到这一点:

import scipy.stats as st
print((1 - st.norm.cdf(1.9488)))
#[out]: 0.02565965688799665

值得注意的是,st.norm.cdf 将返回从分布中获取的值小于我们测试值的概率。换句话说,1 - st.norm.cdf (1.9488) 将返回该值大于我们测试值的概率,在此示例中为 0.025659。该计算出的数字称为 p 值。如果我们的置信水平为 95%,那么左侧为 2.5%,右侧为 2.5%。这称为双尾测试。如果我们的零假设是 μ = 0 \mu = 0 μ=0 ,我们正在进行双尾检验,因为测试的样本均值可以是足够的正或者负足以拒绝原假设。我们可以从图表中看到它:

在这里插入图片描述

如果我们使用 95% 置信区间,我们需要一个小于 0.025 的p值来拒绝零假设。但是,现在我们的 p 值是 0.025659,大于 0.025,因此我们不能拒绝原假设。它显然小于 0.05,所以我们仍然可以在 90% 置信水平下拒绝零假设。现在让我们用一个答应给你本再次检验总体均值等于 0 的假设,该样本有 1200 个观测值:

mean_1200 = np.mean(spy_log_return.tail(1200))
std_1200 = np.std(spy_log_return.tail(1200))
z_score = np.sqrt(1200)*(mean_1200 - 0)/std_1200
print('z-score = ',z_score)
#[out]: z-score =  2.19793023185
p_value = (1 - st.norm.cdf(z_score))
print('p_value = ',p_value)
#[out]: p_value =  0.0139770390655

使用更大的样本,现在我们可以用更高的置信区间拒绝零假设!我们的 p 值是 0.0105,这是一个双尾测试,所以我们的区间置信度是 1-(0.0105*2) = 0.979。我们可以说最多具有 97.9% 的置信区间,我们可以声称总体均值不为零。我们已经知道人口平均值不是 0,随着我们的样本量增加,我们假设的准确率会上升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python金融系列第四篇:置信区间和假设检验 的相关文章

  • 【Python 量化交易】什么是择时策略

    量化金融 xff1a 什么是择时策略 xff1f 什么是市场择时 xff1f 市场择时概要择时成本损失机会的代价交易成本的代价真实例子 什么是市场择时 xff1f 市场择时 xff0c 也可以叫做市场选时 xff0c 是一种投资或者交易的策
  • 【Python 量化交易】SAR技术指标

    SAR Source Code span class token keyword class span span class token class name SARIndicator span span class token punct
  • 【Python 量化交易】SMA技术指标

    SMA Source Code span class token keyword class span span class token class name SMAIndicator span span class token punct
  • 【Python 量化交易】KDJ技术指标

    KDJ Source Code span class token keyword class span span class token class name KDJIndicator span span class token punct
  • 【Python 量化交易】CCI技术指标

    CCI Source Code span class token keyword class span span class token class name CCIIndicator span span class token punct
  • 【Python 量化交易】EMA技术指标

    EMA Source Code span class token keyword class span span class token class name EMAIndicator span span class token punct
  • 【量化交易】股票价格前复权与后复权的区别以及注意事项

    时不时就会看到到底是用股票前复权还是后复权价格的讨论 xff0c 比如下面就是一个很经典的问法 xff1a 我用前复权价格计算指标的时候 xff0c 发现会出现负价格 xff0c 就没法取log了 xff0c 应该是分红太多导致的 xff0
  • 决策树分类器DecisionTreeClassifier参数解释

    sklern中使用sklearn tree DecisionTreeClassifier类来实现决策树分类算法 模型调参常用参数如下 名称 功能 描述 criterion 特征选择标准 gini or entropy default gin
  • 跨品种套利 - 期货

    1 原理 什么是套利 套利是指在买入或卖出一种金融资产的同时卖出或买入另一种相关的金融资产从中利用价差获得套利的过程 什么是跨品种套利 当两个合约有很强的相关性时 可能存在相似的变动关系 两种合约之间的价差会维持在一定的水平上 当市场出现变
  • 以衍复为例,聊聊当下的沪深300指数增强

    最基础的问题 什么是沪深300指增 沪深300指数增强策略 对标沪深300指数 它利用量化投资的方式进行主动选股 很多管理人已经是全市场选股 在获取 指数 收益的同时 获取超越市场的 收益 能否长期获得稳定的 收益是衡量管理人水平的重要评判
  • 套利策略的工作原理

    统计套利起源于 1980 年代左右 由摩根士丹利和其他银行主导 统计套利策略 也被称为 StatArb 见证了金融市场的广泛应用 该策略的流行持续了二十多年 并围绕它创建了不同的模型以获取巨额利润 简单来说 统计套利由一组量化驱动的算法交易
  • 西蒙斯的赚钱秘籍:隐马尔科夫模型(HMM)的择时应用

    摘要 西蒙斯是被量化圈所广为追捧的量化之神 旗下的大奖章基金创造了无数神话 成立初期的创始人中 有一位科学家发明了广泛应用在语音识别等领域的鲍姆 威尔士算法 隐马尔可夫模型 HMM 已经被成功应用在工程领域 并取得了具有科学意义和应用价值的
  • 区块链三加一:什么是量化交易

    量化交易是指以先进的数学模型替代人为的主观判断 利用计算机技术从庞大的历史数据中海选能带来超额收益的多种 大概率 事件以制定策略 极大地减少了投资者情绪波动的影响 避免在市场极度狂热或悲观的情况下作出非理性的投资决策 量化交易 有时候也称自
  • python定时运行,多进程

    可以通过另开一条线程 去专门做这件事情 py2代码如下 如果是py3请自行调整下语法 coding utf8 import threading import time 真正要执行的函数 def t1 print ok 每隔10秒钟执行 de
  • 行业轮动策略(思想+源码)

    一 行业轮动策略简介 行业轮动是利用市场趋势获利的一种主动量化投资交易策略 其本质是利用不同投资品种强势时间的错位对行业品种进行切换以达到投资收益最大化的目的 通俗点讲就是根据不同行业的区间表现差异 性进行轮动配置 力求能够抓住区间内表现较
  • quantopian寻找策略之mean_reversion

    股价有向均线回归的趋势 利用这个特点 可以在技术指标处于超卖阶段寻找那些上涨速度快的流通性好的股票买入 形成下面的策略 策略来源quantopian 对于市场上流通性最好的1500只股票在pipeline中先进行一波过滤 1 年收益率排名前
  • 量化交易项目怎么做

    同学们前面两期量化交易内容 Python量化交易入门 量化交易的历史 文章目录 学习目标 1 量化交易研究流程 1 1 分析结果 1 2 什么是策略 1 3 流程包含的内容 二 量化开发和研究岗位的要求 学习目标 1 说明量化交易的研究流程
  • Python金融系列第四篇:置信区间和假设检验

    作者 chen h 微信号 QQ 862251340 微信公众号 coderpai 第一篇 计算股票回报率 均值和方差 第二篇 简单线性回归 第三篇 随机变量和分布 第四篇 置信区间和假设检验 第五篇 多元线性回归和残差分析 第六篇 现代投
  • 基于置换均线的二次穿越突破均线

    1 名词解释 置换均线 移位移动平均线也称置换移动平均线 置换均线 DMA 不是将当根bar上计算的均线值画上当根bar上 而是将历史的均线值画在当根bar上 使均线值整体向未来偏移了指定数量的bar 将移动平均K线向后平移一定BAR数即为
  • 【笔记】用python计算BS模型、隐波的笔记

    前言 这篇笔记是根据姜禄彬老板在公众号上发布的笔记复刻的 不同的是原作者用的是股票数据 我用的是比特币期权数据 这份笔记里主要是如何用python代码来计算BS模型 如何求隐含波动率 什么是波动率微笑 greeks等 整体还是有点乱 之后有

随机推荐

  • 操作系统复习指南

    文章目录 前言 一 中断 1 中断的分类 2 硬中断和软中断 二 系统调用 1 什么是系统调用 三 进程 1 什么是进程 2 进程的组织方式 3 进程的特征 4 进程的几种状态及其转换 5 进程间的通信 6 进程的调度 7 作业调度算法 8
  • ua获取手机型号_如何根据 UA 判断手机型号和厂家?

    开门见山 拿下面2个 ua 来举例 Mozilla 5 0 Linux U Android 8 1 0 zh cn PBEM00 Build OPM1 171019 026 AppleWebKit 537 36 KHTML like Gec
  • idea中yml配置文件编写规范

    yaml文件实际是用YAML语言编写的 YAML简述 如下 1 语法特点 大小写敏感 通过缩进表示层级关系 禁止使用tab缩进 只能使用空格键 缩进的空格数据不重要 只要相同层级左对齐即可 使用 表示注释 2 yaml支持的数据结构有三种
  • 11,输出保留3位小数的浮点数

    读入一个浮点数 保留 3 位小数输出这个浮点数 输入格式 只有一行 一个浮点数 x 105 x 105 输出格式 也只有一行 保留 3 位小数的浮点数 输出时每行末尾的多余空格 不影响答案正确性 样例输入 12 34521 样例输出 12
  • MySQL几个问题:Column 'XXXX' in where clause is ambiguous,去除重复项,mybatis报错

    最近工作西街口 遇到MySQL Mybatis相关的几个问题 大概讲一下问题发生情况 解决办法和原因 一 Column create time in where clause is ambiguous 问题 这个不管你是在IDEA的控制台看
  • git查看远程仓库(git remote)

    实例 描述 git remote v 查看远程仓库地址 git remote show origin 查看远程仓库信息
  • 15. Canvas制作汽车油耗仪表盘

    1 说明 本篇文章在14 利用Canvas组件制作时钟的基础上进行一些更改 想查看全面的代码可以点击链接查看即可 效果展示 2 整体代码 import QtQuick 2 15 import QtQuick Controls 2 15 It
  • 深度学习——时间序列模型评价指标总结

    大Y老师 小X 你做的这个时间序列模型用什么指标评价啊 小X 直接把这篇甩给老师 老师您看哪个指标顺眼 就选哪个指标 最近在实现基于深度学习的时间序列模型时 需要对模型进行评价 总结了一些常用的和不常用的评价指标 还有相关概念的辨析 上面是
  • 谷粒学院——Day09【整合阿里云视频点播】

    作者主页 Java技术一点通的博客 个人介绍 大家好 我是Java技术一点通 记得关注 点赞 收藏 评论 认真学习 共同进步 视频点播简介 一 阿里云视频点播技术能力盘点 视频点播 ApsaraVideo for VoD 是集音视频采集 编
  • 图计算:社区发现算法

    一 定义什么是社区 社区是一种局部性结构 该局部性结构内部连接紧密 而不同的局部性结构之间连接稀疏 这种局部性结构是社区 主要应用 好友推荐 广告推送 二 如何评价一个社区的分类好坏的情况 用Modurity衡量 三 社区发现算法 算法1
  • ESP8266开发板+mysql数据库+DHT11

    wemos D1 wifi ESP8266开发板连接mysql wemos D1 wifi ESP8266开发板是一款基于esp8266的开发板 使用这个开发板可以很方便的连接wifi 同时这个开发板有很多IO口供我们使用 这个开发板的可以
  • WPS Office 2019政府定制版本 2019.1.15版

    1 广东省 广东省政府机关单位 http wpspro support wps cn gov guangdong WPS Office 2016 专用版 10 8 0 6423 潮州市党政机关单位 http wpspro support w
  • 基于FPGA的频率计设计

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 频率计是什么 二 使用步骤 1 测量方法 2 测周方法 3 系统框图 总结 前言 所谓 频率 就是周期性信号在单位时间 秒 内变化的次数 一 频率计是什么
  • 线性代数的几何意义(一)——线性代数的意义

    线性代数的几何意义 一 一 线性 代数 的意义 何为 代数 代数 一词的英文是Algebra 源于阿拉伯语 其本意是 结合在一起 就是说代数的功能就是把许多看似不相关的事物 结合在一起 也就是进行抽象 抽象的目的不是故弄玄虚 而是为了更好的
  • zabbix配置钉钉告警、和故障自愈、监控java

    文章目录 1 配置钉钉告警 server 配置 web界面创建媒介 给用户添加媒介 测试告警 实现故障自愈功能 监控Java zabbix server 安装java gateway 配置 Zabbix Server 支持 Java gat
  • 【深度学习】 Python 和 NumPy 系列教程(十五):Matplotlib详解:2、3d绘图类型(1):线框图(Wireframe Plot)

    目录 一 前言 二 实验环境 三 Matplotlib详解 1 2d绘图类型 2 3d绘图类型 0 设置中文字体 1 线框图 Wireframe Plot 一 前言 Python是一种高级编程语言 由Guido van Rossum于199
  • 信号覆盖 蓝桥杯模拟

    信号覆盖 暴力模拟 问题描述 小蓝负责一块区域的信号塔安装 整块区域是一个长方形区域 建立坐标轴后 西南角坐标为 0 0 东南角坐标为 W 0 西北角坐标为 0 H 东北角坐标为 W H 其中 W H 都是整数 他在 n 个位置设置了信号塔
  • postgresql之pgbackrest备份恢复

    1 安装pgbackrest yum install y https download postgresql org pub repos yum reporpms EL 7 x86 64 pgdg redhat repo latest no
  • 重塑未来:AI对教育行业的深远影响与挑战

    自从AI人工智能的发展进入 iPhone时刻 以来 我们已身处一个日新月异的时代 在众多领域 AI已经大放异彩 而教育作为培养下一代的关键领域 自然也受到了这场科技革命的影响 AI对教育行业重大影响 最近可汗学院 Khan Academy
  • Python金融系列第四篇:置信区间和假设检验

    作者 chen h 微信号 QQ 862251340 微信公众号 coderpai 第一篇 计算股票回报率 均值和方差 第二篇 简单线性回归 第三篇 随机变量和分布 第四篇 置信区间和假设检验 第五篇 多元线性回归和残差分析 第六篇 现代投