股票学习网

股票行情网,股票入门,和讯股票,股票查询 - - 股票学习网!

德马克指标在哪儿(德马克指标公式源码)

2023-04-20 02:13分类:价值投资 阅读:

文|树洞档案

编辑|树洞档案

前言

指向系统的作用是将望远镜指向所需的目标,并跟踪该目标。

早期的地面望远镜都是赤道型的,一旦指向所需的目标,就只需要围绕极轴以恒定的速度(15/秒)旋转来跟踪目标,这种时角运动是由时钟机制,最近又由同步电机产生。

指向和控制

由于需要更好的精度和调节,所有的现代望远镜现在都使用“反馈控制”,即旋转轴的实际运动不断地与期望值进行比较,误差被反馈给驱动系统。

反馈控制本质上更精确,不仅消除了高精度传动和驱动系统,它还允许纠正位于其带宽范围内的干扰。

在地面上,扰动的主要来源是重力、热致扭曲和风,在空间中,扰动包括重力梯度、太阳压力和航天器内部的激励。

望远镜结构和光学的目的是设计控制系统,回顾伺服系统的基础知识,并看看望远镜控制系统通常的实现方式。

我们还将描述各种类型的执行器和传感器,并检查干扰的来源和通过隔离来减轻它们的方法。

指向要求

对指向系统的要求是由天文台的科学计划、所期望的观测效率和最终要达到的角度分辨率来设定的,下表列出了基于Keck和哈勃望远镜的地面望远镜和太空望远镜的典型值:

光学望远镜的绝对指向精度要求通常是1立毫秒,这在校准后很容易实现,并且对大多数观测就足够了,当需要更好的精度时,最好通过使用来自校准恒星的“盲偏移”来直接参考天空。

对于地面望远镜和太空望远镜,这些精度分别优于0.1和0.01,地面望远镜的跟踪稳定性通常在几分钟的时间内优于0.1。

通过关闭导星的环,就消除了漂移,地面望远镜的视线抖动通常低于20毫毫弧秒,HST的视线抖动通常低于几毫弧秒。

系统建模

望远镜控制系统的设计,包括创建一个数学模型的物理方面和特性的望远镜包括传感器和执行器,建模也干扰,然后应用传统的控制系统分析技术,来确定最优控制参数将最大化指向和跟踪性能。

对于较小的望远镜,一个局限于该结构的简单模型就足够了,人们甚至可以在不建模干扰的情况下通过,然而,随着望远镜的尺寸和复杂性的增加,有必要对光学力学进行更详细的建模,并分析扰动的影响。

指向和控制对于非常大的地面望远镜和太空望远镜是绝对必要的,它们需要仔细优化以降低质量和最大化性能。

对于结构分析,望远镜最好用有限元模型(FEM)进行分析,然而,为了设计指向控制系统,最好使用“集总质量模型”,即由安装在弹簧和减振器上的质量表示,模拟结构和驱动机构的灵活性以及支撑轴上的摩擦。

既然有限元模型已经开发用于结构分析,为什么要创建一个总质量弹簧模型?

第一个原因是,综合质量模型很适合于传统的动态和控制分析。

但还有其他几个实际原因

在实践中,望远镜控制系统的设计涉及不超过最低的三到四个主要模态频率,因此使用复制最低模态形状的集总质量弹簧模型是完全合适和充分的。

模式形状和频率是全局特性,而应力和偏转是局部特性,这意味着结构上相当显著的局部变化除了频率上的轻微变化外,对整体性质的影响很小。

这允许控制系统和结构细化工作是独立的,并沿着独立但并行的路径进行,一旦创建了总质量模型,它可以通过改变弹簧的值快速调谐到一个固有频率范围。

因此,控制设计者可以通过探索广泛的潜在结构频率来限制他的设计问题。

这有助于他创建一个对真实系统频率的有限元分析预测中的潜在误差不敏感的鲁棒设计。

在集中质量模型,非线性的位置如反弹,命令和传感器量化,时间延迟,非线性弹簧,摩擦模型,等等可以很容易地完成,因为有一个直接、物理、一对一对应的质量和弹簧在集中质量模型和系统的真实特性,这些组件可以附加。

如果自由度数很大,这种非线性往往会导致非收敛的数值积分问题,如典型的有限元模型。

另一方面,一旦控制系统设计确定,最好回到基于有限元模型的表示,将结构和控制模型与光学和热模型结合,形成望远镜的“集成模型”。

这为望远镜系统创造了一个更忠实的表现,允许验证集总质量模型的发现,并探索涉及光学和热环境的二阶效应。

一级集总质量模型

集总质量模型的第一次迭代是假设光学元件是无限刚性和刚性安装在结构上的。

换句话说,虽然考虑了结构的基本柔性模式,但并没有试图确定光学元件各自的位置或视线上到底发生了什么。

然而,这种基本的模型在伺服系统和驱动器的初步设计中仍然是有用的

