第一部分 新手入门
- 一 量化投资视频学习课程
- 二 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.8 SMIA
行业轮动分析
本文主要参考广发金工的研报《基于历史状态空间相似性匹配的行业配置SMIA 模型》中所用的方法,通过量化实验室平台完成实证的过程。
1.策略思想
随机过程可以划分为有记忆性特征和无记忆性特征两种。行业轮动具有记忆性,即当期行业的相对表现会影响下一期行业的相对表现,这是由行业之间错综复杂的经济关系所决定的。我们通过寻找历史状态空间中与当期行业收益率排名相似的一些时间点,观察这些时间点之后一期行业轮动的变化特征,从中选取统计上表现较好的行业,作为当前时间点下一期的推荐超配行业,从而实现相似性匹配行业配置(Similarity Matching Industry Allocation,缩写为SMIA)量化模型的构建。
2.实证过程
def distanceGet(history, test):
#计算欧式距离
distance = sum((history - test).values**2)
return distance
下面的策略作了一些改变,变成行业之间取交集。需要测试别的距离的效果,也可以在上面的函数直接改哦。
start = '2014-01-01' # 回测起始时间
end = '2015-01-01' # 回测结束时间
benchmark = 'HS300' # 策略参考标准
universe = universeGet(getIndustryInfo()) # 证券池,支持股票和基金
capital_base = 1000000 # 起始资金
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 22 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
Select_Match = 3 # 选取三个最相似的行业市场排名状态
Select_Order = 14 # 选取收益率最高的十四个行业
fixYield = DataFrame(fixInd_meanYield).rank(axis=1) #将收益率矩阵变为序号矩阵
def initialize(account): # 初始化虚拟账户状态
pass
#总体思路是根据调仓时期,将最近22个交易日的的收益率按行业排序,拿之前所有数据源进行匹配,用欧式距离找出最接近的排序的3期,选取它们的下一期,再挑选出这些期行业收益率前两个名的行业。
def handle_data(account): # 每个交易日的买入卖出指令
today = account.current_date
if today.strftime("%Y-%m-%d") == '2014-01-02' : #当回测开始调仓时(2014-01-01元旦不交易,顺延到1月2号),不需要调用addYield(current_date)函数
fixYield_history = fixYield.ix[:len(fixYield)-2] #将最后一期之前的数据,作为匹配数据源
fixYield_test = fixYield.ix[len(fixYield)-1] #选取最后一期数据来和其他数据源做匹配
distance = pd.Series(np.zeros(len(fixYield_history ))) #初始化
for i in xrange(len(fixYield_history)):
distance[i] = distanceGet(fixYield_history.ix[i],fixYield_test )
sort_distance = distance.order() #按distance中的值排序,然而其索引值仍保留
indexSort = sort_distance.index #distance的索引并没有改变,我们得到了它的索引,就可以反过来在fixYield中找到最匹配的源数据
#industryList = []
industryList = set()
intersectionList = set()
for i in xrange(Select_Match):
Match_Period = dict(fixYield.ix[indexSort[i]+1]) #取distance值在前3的索引,将这个索引加1,得到最匹配的数据源的下一期
#industryList = industryList + nlargest(Select_Order, Match_Period, key=Match_Period.get) #取收益率最高的四个索引(行业)
industryList = set(nlargest(Select_Order, Match_Period, key=Match_Period.get))
if i == 0:
intersectionList = industryList
else:
intersectionList = intersectionList & industryList
#industryList = list(set(industryList)) #得到我们选出的行业
intersectionList = list(intersectionList)
else:
addInd_meanYield = addYield(account.current_date) #除去最开始调仓,我们都需要调用addYield(current_date)得到更多的数据源
addInd_meanYield = DataFrame(addInd_meanYield).rank(axis=1) #将收益率矩阵变序号矩阵
addInd_meanYield_history = addInd_meanYield.ix[:len(addInd_meanYield)-2] #将这些数据也作为匹配数据源
addInd_meanYield_test = addInd_meanYield.ix[len(addInd_meanYield)-1] #选取最后一期数据来和其他数据源做匹配
distance = pd.Series(np.zeros(len(addInd_meanYield_history)+len(fixYield )))
for i in xrange(len(fixYield)):
distance[i] = distanceGet(fixYield.ix[i],addInd_meanYield_test)
for i in xrange(len(fixYield),len(fixYield) + len(addInd_meanYield_history)):
distance[i] = distanceGet(addInd_meanYield_history.ix[i-len(fixYield)],addInd_meanYield_test)
sort_distance = distance.order()
indexSort = sort_distance.index
#industryList = []
industryList = set()
intersectionList = set()
for i in xrange(Select_Match): #选取3个匹配
if indexSort[i]+1 < len(fixYield): #若找的日期不超过fixYield的范围,直接计算。
Match_Period = dict(fixYield.ix[indexSort[i]+1])
#industryList = industryList + nlargest(Select_Order, Match_Period, key=Match_Period.get)
industryList = set(nlargest(Select_Order, Match_Period, key=Match_Period.get))
elif indexSort[i]+1 < len(distance) : #若找到的日期不超过所有数据期数减一,但超过了fixYield的范围,则匹配在addInd_meanYield_history中
Match_Period = dict(addInd_meanYield_history.ix[indexSort[i]+1-len(fixYield)])
#industryList = industryList + nlargest(Select_Order, Match_Period, key=Match_Period.get)
industryList = set(nlargest(Select_Order, Match_Period, key=Match_Period.get))
else: #这里其实就是找到了本身,其匹配源数据找到了上一期
Match_Period = dict(addInd_meanYield_test)
#industryList = industryList + nlargest(Select_Order, Match_Period, key=Match_Period.get)
industryList = set(nlargest(Select_Order, Match_Period, key=Match_Period.get))
if i == 0:
intersectionList = industryList
else:
intersectionList = intersectionList & industryList
#industryList = list(set(industryList))
intersectionList = list(intersectionList)
buyList = []
for key in indContent:
if key in intersectionList:
buyList = buyList + indContent[key]
#除去不在account.universe以及停牌和新股
for stk in buyList[:]:
if stk not in account.universe or account.referencePrice[stk] == 0 or np.isnan(account.referencePrice[stk]):
buyList.remove(stk)
for stk in account.valid_secpos:
order_to(stk, 0)
for stk in buyList:
order(stk, account.referencePortfolioValue/account.referencePrice[stk]/len(buyList))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论