def get_opm_weight_individual( signal=pd.DataFrame(), start_date='2017-01-01', end_date='2020-08-31', out_path='E:/FT_Users/LihaiYang/Files/factor_comb_data/all_cluster_comb/1_pm.csv' ): pm = po.Portfolio_Management(signal, start_date=start_date, end_date=end_date, num_holdings=cfg.PARAMS_PM['num_holdings'], style_neutral=False, industry_neutral=True, to_bound=cfg.PARAMS_PM['to_bound']) tdays = query_data.get_trade_days('d', from_trade_day=start_date, to_trade_day=end_date) newdf = pd.DataFrame() w_b, expo = pm.solve(tdays[1]) newdf = newdf.append(w_b) for tday in tdays[2:]: print(tday) w_b11, expo1 = pm.solve(tday, w_lastday=w_b) w_b = w_b11.copy() newdf = newdf.append(w_b) newdf.index = tdays[1:] newdf.to_csv(out_path) print(w_b.head())
ic_sign = [ uc.sign(i['perf'][list(i['perf'].keys())[0]]['ic-mean']) for i in mine_summary ] print(len(ic_sign)) # 提取因子值 factor_value = fetch.fetch_factor(begin, end, fields=fac_name, standard='clean1_alla', codes=None, df=False) # 有些因子数据不足1009个,比较奇怪 factor_value = { k: v for k, v in factor_value.items() if len(v) == len( query_data.get_trade_days('d', from_trade_day=begin, to_trade_day=end)) } # 调整因子正负 factor_value_adj = {} for summa in mine_summary: if summa['factor_name'] in list(factor_value.keys()): factor_value_adj[summa['factor_name']] = factor_value[summa['factor_name']] * \ uc.sign(summa['perf'][list(summa['perf'].keys())[0]]['ic-mean']) f = open( 'E:/FT_Users/LihaiYang/Files/factor_comb_data/all_fac_li_20170101-20210228/all_fac_li_20170101-20210228.pkl', 'wb') pickle.dump(factor_value_adj, f, -1) f.close()
import pandas as pd import pickle from matplotlib import pyplot as plt import statsmodels.api as sm import numpy as np import math from ft_platform.utils import utils_calculation as uc from utils_func import query_data data_pat = 'E:/FT_Users/LihaiYang/Files/factor_comb_data/fac_meaning/all_cluster' new_f = pd.read_pickle(data_pat + '/fac_reshape.pkl') trade_days = query_data.get_trade_days('d', 'SSE', '2017-01-01', '2021-02-28') # 记得修改 trade_days = [pd.to_datetime(i) for i in trade_days] # 每天的截面回归估计因子暴露 coef = {} R_sq = {} for date in trade_days: sub_data = new_f.loc[date, ] model = sm.OLS(sub_data.iloc[:, -1], sm.add_constant(sub_data.iloc[:, 0:-1]), missing='drop').fit() coef[date] = model.params R_sq[date] = model.rsquared_adj print(date) coef_param = pd.concat(coef.values(), axis=1, keys=coef.keys()) coef_param = pd.DataFrame(coef_param.values.T, index=coef_param.columns, columns=coef_param.index) # 转置 r2_param = pd.DataFrame(R_sq.values(),