# 【小散学量化】-2-动量模型的简单实践
> 来源:https://uqer.io/community/share/5673a22b228e5b8d5bf017ba
本帖将对之前提到的动量模型进行回测,顺便科普一下动量模型中用到的数学工具,包括以下内容:
+ 1、线性回归
+ 2、动量模型回测
+ 3、小散的思考
## 1.线性回归
线性回归是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
对于自变量X和因变量Y,线性回归方法用Y=α+βX 的形式来解释X,Y之间的关系。例如,小散想知道上证50指数与上证指数之间的变化,该怎么办呢?
首先,定义一个函数来执行线性回归操作,并返回回归结果。
```py
import numpy as np
from statsmodels import regression
import statsmodels.api as sm
import matplotlib.pyplot as plt
import math
def linreg(X,Y):
# Running the linear regression
X = sm.add_constant(X)
model = regression.linear_model.OLS(Y, X).fit()
a = model.params[0]
b = model.params[1]
X = X[:, 1]
# Return summary of the regression and plot results
X2 = np.linspace(X.min(), X.max(), 100)
Y_hat = X2 * b + a
plt.scatter(X, Y, alpha=0.3) # Plot the raw data
plt.plot(X2, Y_hat, 'r', alpha=0.9); # Add the regression line, colored in red
plt.xlabel('X Value')
plt.ylabel('Y Value')
return model.summary()
```
接着,应用上面定义的函数,以2015年的数据为例,验证上证指数(000001)和上证50指数(000016)之间的关系。
```py
data1=DataAPI.MktIdxdGet(ticker='000016',beginDate='20150101',endDate='20151201')
asset=data1['closeIndex']
data2=DataAPI.MktIdxdGet(ticker='000001',beginDate='20150101',endDate='20151201')
benchmark=data2['closeIndex']
r_a = asset.pct_change()[1:]
r_b = benchmark.pct_change()[1:]
linreg(r_b.values, r_a.values)
OLS Regression Results
Dep. Variable: y R-squared: 0.823
Model: OLS Adj. R-squared: 0.823
Method: Least Squares F-statistic: 1021.
Date: Fri, 18 Dec 2015 Prob (F-statistic): 2.11e-84
Time: 13:40:10 Log-Likelihood: 685.41
No. Observations: 221 AIC: -1367.
Df Residuals: 219 BIC: -1360.
Df Model: 1
Covariance Type: nonrobust
coef std err t P>|t| [95.0% Conf. Int.]
const -0.0006 0.001 -0.877 0.381 -0.002 0.001
x1 0.9317 0.029 31.952 0.000 0.874 0.989
Omnibus: 43.308 Durbin-Watson: 1.857
Prob(Omnibus): 0.000 Jarque-Bera (JB): 85.122
Skew: 0.968 Prob(JB): 3.28e-19
Kurtosis: 5.344 Cond. No. 39.6
```
![](https://box.kancloud.cn/2016-07-30_579cbb052269a.png)
小散并不知道OLS结果怎么看,只知道这里的R-sq用来解释线性关系的可靠性,0.823表示自变量可以解释82.3%的因变量变化。小散是一个好奇心很强的人,这个82.3%到底是大还是小呢?
这里使用随机生成X,Y来观察一下。
```py
X = np.random.rand(100)
Y = np.random.rand(100)
linreg(X, Y)
OLS Regression Results
Dep. Variable: y R-squared: 0.001
Model: OLS Adj. R-squared: -0.010
Method: Least Squares F-statistic: 0.06682
Date: Fri, 18 Dec 2015 Prob (F-statistic): 0.797
Time: 13:40:15 Log-Likelihood: -15.737
No. Observations: 100 AIC: 35.47
Df Residuals: 98 BIC: 40.68
Df Model: 1
Covariance Type: nonrobust
coef std err t P>|t| [95.0% Conf. Int.]
const 0.5214 0.056 9.245 0.000 0.410 0.633
x1 0.0253 0.098 0.258 0.797 -0.169 0.219
Omnibus: 22.647 Durbin-Watson: 2.366
Prob(Omnibus): 0.000 Jarque-Bera (JB): 5.557
Skew: -0.164 Prob(JB): 0.0621
Kurtosis: 1.893 Cond. No. 4.32
```
![](https://box.kancloud.cn/2016-07-30_579cbb05392a4.png)
## 2 动量模型回测
针对小伙伴之前提出的回测效果问题,小散选择了上证50指数作为参考,50ETF作为投资标的,上证指数(000001)作为动量模型的择时工具进行了回测。
首先,定义动量信号函数,函数返回值为回归模型的Y值,同期上证指数值及标准差。
```py
from statsmodels import regression
import statsmodels.api as sm
import scipy.stats as stats
import scipy.spatial.distance as distance
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from CAL.PyCAL import *
from datetime import datetime, timedelta
import numpy as np
cal = Calendar('China.SSE')
def signal_gzs_calc(today,before):
start= cal.advanceDate(today, Period('-30B'))
start=start.toDateTime()
end = cal.advanceDate(today, before)
end=end.toDateTime()
asset=DataAPI.MktIdxdGet(ticker='000001',beginDate=start,endDate=end,field=['tradeDate','closeIndex'],pandas="1").set_index('tradeDate')['closeIndex']
# 对收盘价数据进行直线拟合
X = np.arange(len(asset))
x = sm.add_constant(X)
model = regression.linear_model.OLS(asset, x).fit() # 使用OLS计算y=ax+b对应的a和b
a = model.params[0]
b = model.params[1]
Y_fit = X * b + a
return Y_fit[-1],asset[-1],np.std(asset - Y_fit)
```
```py
start = '2013-01-01' # 回测起始时间
today = datetime.today()
delta = timedelta(days = -1)
end = (today+delta).strftime('%Y-%m-%d')
benchmark = 'SH50' # 策略参考标准
universe = ['510050.XSHG'] # 股票池 # 策略参考标准
refresh_rate = 1 # 调仓频率,即每 refresh_rate 个交易日执行一次 handle_data() 函数
def initialize(account): # 初始化虚拟账户状态
pass
def handle_data(account): # 每个交易日的买入卖出指令
today=account.current_date
a_1,b_1,c_1=signal_gzs_calc(today,Period('-2B'))
a_2,b_2,c_2=signal_gzs_calc(today,Period('-1B'))
for stk in account.universe:
if (a_1-b_1)< -c_1 and (a_2-b_2)> -c_2 and not stk in account.valid_secpos:
order(stk, 200000)
if (a_1-b_1)<c_1 and (a_2-b_2)>c_2 and stk in account.valid_secpos:
order(stk, -200000)
```
![](https://box.kancloud.cn/2016-07-30_579cbb05504ea.jpg)
## 3、小散的思考
从回测效果来看,本模型在捕捉上升趋势和下降趋势时均有延迟,可以通过修改period来调整(初步设定为30)。
单纯依靠反转信号作为卖出信号带来的回撤较大,可以考虑增加止损条件(无止损设定)。
3年回测期内,共发出买卖信号11次,最近一次空仓信号发出在11月19日,产生的信号较少,可以考虑修改两个if条件增加信号量(小散设定为单位标准差)。
策略收益主要是靠空仓避难得到的,小伙伴可以将这个模型推广应用到多个个股,看看有没有挖掘价值。
参考文献:
1、量化分析师日记,新手必看。
2、zilong.li https://uqer.io/community/share/561e3a65f9f06c4ca82fb5ec 用5日均线和10日均线进行判断--改进版。
本次【小散学量化】到此结束, 韭菜的观点仅供参考,切记切记~
- Python 量化交易教程
- 第一部分 新手入门
- 一 量化投资视频学习课程
- 二 Python 手把手教学
- 量化分析师的Python日记【第1天:谁来给我讲讲Python?】
- 量化分析师的Python日记【第2天:再接着介绍一下Python呗】
- 量化分析师的Python日记【第3天:一大波金融Library来袭之numpy篇】
- 量化分析师的Python日记【第4天:一大波金融Library来袭之scipy篇】
- 量化分析师的Python日记【第5天:数据处理的瑞士军刀pandas】
- 量化分析师的Python日记【第6天:数据处理的瑞士军刀pandas下篇
- 量化分析师的Python日记【第7天:Q Quant 之初出江湖】
- 量化分析师的Python日记【第8天 Q Quant兵器谱之函数插值】
- 量化分析师的Python日记【第9天 Q Quant兵器谱之二叉树】
- 量化分析师的Python日记【第10天 Q Quant兵器谱 -之偏微分方程1】
- 量化分析师的Python日记【第11天 Q Quant兵器谱之偏微分方程2】
- 量化分析师的Python日记【第12天:量化入门进阶之葵花宝典:因子如何产生和回测】
- 量化分析师的Python日记【第13天 Q Quant兵器谱之偏微分方程3】
- 量化分析师的Python日记【第14天:如何在优矿上做Alpha对冲模型】
- 量化分析师的Python日记【第15天:如何在优矿上搞一个wealthfront出来】
- 第二部分 股票量化相关
- 一 基本面分析
- 1.1 alpha 多因子模型
- 破解Alpha对冲策略——观《量化分析师Python日记第14天》有感
- 熔断不要怕, alpha model 为你保驾护航!
- 寻找 alpha 之: alpha 设计
- 1.2 基本面因子选股
- Porfolio(现金比率+负债现金+现金保障倍数)+市盈率
- ROE选股指标
- 成交量因子
- ROIC&cashROIC
- 【国信金工】资产周转率选股模型
- 【基本面指标】Cash Cow
- 量化因子选股——净利润/营业总收入
- 营业收入增长率+市盈率
- 1.3 财报阅读 • [米缸量化读财报] 资产负债表-投资相关资产
- 1.4 股东分析
- 技术分析入门 【2】 —— 大家抢筹码(06年至12年版)
- 技术分析入门 【2】 —— 大家抢筹码(06年至12年版)— 更新版
- 谁是中国A股最有钱的自然人
- 1.5 宏观研究
- 【干货包邮】手把手教你做宏观择时
- 宏观研究:从估值角度看当前市场
- 追寻“国家队”的足迹
- 二 套利
- 2.1 配对交易
- HS300ETF套利(上)
- 【统计套利】配对交易
- 相似公司股票搬砖
- Paired trading
- 2.2 期现套利 • 通过股指期货的期现差与 ETF 对冲套利
- 三 事件驱动
- 3.1 盈利预增
- 盈利预增事件
- 事件驱动策略示例——盈利预增
- 3.2 分析师推荐 • 分析师的金手指?
- 3.3 牛熊转换
- 历史总是相似 牛市还在延续
- 历史总是相似 牛市已经见顶?
- 3.4 熔断机制 • 股海拾贝之 [熔断错杀股]
- 3.5 暴涨暴跌 • [实盘感悟] 遇上暴跌我该怎么做?
- 3.6 兼并重组、举牌收购 • 宝万战-大戏开幕
- 四 技术分析
- 4.1 布林带
- 布林带交易策略
- 布林带回调系统-日内
- Conservative Bollinger Bands
- Even More Conservative Bollinger Bands
- Simple Bollinger Bands
- 4.2 均线系统
- 技术分析入门 —— 双均线策略
- 5日线10日线交易策略
- 用5日均线和10日均线进行判断 --- 改进版
- macross
- 4.3 MACD
- Simple MACD
- MACD quantization trade
- MACD平滑异同移动平均线方法
- 4.4 阿隆指标 • 技术指标阿隆( Aroon )全解析
- 4.5 CCI • CCI 顺势指标探索
- 4.6 RSI
- 重写 rsi
- RSI指标策略
- 4.7 DMI • DMI 指标体系的构建及简单应用
- 4.8 EMV • EMV 技术指标的构建及应用
- 4.9 KDJ • KDJ 策略
- 4.10 CMO
- CMO 策略模仿练习 1
- CMO策略模仿练习2
- [技术指标] CMO
- 4.11 FPC • FPC 指标选股
- 4.12 Chaikin Volatility
- 嘉庆离散指标测试
- 4.13 委比 • 实时计算委比
- 4.14 封单量
- 按照封单跟流通股本比例排序,剔除6月上市新股,前50
- 涨停股票封单统计
- 实时计算涨停板股票的封单资金与总流通市值的比例
- 4.15 成交量 • 决战之地, IF1507 !
- 4.16 K 线分析 • 寻找夜空中最亮的星
- 五 量化模型
- 5.1 动量模型
- Momentum策略
- 【小散学量化】-2-动量模型的简单实践
- 一个追涨的策略(修正版)
- 动量策略(momentum driven)
- 动量策略(momentum driven)——修正版
- 最经典的Momentum和Contrarian在中国市场的测试
- 最经典的Momentum和Contrarian在中国市场的测试-yanheven改进
- [策略]基于胜率的趋势交易策略
- 策略探讨(更新):价量结合+动量反转
- 反向动量策略(reverse momentum driven)
- 轻松跑赢大盘 - 主题Momentum策略
- Contrarian strategy
- 5.2 Joseph Piotroski 9 F-Score Value Investing Model · 基本面选股系统:Piotroski F-Score ranking system
- 5.3 SVR · 使用SVR预测股票开盘价 v1.0
- 5.4 决策树、随机树
- 决策树模型(固定模型)
- 基于Random Forest的决策策略
- 5.5 钟摆理论 · 钟摆理论的简单实现——完美躲过股灾和精准抄底
- 5.6 海龟模型
- simple turtle
- 侠之大者 一起赚钱
- 5.7 5217 策略 · 白龙马的新手策略
- 5.8 SMIA · 基于历史状态空间相似性匹配的行业配置 SMIA 模型—取交集
- 5.9 神经网络
- 神经网络交易的训练部分
- 通过神经网络进行交易
- 5.10 PAMR · PAMR : 基于均值反转的投资组合选择策略 - 修改版
- 5.11 Fisher Transform · Using Fisher Transform Indicator
- 5.12 分型假说, Hurst 指数 · 分形市场假说,一个听起来很美的假说
- 5.13 变点理论 · 变点策略初步
- 5.14 Z-score Model
- Zscore Model Tutorial
- 信用债风险模型初探之:Z-Score Model
- user-defined package
- 5.15 机器学习 · Machine Learning 学习笔记(一) by OTreeWEN
- 5.16 DualTrust 策略和布林强盗策略
- 5.17 卡尔曼滤波
- 5.18 LPPL anti-bubble model
- 今天大盘熔断大跌,后市如何—— based on LPPL anti-bubble model
- 破解股市泡沫之谜——对数周期幂率(LPPL)模型
- 六 大数据模型
- 6.1 市场情绪分析
- 通联情绪指标策略
- 互联网+量化投资 大数据指数手把手
- 6.2 新闻热点
- 如何使用优矿之“新闻热点”?
- 技术分析【3】—— 众星拱月,众口铄金?
- 七 排名选股系统
- 7.1 小市值投资法
- 学习笔记:可模拟(小市值+便宜 的修改版)
- 市值最小300指数
- 流通市值最小股票(新筛选器版)
- 持有市值最小的10只股票
- 10% smallest cap stock
- 7.2 羊驼策略
- 羊驼策略
- 羊驼反转策略(修改版)
- 羊驼反转策略
- 我的羊驼策略,选5只股无脑轮替
- 7.3 低价策略
- 专捡便宜货(新版quartz)
- 策略原理
- 便宜就是 alpha
- 八 轮动模型
- 8.1 大小盘轮动 · 新手上路 -- 二八ETF择时轮动策略2.0
- 8.2 季节性策略
- Halloween Cycle
- Halloween cycle 2
- 夏买电,东买煤?
- 历史的十一月板块涨幅
- 8.3 行业轮动
- 银行股轮动
- 申万二级行业在最近1年、3个月、5个交易日的涨幅统计
- 8.4 主题轮动
- 快速研究主题神器
- recommendation based on subject
- strategy7: recommendation based on theme
- 板块异动类
- 风险因子(离散类)
- 8.5 龙头轮动
- Competitive Securities
- Market Competitiveness
- 主题龙头类
- 九 组合投资
- 9.1 指数跟踪 · [策略] 指数跟踪低成本建仓策略
- 9.2 GMVP · Global Minimum Variance Portfolio (GMVP)
- 9.3 凸优化 · 如何在 Python 中利用 CVXOPT 求解二次规划问题
- 十 波动率
- 10.1 波动率选股 · 风平浪静 风起猪飞
- 10.2 波动率择时
- 基于 VIX 指数的择时策略
- 简单低波动率指数
- 10.3 Arch/Garch 模型 · 如何使用优矿进行 GARCH 模型分析
- 十一 算法交易
- 11.1 VWAP · Value-Weighted Average Price (VWAP)
- 十二 中高频交易
- 12.1 order book 分析 · 基于高频 limit order book 数据的短程价格方向预测—— via multi-class SVM
- 12.2 日内交易 · 大盘日内走势 (for 择时)
- 十三 Alternative Strategy
- 13.1 易经、传统文化 · 老黄历诊股
- 第三部分 基金、利率互换、固定收益类
- 一 分级基金
- “优矿”集思录——分级基金专题
- 基于期权定价的分级基金交易策略
- 基于期权定价的兴全合润基金交易策略
- 二 基金分析
- Alpha 基金“黑天鹅事件” -- 思考以及原因
- 三 债券
- 债券报价中的小陷阱
- 四 利率互换
- Swap Curve Construction
- 中国 Repo 7D 互换的例子
- 第四部分 衍生品相关
- 一 期权数据
- 如何获取期权市场数据快照
- 期权高频数据准备
- 二 期权系列
- [ 50ETF 期权] 1. 历史成交持仓和 PCR 数据
- 【50ETF期权】 2. 历史波动率
- 【50ETF期权】 3. 中国波指 iVIX
- 【50ETF期权】 4. Greeks 和隐含波动率微笑
- 【50ETF期权】 5. 日内即时监控 Greeks 和隐含波动率微笑
- 【50ETF期权】 5. 日内即时监控 Greeks 和隐含波动率微笑
- 三 期权分析
- 【50ETF期权】 期权择时指数 1.0
- 每日期权风险数据整理
- 期权头寸计算
- 期权探秘1
- 期权探秘2
- 期权市场一周纵览
- 基于期权PCR指数的择时策略
- 期权每日成交额PC比例计算
- 四 期货分析
- 【前方高能!】Gifts from Santa Claus——股指期货趋势交易研究