管和安装表示为惯性矩集总质量JT和JM,其中指标T和M分别表示管和安装,这些质量被安装在扭转弹簧、KT和KM上,模拟结构和驱动器的灵活性,阻尼器BT和BM模拟轴上的静态或动态摩擦。

每个轴由电机驱动,电机通过减速比N的齿轮或辊系统施加转矩τ,以控制管和安装的角度位置,这些控制系统动态行为的微分方程可以纳入控制系统模拟模型。

中型集中质量光学力学模型

随着设计的发展,有必要对望远镜的结构和机械装置进行更详细的建模,并监测光学视线,而不是简单的管波距。

然而,光学元件(镜段或镜段)仍然被认为是无限刚性的,当这显然不是这样时,例如半月板主镜,假设一个单独的控制系统负责保持镜的形状独立于结构的变形,使它看起来是刚性的。

中型总质量模型通常是伺服系统设计所需要的,作为一个例子,用于设计VLT控制系统的模型是一个八自由度模型。

其中包括主镜及其单元的线性位移、辅助镜、管的中心件和安装,以及管的中心件的角度旋转、安装和高度驱动,该模型提供了主镜和副镜的位置,从中可以相当简单地确定视线的方向。

集成模型

如果到目前为止所描述的简单数学模型足以设计控制系统,那么它们就没有足够的保真度来提供望远镜性能的端到端分析。

为此,我们必须把望远镜表示为一个完整的系统。这种精细化设计方法的基础在于结构、控制、光学和热模型的良好网格组合。

指向和控制和扰动力矩作为结构和机械装置的高保真有限元模型的输入,进而将光学支撑点的运动提供给光学光线跟踪程序,从该程序可以导出瞬时视线和波前误差。

然后将这些模型与热系统和控制系统以及执行器和传感器的模型相结合,形成整个望远镜系统的完整数学表示。

这种模型的共生关系被称为“集成建模”,然后,当应用模拟的热或机械干扰时,集成模型可以找到整个系统的响应。

集成建模本身并不是一个设计工具:传统的光学、结构、热学和控制系统的设计方法仍然必须在这些领域中使用。

然而,集成建模提供了一种方法来调查系统对各种起源的干扰的行为,玩“假设游戏”,并以半经验的方式调整设计。

在控制系统分析中使用动态模型之前,通常需要对其进行“除草”,因为低振幅、高频的结构模式可以通过动力镜极大地放大,因此有必要将动态分析推到相当高的频率,比如100 Hz或更多。

大量的模态会导致控制系统分析的过度复杂,最好通过消除不重要的模态来覆盖一个大的频率范围,而不是保留所有的模态和限制频率范围。

这种除草是通过查阅模态特征表和消除具有低光灵敏度和低动能的模态来完成的。

阻尼

动态分析的另一个组成部分是阻尼,望远镜对指向的可重复性有严格的要求,在跟踪过程中会引起突然跳跃,必须最小化。

这要求避免施工或部署接头或高预加载,并消除所有内摩擦源,当采取这些预防措施时,望远镜的结构已接近于整体,这反过来又意味着望远镜的阻尼率很低

由于使用了高弹性模量的材料和没有轴承摩擦,空间望远镜的阻尼甚至更低,约为0.01,事实上,空间望远镜的阻尼接近于纯材料的阻尼。

低温空间望远镜由于随着温度的材料阻尼系数减小,并在温度接近绝对零度时接近零而面临恶化的情况。

Zener为晶体和金属材料建立了材料阻尼模型,并被证明是温度、振动频率、材料刚度和热膨胀系数等参数的函数,实验表明,该模型可以很好地预测室温条件,但对低温环境存在差异。

虽然材料阻尼是温度的线性函数,预计在低温下将趋近于零,但热膨胀系数的二次效应和低温下热导率和热弛豫的变化抵消了这一趋势。

它在室温下从约0.1%下降到30 K时的约0.001%,对于铍,在低温下的阻尼下降更明显,因为对于这种材料,热膨胀系数在低温下也急剧下降,阻尼也强烈地依赖于振动频率。

低阻尼导致非常明显的谐振模式,这使得在伺服设计中难以避免不稳定性,在某些情况下,可能需要通过在静液压轴承中使用液压阻尼器或高粘度油来提高阻尼。

热模型

对于热建模,一个通常依赖于两个模型:一个是基于相对粗糙的网格的整个天文台的系统级模型,另一个是望远镜模型,更详细地覆盖结构,包括结构和光学内的导电和辐射路径,望远镜模型的边界节点由系统级模型得到。

然后使用这些模型来确定各种操作条件下(旋转、瞬态、所谓的“冷热条件”等)的温度场,该输出作为结构有限元模型的输入,以确定望远镜结构和光学的热诱导位移。

光学灵敏度

