@Channelchan
2017-07-10T21:12:30.000000Z
字数 2920
阅读 31883
设计一个因子,需要将每一个股票计算后再合成一张表。
import numpy as np
import pandas as pd
from fxdayu_alphaman.factor.factor import Factor
class Factor_Volume001(Factor):
c = 6
def calculate_volume001(self, data):
# 逐支股票计算volume003因子
candle_data = data[1].dropna()
if len(candle_data) == 0:
return
high = 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.index
factor_volume001 = pd.DataFrame(factor_volume001)
factor_volume001.columns = [data[0],]
return factor_volume001
def factor_calculator(self, pn_data):
# volume001
factor_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 plt
from 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 factor
test_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_ic
print performance_list[0].factor_name
# for perf in performance_list:
# print("\n")
# print(perf.mean_ic)
# print(perf.factor_name)