一份朴实的声明。。。
1. 基于joinquant,大部分代码是原作者所写,俺只是改写、补充。。。
2. 源码见:https://www.joinquant.com/post/775
3. 基于因子打分,不是因子回归
思路:单因子打分,分值赋权个股形成单因子组合,再等权加权单因子组合,变为多因子策略
----------------------------------------------------------------------------------------
## step1:导入所需的库
import pandas as pdfrom pandas
import Series, DataFrame
import numpy as npimport statsmodels.api as sm
import scipy.stats as scs
import matplotlib.pyplot as plt
## step2:三个函数
# 函数1:获取因子
factors = ['B/M','EPS','PEG','ROE','ROA','GP/R','P/R','L/A','FAP','CMV']
#月初取出因子数值
def get_factors(fdate,factors):
stock_set = get_index_stocks('000001.XSHG',fdate)
q = query( valuation.code, balance.total_owner_equities/valuation.market_cap/100000000, income.basic_eps, valuation.pe_ratio, income.net_profit/balance.total_owner_equities, income.net_profit/balance.total_assets, income.total_profit/income.operating_revenue, income.net_profit/income.operating_revenue, balance.total_liability/balance.total_assets, balance.fixed_assets/balance.total_assets, valuation.circulating_market_cap ).filter( valuation.code.in_(stock_set), valuation.circulating_market_cap )
fdf = get_fundamentals(q, date=fdate)
fdf.index = fdf['code']
fdf.columns = ['code'] + factors
return fdf.iloc[:,-10:]
# 函数2和3:计算因子及benchmark的月收益
def caculate_port_monthly_return(port,startdate,enddate,nextdate,CMV):
close1 = get_price(port, startdate, enddate, 'daily', ['close']) #面板数据 <class 'pandas.core.panel.Panel'>
close2 = get_price(port, enddate, nextdate, 'daily',['close']) #面板数据 <class 'pandas.core.panel.Panel'>
weighted_m_return = ((close2['close'].ix[0,:]/close1['close'].ix[0,:]-1)).mean() #等权加权
return weighted_m_return
def caculate_benchmark_monthly_return(startdate,enddate,nextdate):
close1 = get_price(['000300.XSHG'],startdate,enddate,'daily',['close'])['close']
close2 = get_price(['000300.XSHG'],enddate, nextdate, 'daily',['close'])['close']
benchmark_return = (close2.ix[0,:]/close1.ix[0,:]-1).sum()
print close1
return benchmark_return
## step3:核心策略
factors = ['B/M','EPS','PEG','ROE','ROA','GP/R','P/R','L/A','FAP','CMV']#因为研究模块取fundmental数据默认date为研究日期的前一天。所以要自备时间序列。按月取
year = ['2011','2012','2013','2014','2015','2016','2017']
month = ['01','02','03','04','05','06','07','08','09','10','11','12']
result = {}
for i in range(7*12):
startdate = year[i/12] + '-' + month[i%12] + '-01'
try:
enddate = year[(i+1)/12] + '-' + month[(i+1)%12] + '-01'
except IndexError:
enddate = '2018-01-01'
try:
nextdate = year[(i+2)/12] + '-' + month[(i+2)%12] + '-01'
except IndexError:
if enddate == '2018-01-01':
nextdate = '2018-02-01'
else:
nextdate = '2018-01-01'
#print 'time %s'%startdate
fdf = get_factors(startdate,factors)
CMV = fdf['CMV'] #5个组合,10个因子
df = DataFrame(np.zeros(6*10).reshape(6,10),index = ['port1','port2','port3','port4','port5','benchmark'],columns = factors)
for fac in factors:
score = fdf[fac].order()
port1 = list(score.index)[: len(score)/5]
port2 = list(score.index)[ len(score)/5+1: 2*len(score)/5]
port3 = list(score.index)[ 2*len(score)/5+1: -2*len(score)/5]
port4 = list(score.index)[ -2*len(score)/5+1: -len(score)/5]
port5 = list(score.index)[ -len(score)/5+1: ]
df.ix['port1',fac] = caculate_port_monthly_return(port1,startdate,enddate,nextdate,CMV)
df.ix['port2',fac] = caculate_port_monthly_return(port2,startdate,enddate,nextdate,CMV)
df.ix['port3',fac] = caculate_port_monthly_return(port3,startdate,enddate,nextdate,CMV)
df.ix['port4',fac] = caculate_port_monthly_return(port4,startdate,enddate,nextdate,CMV)
df.ix['port5',fac] = caculate_port_monthly_return(port5,startdate,enddate,nextdate,CMV)
df.ix['benchmark',fac] = caculate_benchmark_monthly_return(startdate,enddate,nextdate)
#print 'factor %s'%fac
result[i+1]=dfmonthly_return = pd.Panel(result)
## step4:模型评价
total_return = {}
annual_return = {}
excess_return = {}
annual_volatility={}
sharpe={}
information_ratio={}
win_prob = {}
drawdown={}
tr={}
for fac in factors:
monthly = monthly_return[:,:,fac]
total_return[fac] = (monthly+1).T.cumprod().iloc[-1,:]-1
annual_return[fac] = (total_return[fac]+1)**(1./6)-1
excess_return[fac] = annual_return[fac]*0.7- annual_return[fac][-1]
annual_volatility[fac]=monthly.T.std()
sharpe[fac]=(annual_return[fac]-0.04)/annual_volatility[fac]
information_ratio[fac]=(annual_return[fac]-annual_return[fac][-1])/annual_volatility[fac]
drawdown[fac]=monthly.T.min()
win_excess = monthly.iloc[0,:]*0.7-monthly.iloc[-1,:]
win_prob[fac]=win_excess[win_excess>0].count()/float(len(win_excess))
### step5:Smart Beta指数的编制 #把一个三维的panel按因子降维,即对因子求平均,使因子这一维度消失掉 # 也即将因子类子指数等权加权,编制成指数 columns= ['port1','port2','port3','port4','port5','benchmark'] avg_data= DataFrame(np.zeros(85*6).reshape(85,6),columns= ['port1','port2','port3','port4','port5','benchmark']) for i in columns: avg_data[i]=pd.DataFrame((monthly_return[:,i,:]).mean()) #(monthly_return[:,2,:]).mean() #avg_data avg_total_return=(avg_data+1).cumprod().iloc[-1,:]-1 avg_annual_return= (avg_total_return+1)**(1./6)-1 avg_excess_return= avg_annual_return*0.7- avg_annual_return[-1] avg_annual_volatility=avg_data.std() avg_information_ratio=avg_excess_return/avg_annual_volatility avg_sharpe=(avg_annual_return-0.04)/avg_annual_volatility avg_drawdown=avg_data.min() avg_win_excess = avg_data.T.iloc[5,:]*0.7-avg_data.T.iloc[-1,:] avg_win_prob=avg_win_excess[avg_win_excess>0].count()/float(len(avg_win_excess)) avg_win_prob plt.figure(figsize =(8,4)) plt.plot((avg_data+1).cumprod().ix[:,0], 'r',label = '%s'%fac ,alpha=0.5) plt.plot((monthly.ix[-1,:].T+1).cumprod(), 'blue',label = '沪深300指数',alpha=0.5) plt.xlabel('净值曲线') plt.legend(loc='upper left',ncol=2)