支持光学器件的结构的位移和光学元件的变形会导致视线的偏移,并伴有潜在的波前退化。将物理位移转化为视线和波前误差的过程被称为“光灵敏度”。

光学灵敏度被定义为由于静态、动态和热载荷引起的结构位移的视线运动和波前误差的偏导数。

在简单的例子中,如具有刚性镜的卡塞格伦结构,有可能解析地推导出这些敏感性。

但是,当光学元件的数量很大时(例如,分段光学)或当反射镜不是刚体,并且在多个点上被支撑时,这是不切实际的。

结构中的每个自由度受到少量扰动(例如,小于一个波),利用光线跟踪程序推导出光程差和图像质心。

总结

可以证明,二阶线性微分方程可以重铸为:

X = AX + BU ,

Y = CX + DU ,

其中a、B、C、D是系统特性的函数,X是表示系统状态的向量(节点的位置和速度),U是表示输入和扰动力和力矩的向量,Y是表示输出的向量,即系统中光学元件或子元件的线性位移和角位移,这种形式被称为“状态-空间表示”。

该公式的优点是有大量的方法和工具可在时域和频域获得解,一旦找到解,就利用光学灵敏度来获得对图像运动和波前误差的相应影响。

参考文献:

【1】双子座系统验证,双子座通讯No. 18,1999.

【2】VLT科学运作,前六个月,ESO信使,No. 98,第25页,1999年.

【3】格雷,四个VLT望远镜的组装与集成,SPIE项目,第4004卷,第1页,2000页.

相信不少小伙伴拿到抗原检测试剂盒(antigen testing kits)后,都会困惑这上面的C、T和S分别是什么意思。

今天双语君就来为大家解答一下。

抗原检测的C、T和S

首先,抗原检测卡上端一般会印着Ag的字样,这代表Antigen [ˈæntɪdʒən],也就是抗原。

接下来的几个字母:C、T和S。

C代表了control line,即控制线;

T代表了test line,即测试线;

S代表了sample hole,即样本区。

将采集到的样本滴入S处,在规定的时间内就能判读检测结果:

C和T处均出现红色条带,T处条带颜色可深可浅,均为阳性结果(positive);

C处出现红色条带,T处未显示条带,为阴性结果(negative);

C处未显示红色条带 ,无论T处是否有条带显示均为无效结果(invalid),应重新检测。

抗原检测是antigen test,核酸检测则是nucleic acid test。

两者的区别是,抗原检测是从抗体出发去测抗原,利用抗体与抗原的特异性反应,让病毒显示出来。

核酸检测是把病毒特异性基因片段不断进行复制、扩增,让它的数量达到检测仪器能够检测到的阈值。

所以,核酸检测还有一种英文说法就是PCR test。PCR是Polymerase Chain Reaction的简写,中文名称为聚合酶链式反应,是一种能将微量的DNA大幅增加的分子生物学技术,能迅速掌握患者体内的病毒含量。

核酸检测的Ct值

那核酸检测Ct值又是什么呢?

这里的Ct,并不是我们做胸部或肺部Ct扫描(Computed Tomography scan)的意思。

新冠核酸Ct值一般指新型冠状病毒核酸检测Ct值(Cycle Threshold Value),代表标本内新型冠状病毒核酸含量浓度,是判断是否感染新冠病毒的依据。

Ct的C指cycle,也就是循环的意思,t代表threshold,是指阈值,Ct值又称循环阈值,为判断标本核酸含量多少的指标,也是判断是否感染新型冠状病毒的依据之一。

❶ Ct值越低:

说明循环次数越少,用时越短,不用放大多少倍就能检测到。代表病毒含量相对越高,越容易被侦查到。

❷ Ct值越高:

说明要更多时间与循环,需要放大很多倍才能侦测到病毒,代表病毒含量相对较少。

核酸检测Ct参考数值为35,高于35为阴性,低于35为阳性。

N95口罩的N

那么N95口罩的N又是什么意思呢?

首先N95口罩的英文表达可以是N95 mask或者是N95 respirator。

A mask rated N95 filters out more than 95% of particles larger than 0.3 microns.

达到N95等级的口罩可以滤除超过95%的直径大于0.3微米的颗粒物。

N95型口罩是美国国家职业安全卫生研究所(NIOSH)认证的9种颗粒物防护口罩中的一种。其中N指的是Not resistant to oil(不耐油),95指的是过滤效率达到95%。

最后,希望大家做好防护,保持乐观心态,Be positive, stay negative!

 

市场有自己的时间观念。股票投资就如同任何人类互动一样,耐心是一项美德。——罗伯特·D·爱德华《股市趋势技术分析》

引言

