引言
大部分量化策略都可以归类为均值回归与动量策略。事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利。否则,价格是随机游走的,交易将无利可图。均值回归是金融学的一个重要概念,指股票价格无论高于或低于价值中枢都会以很高的概率向价值中枢回归的趋势。中国古语“盛极而衰,否极泰来”,就暗含着均值回归的思想。如果说要为均值回归寻找一个比较合理的理论解释,不妨借鉴一下索罗斯的“反身性理论”。索罗斯认为。市场中存在正反馈和负反馈组成的反馈环(系统理论里的概念),其中正反馈是自我强化的过程(惯性或趋势),而负反馈是一个自我纠正的过程,倾向于把价格带回到均值附近,如股票经过大幅上涨后,总有一些交易者会因为股票价格过高而抛售,一旦没有足够的买盘跟进,少数人的抛售就会引起价格下跌,而价格的下跌会引起更多人的抛售,从而形成下跌的正反馈效应。本文以Zscore为指标构建均值回归的交易策略,并使用Pandas搭起基于研究的量化回测框架,以后将逐渐转向使用面向对象的编程方法来搭建基于事件驱动的量化回测系统(基于事件驱动的回测框架是主流)。
GAO:=HHV(C,60)-LLV(C,60);
让任何一位菜鸟列举交易计划都会规划,恰恰风控是最重要的长期以来却是最容易忽略的,这可以说是入门的基本功。
跑高速可以清积碳,不少朋友都在说:“我市区起步经常大脚踩油门,不是转速拉高了?和高速不是差不多嘛?有用没用?”
外院辅助检查
STJ83:=STJ81 AND STJ82;
总之,若把三个指标一起使用,就可以轻松区分个股或者指数走牛或者走熊。
2017-2-5
其中,close为收盘价,时间序列,timeperiod为时间短,默认30天,指标类型matype分别对应:0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (Default=SMA)
世上没有无缘无故的爱、也没有无缘无故的恨,股市就是大鱼吃小鱼、小鱼吃虾米,股市中庄家是散户的克星,也是以蚕食散户为生的,庄家巴不得散户越多越好。
912 2019-08-01 2019-08-13 -0.017714 -0.034963
吴秋歌教授
正向做T:先买后卖,在分时低点时先买入,然后在后面的分时高点卖出
mcst市场成本源码:
(2)常见3种基下的指标之和都是100%
交易策略
很多人对维生素D的第一印象,是它能补钙和健骨。实际上,维生素D是个“健康多面手”。
感染性疾病方面,首先我们要考虑抗菌药物力度是否足够,能否覆盖致病菌,是否存在细菌耐药情况,再者考虑是否存在特殊病原体感染,如结核分支杆菌、真菌、病毒等。非感染性疾病方面需要进一步排查,完善风湿结缔组织全套、ANCA4项、淋巴细胞亚群分析等。
传染病四项:阴性
家族史
气管、右主支气管及所属支气管粘膜充血,管腔内可见少量粘稠分泌物;
全文使用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()
计算日收益率的滚动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
# 根据每次买入的结果,计算相关指标 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)
年均买卖次数为:8.953824
策略月胜率为: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 结语