单因子 amp; 多因子策略(基于JoinQuant)相关推荐

  1. 基于夏普比率对因子的筛选,以及基于股票期货交易策略对多因子策略的机器学习算法探讨

    试论因子的筛选,股票期货策略,以及基于多因子策略的机器学习算法 前言 正文 股票因子的筛选 股票期货策略 基于多因子策略的机器学习 前言 之前参加泰迪杯的,但又没什么时间,自己又是python新手,量 ...

  2. 12、【股票策略】使用backtrader回测升级版的狗股策略-基于股息率和市净率两个因子

    12.使用backtrader回测升级版的狗股策略-基于股息率和市净率两个因子 更进一步的回测代码可以参考版本4:[股票策略]使用backtrader测试狗股策略版本4-在版本3的基础上进行代码改进优 ...

  3. 双因子与多因子身份验证有什么区别?

    双因子身份验证(Two-Factor Authentication, 2FA)是多因子身份验证(Multi-Factor Authentication, MFA)的一种.这两种身份验证解决方案都需要额 ...

  4. arcgis交通可达性分析步骤_【规划广角】街道慢行品质的多维度评价与导控策略——基于多源城市数据的整合分析...

    欢迎点击以上蓝色字体 关注规划师杂志 作者苏州规划设计研究院交通所所长.同济大学建筑与城市规划学院博士研究生樊钧,同济大学建筑与城市规划学院硕士研究生唐皓明,同济大学建筑与城市规划学院助理教授.硕士生 ...

  5. 规模因子和价值因子—进一步理解系统性风险

    上世纪二十年代的美国,当时的美国股市是一个高度散户化的市场,很多人就从交易中总结了市场规律,许多形形色色的规律都是昙花一现,唯独有两个策略经久不衰. 其中一个规律是买入市净率低的股票,"市净 ...

  6. 办公自动化部署策略—— 基于IBM WCS/ WMC实现

    办公自动化部署策略 -- 基于IBM WCS/ WMC实现 长江大学电信系  佘新平   徐建明 2005年11月25日     摘要     面向激烈的市场竞争,采用以网络为中心的信息技术,使办公更 ...

  7. 快递单信息抽取【二】基于ERNIE1.0至ErnieGram + CRF预训练模型

    相关文章: 1.快递单中抽取关键信息[一]----基于BiGRU+CR+预训练的词向量优化 2.快递单信息抽取[二]基于ERNIE1.0至ErnieGram + CRF预训练模型 3.快递单信息抽取[ ...

  8. 初探多因子选股:多因子筛选与因子正交化

    多因子筛选与因子正交化 引言 在多因子研究框架中,如果已经检验出多个有效的因子,而在实际因子选股的过程中,各个有效的因子可能会相互影响,而高度相关的两个有效因子,即使都有不错的获取alpha的能力,但 ...

  9. 【量化交易】 量化因子 情绪类因子计算

    量化因子 - 情绪类因子 中证500,近三年超额收益因子排序 10日成交量标准差 VSTD10 10日成交量去标准差 成交量的5日指数移动平均 VEMA5 成交量的5日指数移动平均 成交量的10日指数 ...

最新文章

  1. Ios生产证书申请(含推送证书)
  2. 经典的《JavaScript 权威指南》中的“对象”不经典
  3. BeagleBone Black快速入门教程
  4. 快速搞懂监控、链路追踪、日志三者的区别
  5. web前端知识体系大全
  6. Java 洛谷 P1014 Cantor表
  7. java实验1_Java程序实验1
  8. 判断给定数字n是否为素数(质数)
  9. IDEA自动勾选显示类型(specify type)
  10. windows程序设计一 最简单的windows程序
  11. 【前端项目】<开发实战>一个小而精致的个人简历
  12. [高通SDM450][Android9.0]PL2303G驱动升级
  13. html中引入字体包
  14. matlab中数字分频器的,数字分频器原理及设计.pdf
  15. 端子台UL认证 UL 1059
  16. 阻抗测量单芯片方案AD5933 芯片使用方法
  17. 深度解析dubbo在线运维Qos
  18. Cell Ranger count (gene expression) 输出文件解读
  19. (二)Spring中的ioc
  20. 警告当当成错误 may be used uninitialized in this function [-Werror=maybe-uninitialized]

热门文章

  1. java防止xff伪造ip
  2. 抖音、微信关闭个性化推荐功能上线,用户真能摆脱“算法牢笼”吗?
  3. multisim 四位数码管_multisim中数码管 DCD-HEX 四个引脚都是指的什么?
  4. opencv学习 Warp Perspective
  5. odoo权限管理详解
  6. mac技巧|文件管理方法分享
  7. 华尔街日报:反思互联网泡沫
  8. 《涂抹Oracle-三思笔记之一步一步学Oracle》出炉手记
  9. 外汇量化交易——高频策略
  10. python 实现HMM