[关闭]
@Channelchan 2018-01-13T10:50:28.000000Z 字数 5153 阅读 85780

选股表格回测

  1. 等权重下单
  2. 按照特定权重下单
  3. 策略优化
  1. from jaqs.data.dataapi import DataApi
  2. from jaqs.data import DataView
  3. from jaqs.research import SignalDigger
  4. import numpy as np
  5. from datetime import datetime
  6. import pandas as pd
  7. from datetime import timedelta
  8. import warnings
  9. warnings.filterwarnings("ignore")
  10. dataview_folder = 'JAQS_Data/hs300'
  11. dv = DataView()
  12. dv.load_dataview(dataview_folder)
D:\Anaconda3\lib\site-packages\statsmodels\compat\pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.
  from pandas.core import datetools


Dataview loaded successfully.
  1. def change_columns_index(signal):
  2. new_names = {}
  3. for c in signal.columns:
  4. if c.endswith('SZ'):
  5. new_names[c] = c.replace('SZ', 'XSHE')
  6. elif c.endswith('SH'):
  7. new_names[c] = c.replace('SH', 'XSHG')
  8. signal = signal.rename_axis(new_names, axis=1)
  9. signal.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , signal.index))
  10. signal.index = pd.Index(map(lambda x: x+timedelta(hours=15), signal.index))
  11. return signal
  1. mask = dv.get_ts('mask_fundamental')
  2. group = change_columns_index(dv.get_ts('group'))
  3. ROE_Data = change_columns_index(dv.get_ts('roe').shift(1, axis=0)[mask==0])
  4. prices = change_columns_index(dv.get_ts('close_adj'))
  1. def get_largest(df, n=20):
  2. largest_list = []
  3. for time_index, value in df.iterrows():
  4. largest_list.append(dict.fromkeys(value.nlargest(n).index,1))
  5. largest_df = pd.DataFrame(largest_list, index = df.index)
  6. return largest_df
  1. stock_df = get_largest(ROE_Data).dropna(how='all', axis=1)
  1. stock_df.to_excel('roe_backtest.xlsx')

等权重下单

  1. import numpy as np
  2. import talib as ta
  3. import pandas as pd
  4. import rqalpha
  5. from rqalpha.api import *
  6. #读取文件位置
  7. def init(context):
  8. context.codes = stock_df
  9. context.stocks = []
  10. context.SHORTPERIOD = 20
  11. # scheduler.run_weekly(find_pool, tradingday=1)
  12. scheduler.run_daily(find_pool)
  13. def find_pool(context, bar_dict):
  14. try:
  15. codes = context.codes.loc[context.now]
  16. except KeyError:
  17. return
  18. stocks = codes.index[codes == 1]
  19. context.stocks = stocks
  20. def handle_bar(context, bar_dict):
  21. buy(context, bar_dict)
  22. def buy(context, bar_dict):
  23. pool = context.stocks
  24. # print (pool)
  25. if pool is not None:
  26. stocks_len = len(pool)
  27. for stocks in context.portfolio.positions:
  28. if stocks not in pool:
  29. order_target_percent(stocks, 0)
  30. for codes in pool:
  31. try:
  32. price = history_bars(codes, context.SHORTPERIOD+10, '1d', 'close')
  33. short_avg = ta.SMA(price, context.SHORTPERIOD)
  34. cur_position = context.portfolio.positions[codes].quantity
  35. if short_avg[-1]<short_avg[-3] and cur_position > 0:
  36. order_target_value(codes, 0)
  37. if short_avg[-1] > short_avg[-3]:
  38. order_target_percent(codes, 1.0/stocks_len)
  39. except Exception:
  40. pass
  41. config = {
  42. "base": {
  43. "start_date": "2015-09-01",
  44. "end_date": "2017-12-30",
  45. "accounts": {'stock':1000000},
  46. "benchmark": "000300.XSHG"
  47. },
  48. "extra": {
  49. "log_level": "error",
  50. },
  51. "mod": {
  52. "sys_analyser": {
  53. "enabled": True,
  54. "plot": True
  55. }
  56. }
  57. }
  58. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_8_1.png-68.9kB