TA-Lib,全称“Technical Analysis Library”, 即技术分析库,是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标,如MACD、RSI、KDJ、动量指标、布林带等等。TA-Lib可分为10个子板块:Overlap Studies(重叠指标),Momentum Indicators(动量指标),Volume Indicators(交易量指标),Cycle Indicators(周期指标),Price Transform(价格变换),Volatility Indicators(波动率指标),Pattern Recognition(模式识别),Statistic Functions(统计函数),Math Transform(数学变换)和Math Operators(数学运算),见下图。本公众号将以系列的形式详细介绍talib技术指标的实现和应用,而本文作为开篇,主要介绍Overlap Studies内容。

安装与使用

安装:在cmd上使用“pip install talib”命令一般会报错,正确安装方法是,进入
https://www.lfd.uci.edu/~gohlke/pythonlibs/,下拉选择
TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl(win系统64位,python3.7版本,根据自己系统和python版本选择相应的安装包),将下载包放在当前工作路径中,然后在Anaconda Prompt(或windows的cmd)里面输入命令:pip install
TA_Lib-0.4.17-cp27-cp27m-win_amd64.whl。

使用:import talib as ta

Overlap Studies Functions重叠指标

01 移动平均线系列

移动平均线是技术分析理论中应用最普遍的指标之一,主要用于确认、跟踪和判断趋势,提示买入和卖出信号,在单边市场行情中可以较好的把握市场机会和规避风险。但是,移动平均线一般要与其他的技术指标或基本面相结合来使用,特别是当市场处于盘整行情时,其买入卖出信号会频繁出现,容易失真。

通用函数名:MA

代码:ta.MA(close,timeperiod=30,matype=0)

移动平均线系列指标包括:SMA简单移动平均线、EMA指数移动平均线、WMA加权移动平均线、DEMA双移动平均线、TEMA三重指数移动平均线、TRIMA三角移动平均线、KAMA考夫曼自适应移动平均线、MAMA为MESA自适应移动平均线、T3三重指数移动平均线。

其中,close为收盘价,时间序列,timeperiod为时间短,默认30天,指标类型matype分别对应:0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (Default=SMA)

不同类型的移动均线也有各自相应的调用函数:

#先引入后面可能用到的包(package) import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline #正常显示画图时出现的中文和负号 from pylab import mpl mpl.rcParams['font.sans-serif']=['SimHei'] mpl.rcParams['axes.unicode_minus']=False #引入TA-Lib库 import talib as ta #查看包含的技术指标和数学运算函数 #print(ta.get_functions()) #print(ta.get_function_groups()) ta_fun=ta.get_function_groups() ta_fun.keys() #使用tushare获取上证指数数据作为示例 import tushare as ts df=ts.get_k_data('sh',start='2000-01-01') df.index=pd.to_datetime(df.date) df=df.sort_index() types=['SMA','EMA','WMA','DEMA','TEMA', 'TRIMA','KAMA','MAMA','T3'] df_ma=pd.DataFrame(df.close) for i in range(len(types)): df_ma[types[i]]=ta.MA(df.close,timeperiod=5,matype=i) df_ma.tail()

df_ma.loc['2018-08-01':].plot(figsize=(16,6)) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.title('上证指数各种类型移动平均线',fontsize=15) plt.xlabel('') plt.show()

 

数据来源:tushare

 

#画5、30、120、250指数移动平均线 N=[5,30,120,250] for i in N: df['ma_'+str(i)]=ta.EMA(df.close,timeperiod=i) df.tail() df.loc['2014-01-01':,['close','ma_5','ma_30','ma_120','ma_250']].plot(figsize=(16,6)) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.title('上证指数走势',fontsize=15) plt.xlabel('') plt.show()

 

数据来源:tushare

 

02 布林带

布林带(Bollinger Band),由压力线、支撑线价格平均线组成,一般情况价格线在压力线和支撑线组成的上下区间中游走,区间位置会随着价格的变化而自动调整。布林线的理论使用原则是:当股价穿越最外面的压力线(支撑线)时,表示卖点(买点)出现。当股价延着压力线(支撑线)上升(下降)运行,虽然股价并未穿越,但若回头突破第二条线即是卖点或买点。在实际应用中,布林线有其滞后性,相对于其他技术指标在判断行情反转时参考价值较低,但在判断盘整行情终结节点上成功率较高。

计算方法:首先计出过去 N 日收巿价的标准差 SD(Standard Deviation) ,通常再乘 2 得出 2 倍标准差, Up 线为 N日平均线加 2 倍标准差, Down 线则为 N日平均线减 2 倍标准差。

代码:ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)

H_line,M_line,L_line=ta.BBANDS(df.close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0) df1=pd.DataFrame(df.close,index=df.index,columns=['close']) df1['H_line']=H_line df1['M_line']=M_line df1['L_line']=L_line df1.tail()

df1.loc['2013-01-01':'2014-12-30'].plot(figsize=(16,6)) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.title('上证指数布林线',fontsize=15) plt.xlabel('') plt.show()

 

数据来源:tushare

 

03 其他指标

