@Channelchan
2017-07-10T13:12:30.000000Z
字数 2920
阅读 32044
设计一个因子,需要将每一个股票计算后再合成一张表。
import numpy as npimport pandas as pdfrom fxdayu_alphaman.factor.factor import Factorclass Factor_Volume001(Factor):c = 6def calculate_volume001(self, data):# 逐支股票计算volume003因子candle_data = data[1].dropna()if len(candle_data) == 0:returnhigh = candle_data["high"]volume = candle_data["volume"]adv_s = self.ts_mean(volume, 10)factor_volume001 = - self.correlation(high, adv_s, self.c) #计算因子值factor_volume001.index = candle_data.indexfactor_volume001 = pd.DataFrame(factor_volume001)factor_volume001.columns = [data[0],]return factor_volume001def factor_calculator(self, pn_data):# volume001factor_volume001 = map(self.calculate_volume001, pn_data.iteritems())factor_volume001 = pd.concat(factor_volume001, axis=1)factor_volume001 = self.winsorize(factor_volume001) #去极值factor_volume001 = self.standardize(factor_volume001) #标准化# factor_volume001 = self.neutralize(factor_volume001, factorIsMV=False) #行业、市值中性化factor_volume001 = self.factor_df_to_factor_mi(factor_volume001) #格式标准化# factor_volume001 = self.get_factor_by_rankScore(factor_volume001, ascending=True) # 将因子用排序分值重构,并处理到0-1之间(默认为升序——因子越大 排序分值越大(越好)# 具体根据因子对收益的相关关系而定,为正则应用升序,为负用降序)return factor_volume001
def test_performance(factor, prices):import matplotlib.pyplot as pltfrom alphalens import utils,performance,plotting# 持股收益-逐只stocks_holding_return = utils.get_clean_factor_and_forward_returns(factor,prices,quantiles=5,periods=(1,5,10))print("因子的IC值:")ic = performance.factor_information_coefficient(stocks_holding_return)print(ic)plotting.plot_ic_hist(ic)plt.show()plotting.plot_ic_ts(ic)plt.show()print("平均IC值-月:")mean_ic = performance.mean_information_coefficient(stocks_holding_return,by_time="M")plotting.plot_monthly_ic_heatmap(mean_ic)plt.show()# 按quantile区分的持股平均收益(减去了总体平均值)mean_return_by_q = performance.mean_return_by_quantile(stocks_holding_return, by_date=True, demeaned=True)[0]# 按quantile画出累积持有收益for i in [1, 5, 10]:plotting.plot_cumulative_returns_by_quantile(mean_return_by_q, period=i)plt.show()# print factortest_performance(factor,prices)## 读取IC历史绩效admin = Admin()original_perf = admin.calculate_performance('cool',factor,start,end,periods=(1,5,10),quantiles=5,price=prices)print(original_perf.mean_ic)
# 参数优化volume = Factor_Volume001()para_range_dict = {"c":range(4,11,1)}factor_value_list,para_dict_list = admin.enumerate_parameter('cool',para_range_dict,codes,start,end, Factor=volume)factor_name_list = []for para_dict in para_dict_list:factor_name_list.append("Factor_Volume001+" + str(para_dict))performance_list = admin.show_factors_performance(factor_name_list,factor_value_list,start,end,periods=(1,5,10),quantiles=5,price=prices)# print("#####################################################################################")# 按绩效指标对结果排序(寻优) 本例按10天持有期的mean_IC降序排列了所有结果。performance_list = admin.rank_performance(performance_list,target_period=10,ascending=False)print performance_list[0].mean_icprint performance_list[0].factor_name# for perf in performance_list:# print("\n")# print(perf.mean_ic)# print(perf.factor_name)
