import numpy as np
import pandas as pd
from datetime import datetime, date, timedelta, timezone
import jqdatasdk as jq
jq.auth("18351925110","925110")
auth success
首先定义一个分组函数,方便对每年进行分组
核心思路:每年的5月末对股票池进行分组
分组策略:首先按照市值(size) 分为Big,前50%;Small ,后50%
然后按照账面价值比(bp),这里进行一个简化处理,选取pb(市净率)的相反数
分为LOW(前30%)Medium(中间40%) High(后30%)
股票组合:2*3 为BL BM BH SL SM SH
get_grooup(breakpoint): 返回6个因子组合,用来计算因子,为一个list
def get_group(breakpoint): #breakpoint 每年进行分组的时间点 字符类型 如:“2019-05-31”
breakpoint = jq.get_trade_days(end_date=breakpoint,count=1)[0] #获取breakpoint之前最近的一个交易日,含breakpoint
universe = jq.get_index_stocks("000300.XSHG",date=breakpoint) #获取沪深300指数的成分股
###############################取数据####################################################################
my_query = jq.query(jq.valuation.code,jq.valuation.circulating_market_cap,jq.valuation.pb_ratio).filter(jq.valuation.code.in_(universe))
stocks_info = jq.get_fundamentals(my_query,date=breakpoint) #获取股票的市值、PB数据
##################################算市值#################################################################
ME50 = np.percentile(stocks_info["circulating_market_cap"],50) #计算市值中位数
S = stocks_info[stocks_info["circulating_market_cap"]<=ME50]["code"].tolist() #获取小市值股票代码列表
B = stocks_info[stocks_info["circulating_market_cap"]>ME50]["code"].tolist() #获取大市值股票代码列表
#########################################算账面市值比####################################################
stocks_info["bp"] = 1/stocks_info["pb_ratio"]
BP30 = np.percentile(stocks_info["bp"],30) #计算前30%位数
BP70 = np.percentile(stocks_info["bp"],70