df2=pd.DataFrame(df.close) df2['HT']=ta.HT_TRENDLINE(df.close) periods =np.array([3]*len(df), dtype=float) df2['MAVP']=ta. MAVP(df.close,periods) df2['MIDPOINT']=ta.MIDPOINT(df.close) df2['MIDPRICE']=ta.MIDPRICE(df.high,df.low) df2['SAR']=ta.SAR(df.high,df.low) df2['SAREXT']=ta.SAREXT(df.high,df.low) df2.tail()

df2.loc['2018-01-01':'2019-02-21',['close','HT','MAVP','MIDPOINT','MIDPRICE','SAR']].plot(figsize=(16,6)) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.title('上证指数的其他趋势指标线',fontsize=15) plt.xlabel('') plt.show()

 

数据来源:tushare

 

df2.loc['2018-01-01':'2019-02-21','SAREXT'].plot(figsize=(16,6)) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.title('上证指数的抛物线扩展走势',fontsize=15) plt.xlabel('') plt.show()

 

数据来源:tushare

 

 

均线策略回测

双均线策略:分别选择L天和S天的移动平均线(L>S),如L=20,S=5,当短周期S均线(5日均线)向上突破长周期L均线(20日均线)时,为买入点;反之,当S均线向下击穿L均线时为卖出点。

标的:中国平安(601318),期间:2014.1-2019.1,回测结果:

 

数据来源:万矿

 

布林线策略回测

标的:黄金期货

策略:下穿布林线上边界做空,上穿布林线下边界做多

(1)timeperiod=10,回测期间:2017.01.01-2019.02.21

 

数据来源:万矿

 

 

(2)timeperiod=10,回测期间:2016.01.01-2017.02.21

 

数据来源:万矿

 

关于Python金融量化

专注于分享Python在金融领域的实际应用,包括金融数据分析、金融建模与量化投资等。加入知识星球,免费获取量化投资学习视频、公众号文章Python源代码,一起学习,共同进步!

 

 

引言

大部分量化策略都可以归类为均值回归与动量策略。事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利。否则,价格是随机游走的,交易将无利可图。均值回归是金融学的一个重要概念,指股票价格无论高于或低于价值中枢都会以很高的概率向价值中枢回归的趋势。中国古语“盛极而衰,否极泰来”,就暗含着均值回归的思想。如果说要为均值回归寻找一个比较合理的理论解释,不妨借鉴一下索罗斯的“反身性理论”。索罗斯认为。市场中存在正反馈和负反馈组成的反馈环(系统理论里的概念),其中正反馈是自我强化的过程(惯性或趋势),而负反馈是一个自我纠正的过程,倾向于把价格带回到均值附近,如股票经过大幅上涨后,总有一些交易者会因为股票价格过高而抛售,一旦没有足够的买盘跟进,少数人的抛售就会引起价格下跌,而价格的下跌会引起更多人的抛售,从而形成下跌的正反馈效应。本文以Zscore为指标构建均值回归的交易策略,并使用Pandas搭起基于研究的量化回测框架,以后将逐渐转向使用面向对象的编程方法来搭建基于事件驱动的量化回测系统(基于事件驱动的回测框架是主流)。

 

 

 

 

专栏

 

 

Python数据分析实战

作者:AI火箭营

 

199币

8人已购

 

查看

 

 

 

 

策略思想

均值回归策略的思想在引言中已有所介绍, 此处不详细展开。其实,大家熟知的巴菲特价值投资策略和索罗斯的“反身”交易策略,从本质上来看都是均值回归理论的应用,所不同的是前者是基于价值低点向高点回归做多获得收益,后者则是通过泡沫破灭价值从高点向低点回归时做空进行投机获利。均值回归策略的思想很容易理解,实际操作中有很多构建的方法,比较常见的利用股价收益率偏离某段期间均值的若干个标准为阈值作为均值回归策略的买入卖出信号。下面将基于该原理,计算股价收益率的Zscore值,即以标准差为单位来衡量某一日收益率与平均收益率之间的离差情况。Talk is cheap, show your code!下面直接给出使用Python构建量化回测框架的过程和回测结果。

使用Python进行策略回测

01数据准备与探索分析

全文使用tushare获取股票数据,在Jupyter notebook上运行代码。长期关注本公众号的朋友不难发现,第一段代码基本上在每篇文章中都会出现,引入可能用到的库以及从tushare上下载数据,这一段可以作为数据分析的模板,在以后的文章中可能会省略掉,直接上核心代码。

