大家好,我是讯享网,很高兴认识大家。
经济学不是一门精确的科学:它只包含概率法则。所以,最谨慎的投资者是那些只追求“通常”正确的一般做法,避免“通常”错误的行为和政策的人。——L.L.B.Angas
PART01 统计学基础概念
01数据中心趋势(中心趋势)
平均律是一个被严重误解和错误引用的原则。在交易中,当一长串的异常亏损预期被等量相反的利润抵消时,平均法则是最常被提及的。同样,认为当前高估或超买的市场下一步将被低估或超卖的想法也是错误的。这不是平均律的意义。在大样本中,大多数事件将分散到接近平均值的位置,以使典型值压倒异常事件,使其变得无关紧要。长期盈利、亏损或异常持续的价格波动只是极个别的异常事件,随着时间的推移会被大量的正常事件所抵消。
算术平均值
平均值分为简单算术平均值和加权算术平均值。主要适用于数值型数据,不适用于质量型数据。根据表达形式的不同,算术平均值有不同的计算形式和公式。
算术平均是加权平均的一种特殊形式(每一项的权重相等)。在实际问题中,当权重不相等时,计算平均值时应采用加权平均值;当权重相等时,应使用算术平均值来计算平均值。
其中Pi代表某一时间价格。算术平均是统计学中最基本、最常用的平均指标。各数据互不影响,独立存在。算术平均数容易受到极端数据的影响,因为平均数是敏感的,数据的每一个大的或小的变化都会影响最终的结果。
加权平均数(加权平均数)
VWAP代表成交量的加权平均价格,p是价格,v是成交量。算术平均值同时受两个因素影响,一是每组数值的大小,二是每组的分布频率。当值不变时,一个组出现的频率越多,该组的值对平均值的作用越大,反之则越小。
几何平均数(几何平均数)
几何平均数是指n个观测值的连续乘积的第n个根。几何适用于连续时间内平均变化率的任何问题,即对比率和指标进行平均,如投资收益率、某项利润的增长率等。除了年增长率,还可以描述季度、月、周、日的平均增长率。
相当于
其中:样本数据非负,主要用于对数正态分布。
比如一项投资,第一年收益率100%,第二年亏损50%,算出平均收益率。如果使用算术平均值,[100%+(-50%)]/2=25%。用几何平均数计算:(1+R)(1+R)=(1+100%)(1-50%);r = 0;几何平均收益率为0%。就是这两年不涨不跌,符合实际情况。投了100万,一年后变成了200万,第二年还是100万。
调和平均值(调和平均值)
调和平均值是每个变量值的倒数的算术平均值的倒数,也称为倒数平均值。因为调和平均值是算术平均值的倒数,小值的倒数大于大值的倒数,调和平均值也容易受到极值的影响,最小值比最大值受影响更大。调和平均是另一种时间加权平均,但它不会高于或低于几何平均。
也就是说,
调和平均值可用于计算相同距离但不同速度下的平均速度。在股票的应用中,可以计算多只股票进行组合投资的市盈率,计算基金/股票定投的平均成本,比如每个月定投N元,1月10元/股价,2月9元/股价,3月8元/股价。假设平均股价为P,则可以根据总股数等于三次买入之和得出:
等式两边同时包含N,可见平均成本的计算与每个月的定投金额无关。约N后,每股成本可为:
,小于(10+9+8)/3=9元/股(算术平均)。
调和平均数<几何平均数<算术平均数。只要有一个变量值为零,就不能计算调和平均数。当组距数列有开口组时,其组中值即使按相邻组距计算了,假定性也很大,这时,调和平均数的代表性就很不可靠。调和平均数应用的范围较小,调和平均数多用于已知分子资料,缺分母资料时。
价格分布
分布的测量非常重要,因为它告诉你通常会发生什么。我们无法知道上证指数明天的收盘价是多少,但如果目前的收盘价是3000点,那么我们对指数今年会跌到2500点至3500点之间的信心很高,但对它会跌到3100点至3300点之间的信心很低,对它会跌到3150点至3250点之间的信心更低,几乎很难选择确切的区间。测量可以设定事件发生的概率或置信水平。
中位数和众数
中位数和众数常用来定义分布。中位数,或“中间术语”,有助于建立数据的“中心”;数据排序时,是中间值。中位数的好处是不受极值的影响,极值会扭曲算术平均值;缺点是必须对所有数据进行排序才能找到中间点。中位数比平均数好,除非使用的项目数量非常少。模式是出现频率最高的数字。熊猫可以分别计算中位数、分位数和众数函数。
02数据可变性(可变性)
概率的阶矩描述了每个数据点的形状,并且这些数据点围绕平均值聚集。所谓的阶矩有四种,即均值、方差、偏度和峰度。每个阶矩反映了不同的分布模式。简单来说,均值是中心值或平均值,方差是每个数据点与平均值之间的距离,偏度是平均值向左或向右的倾斜度,峰度是相关数据聚类的峰值。
方差(二阶矩)
标准差是方差的平方根,它反映了数据序列中可变性的平均数,即距均值的平均距离。
其中pi代表系列I的价格,p代表系列的平均值。
统计中,标准差分为两种:
总体标准差:标准差公式根号内除以n,是有偏的。样本标准差:标准差公式根号内除以n-1,是无偏的。
pandas与numpy在计算标准差时的区别
numpy:在numpy中计算标准差时,括号内要指定ddof的值,ddof表示自由度,当ddof=0时计算的是总体标准差;当ddof=1时计算的是样本标准差,当不为ddof设置值时,其默认为总体标准差。在使用pandas计算标准差时,其与numpy的默认情况是相反的,在默认情况下,pandas计算的标准差为样本标准差。
标准误差(标准误差)
在整个交易系统的开发和测试过程中,我们想知道我们看到的结果是否和预期的一样。答案总是取决于数据样本的大小和这个时期典型数据的方差。标准误差(SE),或称标准误差,是在抽样测试或重复测量中计算出的样本平均值的标准偏差。标准利用多个数据样本给出基于数据分布的误差估计,就是确定样本均值与所有数据实际均值的差值,解决数据一致性问题。
其中Var代表样本均值的方差,n是样本均值的观测值。样本均值是指多次采样数据,每次采样有n个数据点,利用这些样本的均值可以求出方差。
注意标准差和标准差是两个不同的概念!标准差是个体变异的指标,反映了整个样本对样本均值的可变性。一般用来表示,而标准误反映的是样本均值对总体均值的变化和抽样误差的大小。一般用表示,主要用于统计推断,包括假设检验和参数估计,如样本均值的假设检验和参数的区间估计。标准误差等于标准差
偏差(三阶矩)
偏度度量随机变量概率分布的不对称程度,是相对于平均值的不对称程度的度量。通过测量偏度系数,可以确定数据分布的不对称程度和方向。偏度的度量是正态分布的偏度相对于正态分布为0,即如果数据分布是对称的,偏度为0。如果偏度大于0,说明分布是对的,即右边有长尾;如果偏度小于0,则分布为左,即左边有长尾(如下图所示);同时,偏度的绝对值越大,分布的偏离程度越严重。
关于价格和时间的关系,市场在低价位运行的时间越长,可以用偏斜度来衡量,偏斜度是一种对称分布的扭曲,使曲线看起来左边短,右边长(价格较高)。向两侧延伸的曲线覆盖了尾部形状,向右延伸的尾部称为正偏差,向左延伸的尾部称为负偏差。数据分布的左或右偏差指的是数值尾部的方向,而不是峰值的位置。几乎所有的价格分布都有一个正的趋势,即右边价格越高的尾部越长。
在一个完美的正态分布中,它的均值、中位数和众数应该是完全一致的。当价格呈现正趋势时,即对应的时间序列与更高的价格相关,那么均值与最大变化相关,众数与最小变化相关,中值介于两者之间。我们可以用概率分布的标准差来调整均值和众数的离散差,进而计算出更可靠的偏度值。
其中n是相应分布中的价格数量;是相关价格的标准差。
正态分布有以下特点:众数<中位数中位数>平均数。在对称分布中,这三个值是相等的。
(图片来源:交易系统和方法)
峰度(四阶矩)
峰度是研究数据陡峭或平滑分布的统计量。通过测量峰度系数,我们可以确定数据是否比正态分布更陡或更平。比如正态分布的峰度为0,均匀分布的峰度为-1.2(平缓),指数分布的峰度为6(陡峭)。定义为四阶中心距离除以方差的平方。
若峰度≈0,分布的峰态服从正态分布;若峰度>0,分布的峰态陡峭(高尖);若峰度<0,分布的峰态平缓(矮胖);
在金融市场中,峰度大于0表示没有趋势,峰度小于0表示有趋势。偏差大于0可以解释为数据收敛的正趋势,偏差小于0可以解释为数据收敛的负趋势。偏斜度的度量有助于我们得到一个公允的评估值,从而判断相关市场是跟风运行还是横向调整。如果你看到价格稳步上升,那么它对应的分布范围会覆盖更广的范围,呈现统一的态势,这就是负峰度;如果价格在区间内波动,其分布频率会围绕均值聚集,为正峰度。
经常使用溢出峰,这样更容易发现所谓的非正态分布。溢出峰KE=K-3,因为正常峰度值是3。
峰值是指规模相近的盈利交易数量压倒性,但在现实交易中,这是不可能的。所以,对于任何峰值,我们都应该立即采取怀疑的态度。
(图片来源:交易系统和方法)
当分布的尖点高于正态分布的尖点时,我们将其视为正峰值状态,反映了一个典型的盘整行情;当对应的市场表现出明显的趋势,呈现平坦分布的情况时,我们将其视为负峰状态。
03相关性
皮尔逊相关系数
在统计学中,皮尔逊相关系数又称皮尔逊积矩相关系数(简称PPMCC或PCCs),用于衡量两个变量X和Y之间的相关性(线性相关),其值在-1和1之间。
计算公式可以表示为:
如果大于0,表示正相关;如果小于0,表示负相关;如果等于0,则表示没有相关性。请注意,有一个常见的误解,即零相关性意味着没有相关性。实际上,相关性只严格衡量两个变量之间的线性关系。例如,对于一个U型或V型对称函数,两个变量的相关系数为0,但两个变量之间存在非线性关系。
自相关(自相关)
相关性或自相关性是指数据中存在持续性或趋势性,意味着可以从过去的数据中预测未来的数据(在一定程度上)。计算自相关的一个简单方法是计算时间序列与其他滞后期(或2,3,4等)的相关系数。)(可以通过熊猫的矢量化运算轻松实现)。计算自相关的正式方法是使用Durbin-Watson检验,它给出D统计量。该方法测量误差(E)的变化以及N个数据点与其平均值之间的差异。
d的值总是在0和4之间。如果d=2,则不存在自相关。如果d远小于2,则存在正自相关;但如果低于1,则误差的相似性比合理的多。d大于2越远,误差项中出现的负自相关越多。正自相关或序列相关意味着正误差因子可能跟随另一个正误差因子。
0T统计
T检验(又称学生T检验)是W. S. Gossett为了观察葡萄酒酿造的质量而提出的。它利用t分布理论来推断差异的概率,从而比较两个平均数之间的差异是否显著,适用于小样本量(n < 30),总体标准差未知的正态分布。当在分布中使用较少的价格或交易时,我们可以预期曲线的形状更加多变。比如可能是散开,这样分布的峰值会低一些,尾部会高一些。t是根据其自由度(df)计算的,即N–1,其中N是样本大小,即分布中使用的价格数量。
样本中的数据越多,结果越可靠。随着样本量n的增加,t的值接近尾部区域的标准正常值。
在测试交易系统时,自由度可以是策略产生的交易数量。当交易很少时,结果可能不代表您将从更长的交易历史中获得什么。在测试策略时,会发现交易的数量与策略中使用的参数或变量的数量之间存在类似的关系。你使用的变量越多,你需要进行的交易就越多,这样才能在可接受的信心水平下创造预期。
t检验分为单样本检验、相关配对检验和独立双样本检验。
单样本t检验主要检验单个样本的平均值是否等于目标值,如某只个股在某段时间周期内的平均收益率是否等于市场平均收益率(如上证综指)。相关配对t检验是检验相关或配对观测之差的平均值是否等于目标值,如为了检测业绩增长公告是否能带来超额收益,对发布业绩增长公告的公司公告前N日(如N=3)和公告后N日的收益率进行比较,检验是否存在显著差异。独立双样本检验是检验两个独立样本的平均值之差是否等于目标值,如检验某个交易策略在不同的交易期间内是否表现一致。
其中,和分别是价格在期间1和期间2的平均值,和分别是价格在期间1和期间2的标准差,和分别是期间1和期间2的样本数量(观察值)。
PART 02 Python代码实现
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport tushare as tssns.set_style(“darkgrid”)from pylab import mplmpl.rcParams[‘font.sans-serif’]=[‘SimHei’]mpl.rcParams[‘axes.unicode_minus’]=False
### 计算标准正态分布0-1之间的概率def normal_pdf(x, mu=0, sigma=1): sqrt_two_pi = np.sqrt(2 * np.pi) pdf=(np.exp(-(x-mu) ** 2 / 2 / sigma ** 2) / (sqrt_two_pi * sigma)) return pdfmu = 0 # 均值为0sigma = 1 # 标准差为1#用统计模拟绘制正态分布的直方图plt.figure(figsize=(12,6))sample = np.random.normal(mu, sigma, size=10000)plt.hist(sample, bins=100, alpha=0.7, density=True)print(pd.Series(sample).describe())#根据正态分布的公式绘制PDF曲线x = np.linspace(-4, 4, 300)y = normal_pdf(x, mu, sigma)plt.plot(x,y, color=’orange’, lw=3,label=’$\mu=0,\sigma=1#39;)plt.legend()plt.show()
count 10000.000000mean -0.019925std 0.995619min -3.45384525% -0.69758150% -0.00990375% 0.660925max 4.106088dtype: float64
以下是使用Python的描述性统计分析,以全球指数交易数据为分析样本。使用efinance包获取全局索引数据。efinance相当于东方财富网数据的爬虫。
#使用pip install efinance安装efinance包用于获取交易数据import efinance as effrom tqdm import tqdmglobal_indexs=[‘道琼斯’,’标普500′,’NDX’,’上证指数’,’深证成指’,’沪深300′, ‘创业板指’,’上证50′,’中证500′,’恒生指数’,’英国富时’,’法国CAC40′,’德国DAX’, ‘日经225′,’韩国KOSPI’,’澳大利亚标普200′,’印度孟买SENSEX’,’俄罗斯RTS’,’加拿大S&P’, ‘台湾加权’,’美元指数’,’路透CRB商品指数’]#NDX为纳斯达克指数index_data=pd.DataFrame()for index in tqdm(global_indexs): index_data[index]=ef.stock.get_quote_history(index).set_index(‘日期’)[‘收盘’]index_data.rename(columns={‘NDX’:’纳斯达克’},inplace=True)
100%|██████████████████████████████████████████████████████████████████████████████████| 22/22 [00:10<00:00, 2.11it/s]
sns.pairplot(index_data[[‘上证指数’,’深证成指’,’沪深300′,’创业板指’,’上证50′,’中证500′]]);
从成对相关和个体分布图来看,国内主要指数之间存在较强的相关性,分布呈现“左背离(负背离)、右长尾”的特征,即大部分时间处于低位数(低收益),短时间处于高位数(异常高收益),这也反映出波动程度可能非常大。
sns.pairplot(index_data[[‘上证指数’,’标普500′,’法国CAC40′,’德国DAX’,’日经225′]]);
相关系数热图
cols=[‘沪深300′,’恒生指数’,’标普500′,’英国富时’,’法国CAC40′,’德国DAX’,’日经225′,’韩国KOSPI’,’澳大利亚标普200′,’印度孟买SENSEX’,’台湾加权’]index_data[cols].corr()
全球指数之间存在一定的相关性,同一地域的相关性非常明显,甚至高达0.98,如标准普尔和道琼斯指数。沪深300与全球其他市场指数的相关性均超过0.65,最高为0.77。ax = plt.subplots(figsize=(12, 8))#画布大小ax = sns.heatmap(index_data[cols].corr(),annot=True,cmap = “Reds”);#annot=True 表示显示系数# 设置刻度字体大小plt.xticks(fontsize=12);plt.yticks(fontsize=12);
计算各指标间的移动相关系数。
def cal_roll_cor(data=index_data,index1=’沪深300′, index2=’标普500′,period=120): data=data.dropna() cors=data[[index1,index2]].rolling(period).corr() cors=cors.dropna().iloc[1::2,0] cors=cors.reset_index() cors=cors.set_index(‘日期’) cor=cors[index1] #可视化结果 print(cor.describe()) cor.plot(figsize=(14,6),label=f’移动{period}日相关系数’) plt.title(f'{index1}与{index2}移动{period}日相关系数’,size=15) plt.axhline(cor.mean(), c=’r’,label=f’相关系数均值={cor.mean():.2f}’) plt.legend(loc=2) plt.show() return
cal_roll_cor()
count 1756.000000mean 0.395825std 0.504222min -0.85131425% 0.15275850% 0.60851575% 0.732023max 0.950947Name: 沪深300, dtype: float64
创业板指数与纳斯达克指数的移动相关系数。
cal_roll_cor(data=index_data,index1 = & # 39宝石是指& # 39;,index2 = & # 39纳斯达克& # 39;,period = 120)
计数1756.00000
平均值0.429181
标准值0.521487
最小值-0.896746
25% 0.290088 [
各种指数回报的描述性统计
def cal_ret_des(data=index_data,period=’W’): data.index=pd.to_datetime(data.index) #删除缺失值 data=data.dropna() rets=(data/data.shift(1)-1) ret_M=rets.to_period(period) ret_M=ret_M.groupby(ret_M.index).apply(lambda x:((1+x).cumprod()-1).iloc[-1]) result=ret_M.describe().T result[‘skew’]=ret_M.skew(axis=0) result[‘kurt’]=ret_M.kurt(axis=0) #返回根据均值排序后数据 return result.sort_values(‘mean’,ascending=False)
#周收益率对比cal_ret_des()
#月收益率
cal _ ret _ des(period = & # 39;M & # 39)
#年收益率
cal _ ret _ des(period = & # 39;Y & # 39)
指数价格的统计分布。
#考虑到各指数点位差别较大,数据归一化或标准化处理def normalization(data,flag=True): data=data.dropna() if flag: return (data-data.min())/(data.max()-data.min()) else: return (data-data.mean())/data.std()
from pylab import mplmpl.rcParams[‘font.sans-serif’]=[‘SimHei’]mpl.rcParams[‘axes.unicode_minus’]=Falsecols2=[‘沪深300′,’恒生指数’,’标普500′,’英国富时’,’法国CAC40′,’德国DAX’,’日经225′,’韩国KOSPI’]data=normalization(index_data,flag=False)data[cols2].plot(kind=’kde’,figsize=(14,8));
参考:Kaufman P J .交易系统与方法,+网站[M]。威利出版社,2013年。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/13142.html