第一部分 新手入门
- 一 量化投资视频学习课程
- 二 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 多因子模型
- 1.2 基本面因子选股
- 1.3 财报阅读 • [米缸量化读财报] 资产负债表-投资相关资产
- 1.4 股东分析
- 1.5 宏观研究
- 二 套利
- 三 事件驱动
- 四 技术分析
- 4.1 布林带
- 4.2 均线系统
- 4.3 MACD
- 4.4 阿隆指标 • 技术指标阿隆( Aroon )全解析
- 4.5 CCI • CCI 顺势指标探索
- 4.6 RSI
- 4.7 DMI • DMI 指标体系的构建及简单应用
- 4.8 EMV • EMV 技术指标的构建及应用
- 4.9 KDJ • KDJ 策略
- 4.10 CMO
- 4.11 FPC • FPC 指标选股
- 4.12 Chaikin Volatility
- 4.13 委比 • 实时计算委比
- 4.14 封单量
- 4.15 成交量 • 决战之地, IF1507 !
- 4.16 K 线分析 • 寻找夜空中最亮的星
- 五 量化模型
- 5.1 动量模型
- 5.2 Joseph Piotroski 9 F-Score Value Investing Model
- 5.3 SVR
- 5.4 决策树、随机树
- 5.5 钟摆理论
- 5.6 海龟模型
- 5.7 5217 策略
- 5.8 SMIA
- 5.9 神经网络
- 5.10 PAMR
- 5.11 Fisher Transform
- 5.12 分型假说, Hurst 指数
- 5.13 变点理论
- 5.14 Z-score Model
- 5.15 机器学习
- 5.16 DualTrust 策略和布林强盗策略
- 5.17 卡尔曼滤波
- 5.18 LPPL anti-bubble model
- 六 大数据模型
- 6.1 市场情绪分析
- 6.2 新闻热点
- 七 排名选股系统
- 八 轮动模型
- 九 组合投资
- 十 波动率
- 十一 算法交易
- 十二 中高频交易
- 十三 Alternative Strategy
第三部分 基金、利率互换、固定收益类
- 一 分级基金
- 二 基金分析
- 三 债券
- 四 利率互换
第四部分 衍生品相关
- 一 期权数据
- 二 期权系列
- 三 期权分析
- 四 期货分析
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.10 PAMR
策略思路:
该策略的主要思想是用一个损失函数反映均值反转性质,即如果基于前一期相对价格的预期收益值大于一定阈值,损失值将线性增长;否则,损失为0
策略实现
m个资产每日调仓:对每个资产,收益高于总资产平均收益者,减持;收益低于总资产平均收益者,增持
具体参见文献: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.421.579&rep=rep1&type=pdf
from CAL.PyCAL import *
from numpy import *
import pandas as pd
import numpy as np
from pandas import DataFrame
import cvxopt
from cvxopt import matrix
from cvxopt.blas import dot
import cvxopt.solvers as cs
# parameters used in updatePAMR
sensitivity = 0.8
C = 600
start = datetime(2012, 12, 1)
end = datetime(2015, 5, 1)
benchmark = 'HS300'
universe = set_universe('SH180')
capital_base = 1e8
refresh_rate = 1
window = 1
tickers = [stk[0:6] for stk in universe]
portfolio = DataFrame(1.0, index = universe, columns = ['prePosition', 'position', 'relative_price'])
def initialize(account):
account.amount = capital_base
account.universe = universe
account.days = 0
def handle_data(account):
today = account.current_date
today_str = today.strftime("%Y%m%d")
for stk in universe:
hist_close = account.get_attribute_history('closePrice', 2)
hist_pre_close = account.get_attribute_history('preClosePrice', 2)
try:
portfolio['relative_price'][stk] = hist_close[stk][-1]/hist_pre_close[stk][-1]
#print stk, today_str, portfolio['relative_price'][stk]
except:
continue
portfolio['relative_price'] = portfolio['relative_price'].fillna(1.0)
portfolio['prePosition'] = portfolio['position']
a = portfolio['prePosition']
b = portfolio['relative_price']
portfolio['position'] = normalizePortfolio(updatePAMR(a, b, sensitivity, C))
for stk in portfolio.index:
try:
stk_amount = capital_base*portfolio['position'][stk]/hist_close[stk][-1]
order_to(stk, stk_amount)
except:
continue
def lossFunction(portfolio, relative_price, sensitivity):
# define a e-insensitive loss function
# portfolio vector: b
# price relative vector: x
# sensitivity parameter: e
# then: loss = max(0, dot(x,b) - e)
portfolio_return = portfolio.transpose().dot(relative_price)
if portfolio_return < sensitivity:
return 0
else:
return portfolio_return - sensitivity
def normalizePortfolio(portfolio):
# original portfolio vector: b_origin
# find b = argmin(|b - b_origin|^2) under condition:
# sum(b_i) = 1 and b_i > 0 for all i
# solve the problems using Quadratic Programming Method:
# http://abel.ee.ucla.edu/cvxopt/userguide/coneprog.html#quadratic-programming
n = portfolio.shape[0]
S = cvxopt.matrix(0.0, (n,n))
S[::n+1] = 1.0
S = S.T*S
pbar = cvxopt.matrix(portfolio.values).T*(S + S.T)
pbar = pbar.T
G = cvxopt.matrix(0.0, (n,n))
G[::n+1] = -1.0
h = cvxopt.matrix(0.0, (n,1))
A = cvxopt.matrix(1.0, (1,n))
b = cvxopt.matrix(1.0)
cvxopt.solvers.options['show_progress'] = False
x = cs.qp(S, -pbar, G, h, A, b)['x']
b = portfolio.copy()
for i in range(0, n):
b.ix[b.index[i]] = x[i]
return b
def updatePAMR(portfolio, relative_price, sensitivity, C):
# update portfolio by PAMR2 methods:
# PAMR: Passive Aggressive Mean Reversion Strategy for Portfolio Selection.
# Bin Li, Peilin Zhao, Steven C.H. Hoi, and V. Gopalkrishnan.
# Machine Learning, 2012, 87(2), 221 - 258.
loss = lossFunction(portfolio, relative_price, sensitivity)
avg_ret = relative_price.sum()/relative_price.shape[0]
tmp = ((relative_price - avg_ret)**2).sum() + 1.0/2/C
tau = loss/tmp
return portfolio - tau*(relative_price - avg_ret)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论