#先引入后面可能用到的包(package) import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns sns.set() %matplotlib inline #正常显示画图时出现的中文和负号 from pylab import mpl mpl.rcParams['font.sans-serif']=['SimHei'] mpl.rcParams['axes.unicode_minus']=False #使用tushare获取交易数据 #设置token import tushare as ts token='输入在tushare.pro上获取的token' ts.set_token(token) pro=ts.pro_api(token) #pro=ts.pro_api(token) index={'上证综指': '000001.SH','深证成指': '399001.SZ', '沪深300': '000300.SH','创业板指': '399006.SZ', '上证50': '000016.SH','中证500': '000905.SH', '中小板指': '399005.SZ','上证180': '000010.SH'} #获取当前交易的股票代码和名称 def get_code(): df = pro.stock_basic(exchange='', list_status='L') codes=df.ts_code.values names=df.name.values stock=dict(zip(names,codes)) #合并指数和个股成一个字典 stocks=dict(stock,**index) return stocks #获取行情数据 def get_data(stock,start='20151009',end=''): #如果代码在字典index里,则取的是指数数据 code=get_code()[stock] if code in index.values(): df=ts.pro_bar(ts_code=code,asset='I',start_date=start, end_date=end) #否则取的是个股数据 else: df=ts.pro_bar(ts_code=code, adj='qfq',start_date=start, end_date=end) #将交易日期设置为索引值 df.index=pd.to_datetime(df.trade_date) df=df.sort_index() return df

从中国平安的股价走势来看,其单边趋势强于震荡趋势,因此均值回归策略可能不是中国平安在这段期间的最优策略,下面的回测结果将进一步展示。下面先来看看中国平安股票日收益率的波动及对标准差的偏离情况。日收益率图显示存在明显波动集聚的情况。日收益率标准化图是计算日收益率的滚动20日Zscore值,即当前收益率对其20日均值的标准差偏离度,此时波动集聚的情况不存在了。图中设定1.5倍标准差为阈值,偏离绿色线的点将作为买入卖出信号。

df=get_data('中国平安') #df.tail() returns=df.close.pct_change().dropna() returns.plot(figsize=(14,6),label='日收益率') plt.title('中国平安日收益图',fontsize=15) my_ticks = pd.date_range('2015-10-1','2019-10-11',freq='q') plt.xticks(my_ticks,fontsize=12) plt.yticks(fontsize=12) plt.xlabel('',fontsize=12) # 将右边、上边的两条边颜色设置为空 其实就相当于抹掉这两条边 plt.axhline(returns.mean(), color='r',label='日收益均值') plt.axhline(returns.mean()+1.5*returns.std(), color='g',label='正负1.5倍标准差') plt.axhline(returns.mean()-1.5*returns.std(), color='g') plt.legend() ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.show()

ret_20=returns.rolling(20).mean() std_20=returns.rolling(20).std() score=((returns-ret_20)/std_20) score.plot(figsize=(14,6),label='20日收益率标准化') plt.title('中国平安日收益标准化图',fontsize=15) my_ticks = pd.date_range('2015-10-1','2019-10-11',freq='q') plt.xticks(my_ticks,fontsize=12) plt.yticks(fontsize=12) plt.xlabel('',fontsize=12) plt.axhline(score.mean(), color='r',label='日收益均值') plt.axhline(score.mean()+1.5*score.std(), color='g',label='正负1.5倍标准差') plt.axhline(score.mean()-1.5*score.std(), color='g') plt.legend() ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.show()

02 策略设计与回测

加载数据

这里加载了open、close、low、high和vol数据主要是为了后面的可视化分析。数据获取中以沪深300指数作为参考基准,读者可以根据需要进行修改。

#获取数据 def data_feed(stock,start='20151009',end=''): #获取个股数据 df=get_data(stock,start,end)[['open','close','low','high','vol']] #指数数据,作为参照指标 df['hs300']=get_data('沪深300',start,end).close.pct_change() #计算收益率 df['rets']=df.close.pct_change().dropna() return df.dropna()

交易策略

计算日收益率的滚动20日Zscore值,当Zscore小于-1.5并且第二天开盘没有涨停时,在第二天开盘买入;当Zscore大于1.5且第二天开盘没有跌停时,在第二天开盘卖出,每次都是全仓买卖。