按照特定权重下单

  1. def get_largest_weight(df, n=20):
  2. largest_list = []
  3. for time_index, value in df.iterrows():
  4. largest_list.append(value.nlargest(n).to_dict())
  5. largest_df = pd.DataFrame(largest_list, index = df.index)
  6. return largest_df
  1. largest_weight = get_largest_weight(ROE_Data)
  1. weight_list = []
  2. for time_index, weight in largest_weight.iterrows():
  3. weight[weight<0]=0
  4. weiht_result = (weight/weight.sum())
  5. weight_list.append(weiht_result.to_dict())
  6. weight_df = pd.DataFrame(weight_list, index=largest_weight.index)
  1. import numpy as np
  2. import talib as ta
  3. import pandas as pd
  4. import rqalpha
  5. from rqalpha.api import *
  6. #读取文件位置
  7. def init(context):
  8. context.codes = weight_df
  9. context.hs300 = '000300.XSHG'
  10. context.SHORTPERIOD = 20
  11. context.stocks = {}
  12. scheduler.run_daily(find_pool)
  13. # scheduler.run_weekly(find_pool,tradingday=3)
  14. def find_pool(context, bar_dict):
  15. codes = context.codes.loc[context.now].dropna()
  16. if codes is not None:
  17. context.stocks = codes
  18. else:
  19. context.stocks = {}
  20. def handle_bar(context, bar_dict):
  21. buy(context, bar_dict)
  22. def buy(context, bar_dict):
  23. pool = context.stocks
  24. if pool is not None:
  25. for stocks in context.portfolio.positions:
  26. if stocks not in pool:
  27. order_target_percent(stocks, 0)
  28. for codes, target in pool.items():
  29. try:
  30. price = history_bars(codes, context.SHORTPERIOD+10, '1d', 'close')
  31. short_avg = ta.SMA(price, context.SHORTPERIOD)
  32. cur_position = context.portfolio.positions[codes].quantity
  33. if short_avg[-1]<short_avg[-3] and cur_position > 0:
  34. order_target_value(codes, 0)
  35. if short_avg[-1] > short_avg[-3]:
  36. order_target_percent(codes, target)
  37. except Exception:
  38. pass
  39. config = {
  40. "base": {
  41. "start_date": "2015-09-01",
  42. "end_date": "2017-12-30",
  43. "accounts": {'stock':1000000},
  44. "benchmark": "000300.XSHG"
  45. },
  46. "extra": {
  47. "log_level": "error",
  48. },
  49. "mod": {
  50. "sys_analyser": {
  51. "enabled": True,
  52. "plot": True
  53. }
  54. }
  55. }
  56. rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)

output_13_0.png-70.2kB

策略优化

安装链接: https://github.com/xingetouzi/rqalpha-mod-optimization

  1. 导入模块
  2. 设置参数
  3. 设置回测的config
  4. 启动回测并打印最好的参数
  1. import logging
  2. from rqalpha_mod_optimization.optimizer import SimpleOptimizeApplication
  3. from rqalpha_mod_optimization.parallel import set_parallel_method, ParallelMethod
  4. params = {
  5. 'SHORTPERIOD': range(5,40,5),
  6. }
  7. config = {
  8. "extra": {
  9. "log_level": "verbose",
  10. },
  11. "base": {
  12. "start_date": "2015-09-01",
  13. "end_date": "2017-12-30",
  14. "accounts": {'stock':1000000},
  15. "matching_type": "next_bar",
  16. "benchmark": "000300.XSHG",
  17. "frequency": "1d",
  18. }
  19. }
  20. if __name__ == "__main__":
  21. try:
  22. set_parallel_method(ParallelMethod.DASK)
  23. result = SimpleOptimizeApplication(config).open("ROE_MA_Strategy.py").optimize(params)
  24. print(result.sort_values(by=["sharpe"], ascending=False))
  25. except Exception as e:
  26. logging.exception(e)
  27. print("******POOL TERMINATE*******")

搜狗截图20180113104705.png-11.9kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注