[关闭]
@Channelchan 2017-07-10T21:17:15.000000Z 字数 3228 阅读 31814

技术信号选股


写单个选股器

  1. # encoding:utf-8
  2. from datetime import datetime, timedelta
  3. import pandas as pd
  4. from fxdayu_data import DataAPI
  5. from talib.abstract import MA
  6. from fxdayu_alphaman.selector.selector import Selector
  7. class DayMA(Selector):
  8. # 在此处设置选股器相关参数
  9. fast = 5
  10. slow = 10
  11. max_window = 30 #最大回溯单位时间数 可选 默认100
  12. def calculate_MA_signal(self, data):
  13. candle_data = data[1].dropna()
  14. if len(candle_data) == 0:
  15. return
  16. fast = MA(candle_data, timeperiod=self.fast)
  17. slow = MA(candle_data, timeperiod=self.slow)
  18. f_over_s = fast - slow >0
  19. f_under_s = fast - slow <=0
  20. cross_over = (f_under_s.shift(1)) * f_over_s
  21. cross_under = - (f_over_s.shift(1))*f_under_s
  22. choice = pd.DataFrame(cross_over + cross_under)
  23. choice.columns = [data[0],]
  24. return choice
  25. def execute(self, pool, start, end, data=None, data_config=None):
  26. """
  27. 计算选股结果
  28. :param pool: list 待选股票池
  29. data:进行选股操作所需要的数据
  30. start:datetime 选股索引范围起始时间
  31. end:datetime 选股索引范围结束时间
  32. :return:selector_result:A MultiIndex Series indexed by date (level 0) and asset (level 1), containing
  33. the values mean whether choose the asset or not.
  34. -----------------------------------
  35. date | asset |
  36. -----------------------------------
  37. | AAPL | 1
  38. -----------------------
  39. | BA | 1
  40. -----------------------
  41. 2014-01-01 | CMG | 1
  42. -----------------------
  43. | DAL | 0
  44. -----------------------
  45. | LULU | -1
  46. -----------------------
  47. """
  48. if not data:
  49. data = DataAPI.get(symbols=tuple(pool),
  50. start=start-timedelta(days=self.max_window) ,
  51. end = end,
  52. **data_config)
  53. selector_result = map(self.calculate_MA_signal, data.iteritems())
  54. selector_result = pd.concat(selector_result, axis=1).stack()
  55. selector_result.index.names = ["date","asset"]
  56. return selector_result.loc[start:end]

选股器单元测试

  1. def unit_test():
  2. #选股器单元测试——通过Admin
  3. selector_admin = Admin()
  4. result = selector_admin.instantiate_selector_and_get_selector_result("DayMA",codes,start,end,data_config=data_config)
  5. # print(selector_admin)
  6. print(result)
  7. return(selector_admin , result)
  8. ####### test
  9. selector_admin , result = unit_test()

选股绩效测试

  1. def test_performance(selector_admin,result):
  2. performance = selector_admin.calculate_performance("DayMA",
  3. result[result>0], #结果大于0的(选出的)
  4. start,
  5. end,
  6. periods=periods,
  7. benchmark_return=hs300_return)
  8. print(performance["mean_return"]) #选股策略平均持有收益
  9. print(performance["key_performance_indicator"]) #关键性绩效指标
  10. print(performance["upside_return"]) #上行收益
  11. print(performance["upside_distribution_features"]) #上行收益特征
  12. print(performance["downside_return"]) #下行收益
  13. print(performance["downside_distribution_features"]) #下行收益特征
  14. # 支持类属性的调用方式
  15. print(performance.holding_return) #持有收益
  16. print(performance.holding_distribution_features) #持有收益特征
  17. return performance
  18. performance = test_performance(selector_admin,result)

优化选股器参数

  1. para_range_dict = {"fast":range(2,5,1),"slow":range(10,15,1)}
  2. results_list, para_dict_list = selector_admin.enumerate_parameter("DayMA",
  3. para_range_dict,
  4. codes,
  5. start,
  6. end,
  7. data_config=data_config,
  8. parallel=False)
  9. # 批量计算多个不同参数下方案的绩效表现
  10. strategy_name_list = []
  11. strategy_result_list = []
  12. for i in range(len(results_list)):
  13. print("\n")
  14. strategy_name = "DayMA+" + str(para_dict_list[i])
  15. print(strategy_name)
  16. strategy_name_list.append(strategy_name)
  17. strategy_result = results_list[i][results_list[i]>0]
  18. print(strategy_result)
  19. strategy_result_list.append(strategy_result) #只记录大于0的结果
  20. performance_list = selector_admin.show_strategies_performance(strategy_name_list,
  21. strategy_result_list,
  22. start,
  23. end,
  24. periods=periods,
  25. benchmark_return=hs300_return,
  26. parallel=False)
  27. for perf in performance_list:
  28. print("\n")
  29. print(perf.strategy_name)
  30. print(perf.key_performance_indicator)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注