def MR_Strategy(df,lookback=20,buy_threshold=-1.5,sell_threshold=1.5,cost=0.0): '''输入参数: df为数据表: 包含open,close,low,high,vol,标的收益率rets,指数收益率数据hs300 lookback为均值回归策略参数,设置统计区间长度,默认20天 buy_threshold:买入参数,均值向下偏离标准差的倍数,默认-1.5 sell_threshold:卖出参数,均值向上偏离标准差的倍数,默认1.5 cost为手续费+滑点价差,可以根据需要进行设置,默认为0.0 ''' #计算均值回归策略的Zscore值 ret_lb=df.rets.rolling(lookback).mean() std_lb=df.rets.rolling(lookback).std() df['score']=(df.rets-ret_lb)/std_lb df.dropna(inplace=True) #设计买卖信号,为尽量贴近实际,加入涨跌停不能买卖的限制 #当Zscore值小于-1.5且第二天开盘没有涨停发出买入信号设置为1 df.loc[(df.score<buy_threshold) &(df['open'] < df['close'].shift(1) * 1.097), 'signal'] = 1 #当Zscore值大于1.5且第二天开盘没有跌停发出卖入信号设置为0 df.loc[(df.score>sell_threshold) &(df['open'] > df['close'].shift(1) * 0.903), 'signal'] = 0 df['position']=df['signal'].shift(1) df['position'].fillna(method='ffill',inplace=True) df['position'].fillna(0,inplace=True) #根据交易信号和仓位计算策略的每日收益率 df.loc[df.index[0], 'capital_ret'] = 0 #今天开盘新买入的position在今天的涨幅(扣除手续费) df.loc[df['position'] > df['position'].shift(1), 'capital_ret'] = (df['close'] / df['open']-1) * (1- cost) #卖出同理 df.loc[df['position'] < df['position'].shift(1), 'capital_ret'] = (df['open'] / df['close'].shift(1)-1) * (1-cost) # 当仓位不变时,当天的capital是当天的change * position df.loc[df['position'] == df['position'].shift(1), 'capital_ret'] = df['rets'] * df['position'] #计算标的、策略、指数的累计收益率 df['capital_line']=(df.capital_ret+1.0).cumprod() df['rets_line']=(df.rets+1.0).cumprod() df['hs300_line']=(df.hs300+1.0).cumprod() return df

计算策略的评价指标

完整代码只在知识星球上分享,可扫描最下方二维码加入。

# 根据每次买入的结果,计算相关指标 def trade_indicators(df): 由于篇幅所限,此处代码省略 #df为策略返回的数据框,包含策略的收益率 # 计算资金曲线 # 记录买入或者加仓时的日期和初始资产 # 输出账户交易各项指标 def performance(df): 由于篇幅所限,此处代码省略 #df为策略返回的数据框,包含策略的收益率 # 计算每一年(月,周)股票,资金曲线的收益 # 计算策略的年(月,周)胜率 #计算总收益率、年化收益率和风险指标 #对策略和标的股票累计收益率进行可视化 def plot_performance(df,stock): 由于篇幅所限,此处代码省略 #df为策略返回的数据框,包含策略的收益率 #stock为回测的股票简称 def plot_strategy_signal(df,trade,stock): 由于篇幅所限,此处代码省略 #对K线图和买卖信号进行可视化 #使用pyecharts 0.5.11版本 #将上述函数整合成一个执行函数 def main(stock,start,end): d0=data_feed(stock,start,end) d1=MR_Strategy(d0) print(f'回测标的:{stock}') print(f'回测期间:{start}—{end}') trade=trade_indicators(d1) performance(d1) plot_performance(d1,stock) return d1,trade 03 回测结果分析 下面分别选择中国平安、奥马电器和九州通股票进行均值回归策略回测,时间区间为2015年10月9日至2019年10月11日,跨度四年左右。结果显示出均值回归策略对不同标的表现差异较大。值得注意的是奥马电器由于2018年出现19亿巨亏的黑天鹅事件,股价从16.53跌至3.19,最大回撤高达86%,回测期间总收益-29%;策略回撤也达到56%,但是总收益为正2.4%。总体而言,均值回归策略应用了股市投资中经典的高抛低吸思想,该类型策略一般在震荡市中表现优异(九州通);但是在单边趋势行情中一般表现糟糕(中国平安),往往会大幅跑输市场(奥马电器)。 #对中国平安股票进行策略回测 stock='中国平安' d1,trade=main(stock,'20151009','20191011') plot_strategy_signal(d1,trade,stock)

输出回测结果

回测标的:中国平安

回测期间:20151009—20191011

==============每笔交易收益率及同期股票涨跌幅===============

start_date end_date trade_return stock_return

16 2015-11-30 2015-12-03 0.054617 0.062943

21 2015-12-07 2015-12-15 0.014286 0.008871

37 2015-12-29 2016-02-01 -0.155182 -0.172830

74 2016-02-26 2016-03-03 0.031370 0.049032

123 2016-05-09 2016-05-13 0.005099 0.010190

156 2016-06-27 2016-07-13 0.046194 0.040052

180 2016-07-29 2016-08-10 0.001848 0.002772

193 2016-08-17 2016-09-20 0.033013 0.033413

220 2016-09-27 2016-10-31 0.004965 0.006689

242 2016-11-03 2016-11-22 0.035270 0.043629

262 2016-12-01 2017-01-17 -0.007703 -0.009634

303 2017-02-06 2017-02-21 0.030497 0.032285

346 2017-04-10 2017-04-26 0.000273 0.024861

365 2017-05-08 2017-05-11 0.068169 0.067365

391 2017-06-15 2017-07-06 0.068447 0.088540

418 2017-07-24 2017-08-02 0.052418 0.040032

502 2017-11-24 2017-12-11 -0.039784 -0.014396

526 2017-12-28 2018-01-16 0.104979 0.106040

548 2018-01-30 2018-02-14 -0.074074 -0.060932

582 2018-03-26 2018-04-11 -0.013005 -0.037411

