[关闭]
@Channelchan 2017-07-10T21:12:30.000000Z 字数 2920 阅读 31883

因子排序选股


创造一个因子

设计一个因子,需要将每一个股票计算后再合成一张表。

  1. import numpy as np
  2. import pandas as pd
  3. from fxdayu_alphaman.factor.factor import Factor
  4. class Factor_Volume001(Factor):
  5. c = 6
  6. def calculate_volume001(self, data):
  7. # 逐支股票计算volume003因子
  8. candle_data = data[1].dropna()
  9. if len(candle_data) == 0:
  10. return
  11. high = candle_data["high"]
  12. volume = candle_data["volume"]
  13. adv_s = self.ts_mean(volume, 10)
  14. factor_volume001 = - self.correlation(high, adv_s, self.c) #计算因子值
  15. factor_volume001.index = candle_data.index
  16. factor_volume001 = pd.DataFrame(factor_volume001)
  17. factor_volume001.columns = [data[0],]
  18. return factor_volume001
  19. def factor_calculator(self, pn_data):
  20. # volume001
  21. factor_volume001 = map(self.calculate_volume001, pn_data.iteritems())
  22. factor_volume001 = pd.concat(factor_volume001, axis=1)
  23. factor_volume001 = self.winsorize(factor_volume001) #去极值
  24. factor_volume001 = self.standardize(factor_volume001) #标准化
  25. # factor_volume001 = self.neutralize(factor_volume001, factorIsMV=False) #行业、市值中性化
  26. factor_volume001 = self.factor_df_to_factor_mi(factor_volume001) #格式标准化
  27. # factor_volume001 = self.get_factor_by_rankScore(factor_volume001, ascending=True) # 将因子用排序分值重构,并处理到0-1之间(默认为升序——因子越大 排序分值越大(越好)
  28. # 具体根据因子对收益的相关关系而定,为正则应用升序,为负用降序)
  29. return factor_volume001

测试绩效

  1. def test_performance(factor, prices):
  2. import matplotlib.pyplot as plt
  3. from alphalens import utils,performance,plotting
  4. # 持股收益-逐只
  5. stocks_holding_return = utils.get_clean_factor_and_forward_returns(factor,prices,quantiles=5,periods=(1,5,10))
  6. print("因子的IC值:")
  7. ic = performance.factor_information_coefficient(stocks_holding_return)
  8. print(ic)
  9. plotting.plot_ic_hist(ic)
  10. plt.show()
  11. plotting.plot_ic_ts(ic)
  12. plt.show()
  13. print("平均IC值-月:")
  14. mean_ic = performance.mean_information_coefficient(stocks_holding_return,by_time="M")
  15. plotting.plot_monthly_ic_heatmap(mean_ic)
  16. plt.show()
  17. # 按quantile区分的持股平均收益(减去了总体平均值)
  18. mean_return_by_q = performance.mean_return_by_quantile(stocks_holding_return, by_date=True, demeaned=True)[0]
  19. # 按quantile画出累积持有收益
  20. for i in [1, 5, 10]:
  21. plotting.plot_cumulative_returns_by_quantile(mean_return_by_q, period=i)
  22. plt.show()
  23. # print factor
  24. test_performance(factor,prices)
  25. ## 读取IC历史绩效
  26. admin = Admin()
  27. original_perf = admin.calculate_performance('cool',factor,start,end,periods=(1,5,10),quantiles=5,price=prices)
  28. print(original_perf.mean_ic)

优化因子

  1. # 参数优化
  2. volume = Factor_Volume001()
  3. para_range_dict = {"c":range(4,11,1)}
  4. factor_value_list,para_dict_list = admin.enumerate_parameter('cool',para_range_dict,codes,start,end, Factor=volume)
  5. factor_name_list = []
  6. for para_dict in para_dict_list:
  7. factor_name_list.append("Factor_Volume001+" + str(para_dict))
  8. performance_list = admin.show_factors_performance(factor_name_list,factor_value_list,start,end,periods=(1,5,10),quantiles=5,price=prices)
  9. # print("#####################################################################################")
  10. # 按绩效指标对结果排序(寻优) 本例按10天持有期的mean_IC降序排列了所有结果。
  11. performance_list = admin.rank_performance(performance_list,
  12. target_period=10,
  13. ascending=False)
  14. print performance_list[0].mean_ic
  15. print performance_list[0].factor_name
  16. # for perf in performance_list:
  17. # print("\n")
  18. # print(perf.mean_ic)
  19. # print(perf.factor_name)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注