技术信号选股
写单个选股器
# encoding:utf-8from datetime import datetime, timedeltaimport pandas as pdfrom fxdayu_data import DataAPIfrom talib.abstract import MAfrom fxdayu_alphaman.selector.selector import Selectorclass DayMA(Selector): # 在此处设置选股器相关参数 fast = 5 slow = 10 max_window = 30 #最大回溯单位时间数 可选 默认100 def calculate_MA_signal(self, data): candle_data = data[1].dropna() if len(candle_data) == 0: return fast = MA(candle_data, timeperiod=self.fast) slow = MA(candle_data, timeperiod=self.slow) f_over_s = fast - slow >0 f_under_s = fast - slow <=0 cross_over = (f_under_s.shift(1)) * f_over_s cross_under = - (f_over_s.shift(1))*f_under_s choice = pd.DataFrame(cross_over + cross_under) choice.columns = [data[0],] return choice def execute(self, pool, start, end, data=None, data_config=None): """ 计算选股结果 :param pool: list 待选股票池 data:进行选股操作所需要的数据 start:datetime 选股索引范围起始时间 end:datetime 选股索引范围结束时间 :return:selector_result:A MultiIndex Series indexed by date (level 0) and asset (level 1), containing the values mean whether choose the asset or not. ----------------------------------- date | asset | ----------------------------------- | AAPL | 1 ----------------------- | BA | 1 ----------------------- 2014-01-01 | CMG | 1 ----------------------- | DAL | 0 ----------------------- | LULU | -1 ----------------------- """ if not data: data = DataAPI.get(symbols=tuple(pool), start=start-timedelta(days=self.max_window) , end = end, **data_config) selector_result = map(self.calculate_MA_signal, data.iteritems()) selector_result = pd.concat(selector_result, axis=1).stack() selector_result.index.names = ["date","asset"] return selector_result.loc[start:end]
选股器单元测试
def unit_test(): #选股器单元测试——通过Admin selector_admin = Admin() result = selector_admin.instantiate_selector_and_get_selector_result("DayMA",codes,start,end,data_config=data_config)# print(selector_admin) print(result) return(selector_admin , result)####### testselector_admin , result = unit_test()
选股绩效测试
def test_performance(selector_admin,result): performance = selector_admin.calculate_performance("DayMA", result[result>0], #结果大于0的(选出的) start, end, periods=periods, benchmark_return=hs300_return) print(performance["mean_return"]) #选股策略平均持有收益 print(performance["key_performance_indicator"]) #关键性绩效指标 print(performance["upside_return"]) #上行收益 print(performance["upside_distribution_features"]) #上行收益特征 print(performance["downside_return"]) #下行收益 print(performance["downside_distribution_features"]) #下行收益特征 # 支持类属性的调用方式 print(performance.holding_return) #持有收益 print(performance.holding_distribution_features) #持有收益特征 return performanceperformance = test_performance(selector_admin,result)
优化选股器参数
para_range_dict = {"fast":range(2,5,1),"slow":range(10,15,1)}results_list, para_dict_list = selector_admin.enumerate_parameter("DayMA", para_range_dict, codes, start, end, data_config=data_config, parallel=False)# 批量计算多个不同参数下方案的绩效表现strategy_name_list = []strategy_result_list = []for i in range(len(results_list)): print("\n") strategy_name = "DayMA+" + str(para_dict_list[i]) print(strategy_name) strategy_name_list.append(strategy_name) strategy_result = results_list[i][results_list[i]>0] print(strategy_result) strategy_result_list.append(strategy_result) #只记录大于0的结果performance_list = selector_admin.show_strategies_performance(strategy_name_list, strategy_result_list, start, end, periods=periods, benchmark_return=hs300_return, parallel=False)for perf in performance_list: print("\n") print(perf.strategy_name) print(perf.key_performance_indicator)