604 2018-04-27 2018-05-09 -0.007082 -0.002692

626 2018-05-31 2018-06-01 0.013092 0.016323

639 2018-06-20 2018-07-02 -0.058481 -0.110647

648 2018-07-03 2018-07-10 0.061150 0.053605

670 2018-08-02 2018-08-08 0.002356 -0.022110

680 2018-08-16 2018-09-05 0.142426 0.101175

695 2018-09-06 2018-09-25 0.077294 0.080475

712 2018-10-09 2018-10-22 0.021354 0.048627

727 2018-10-30 2018-11-05 0.108334 0.073872

799 2019-02-18 2019-02-19 0.026291 0.038420

806 2019-02-27 2019-04-01 0.109530 0.122698

851 2019-05-07 2019-05-13 -0.030937 -0.031403

912 2019-08-01 2019-08-13 -0.017714 -0.034963

930 2019-08-27 2019-09-16 0.057058 0.052755

====================账户交易的各项指标=====================

交易次数为:34 最长持有天数为:47

每次平均涨幅为:0.022540

单次最大盈利为:0.142426 单次最大亏损为:-0.155182

年均买卖次数为:8.953824

最大连续盈利次数为:8 最大连续亏损次数为:3

策略年胜率为:80.0%

策略月胜率为:77.5%

策略周胜率为:59.26%

总收益率: 策略102.33%,股票177.87%, 指数5.55%

年化收益率:策略20.19%, 股票30.56%,指数1.42%

最大回撤: 策略19.17%, 股票28.54%,指数32.46%

策略Alpha: 0.2, Beta:0.43,夏普比率:1.92

stock='奥马电器' d1,trade=main(stock,'20151009','20191011') plot_strategy_signal(d1,trade,stock) 回测标的:奥马电器 回测期间:20151009—20191011 ==============每笔交易收益率及同期股票涨跌幅=============== 略 ====================账户交易的各项指标===================== 交易次数为:24 最长持有天数为:65 每次平均涨幅为:0.014195 单次最大盈利为:0.491054 单次最大亏损为:-0.452403 年均买卖次数为:6.522710 最大连续盈利次数为:4 最大连续亏损次数为:2 策略年胜率为:40.0% 策略月胜率为:65.0% 策略周胜率为:51.89% 总收益率: 策略8.18%,股票-68.03%, 指数22.43% 年化收益率:策略2.46%, 股票-29.7%,指数6.45% 最大回撤: 策略56.72%, 股票86.1%,指数26.39% 策略Alpha: -0.01, Beta:0.59,夏普比率:0.37

stock='九州通' d1,trade=main(stock,'20151009','20191011') plot_strategy_signal(d1,trade,stock) 回测标的:九州通 回测期间:20151009—20191011 ==============每笔交易收益率及同期股票涨跌幅=============== 略 ====================账户交易的各项指标===================== 交易次数为:33 最长持有天数为:50 每次平均涨幅为:0.006272 单次最大盈利为:0.103585 单次最大亏损为:-0.142085 年均买卖次数为:8.665468 最大连续盈利次数为:6 最大连续亏损次数为:3 策略年胜率为:60.0% 策略月胜率为:58.54% 策略周胜率为:51.69% 总收益率: 策略16.93%,股票-27.96%, 指数1.57% 年化收益率:策略4.21%, 股票-8.28%,指数0.41% 最大回撤: 策略25.56%, 股票49.51%,指数32.46% 策略Alpha: 0.04, Beta:0.39,夏普比率:0.31

结语

本文主要介绍了均值回测策略的基本思想,以及使用Pandas构建基于研究的量化回测框架对策略进行回测,回测结果比较直观(感兴趣的朋友可以把交易费用和滑点价差考虑进去,文中设置为0了)。当然,上述回测框架还存在一些细节问题需要完善,而且基于研究的回测框架和基于pandas的向量式编程存在一定的局限性,尽管容易理解,但不适合用于处理更复杂的交易情形。以后有机会将为大家介绍使用面向对象编程(Class类)的方法构建基于事件驱动的量化回测框架,可以借鉴backtrader、zipline等开源框架。尽管均值回归非常普遍,但要准确回测一个盈利的均值回归策略却存在很多陷阱。比如,许多历史金融数据库中都包含报价错误,而这些错误可能会抬高均值回归策略的业绩。另外,存活偏差也会影响均值回归策略的回测,即那些股价一直下跌最后退市而没有出现均值回归的股票早已从数据库中剔除。对于均值回归策略而言,典型的结果就是套利机会的逐步消失,从而使得收益率逐渐降低至零。当套利机会消失殆尽时,均值回归策略就变得没那么有效,因为越来越多的交易信号来自于股票估值的基本面变化,而这并不会均值回归。

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

 

https://www.xusbuy.com

上一篇:600538基金(股票行情)

下一篇:现货交易神器(期货开户要什么条件)

相关推荐

返回顶部