[关闭]
@Channelchan 2017-05-05T16:51:52.000000Z 字数 2984 阅读 27763

Factor->Alphalens->Engine->Pyfolio

Factors_Strategies


Factor->Alphalens->Engine->Pyfolio

Factor

*iteritems()/stack()

  1. from fxdayu_data.data.handler.mongo_handler import MongoHandler
  2. from datetime import datetime
  3. import talib as ta
  4. import pandas as pd
  5. mh = MongoHandler()
  6. all_stocks = mh.table_names("HS300")
  7. pn = mh.read(all_stocks, 'HS300', start=datetime(2016, 1, 1), end = datetime(2016,12,31))
  8. prices = pn.minor_xs('close')
  9. mom5 = pd.DataFrame({name: ta.ROCP(item.values, 5) for name, item in prices.iteritems()}, index=prices.index)
  10. factor = mom5.stack()
  11. print factor

输入Alphalens

quantile/demeaned/by_date=True

  1. import alphalens
  2. import matplotlib.pyplot as plt
  3. factor_data = alphalens.utils.get_clean_factor_and_forward_returns(factor, prices, quantiles=8)
  4. mean, std = alphalens.performance.mean_return_by_quantile(factor_data, demean=False, by_date=True)
  5. alphalens.plotting.plot_cumulative_returns_by_quantile(mean, 1)
  6. alphalens.plotting.plot_cumulative_returns_by_quantile(mean, 5)
  7. alphalens.plotting.plot_cumulative_returns_by_quantile(mean, 10)
  8. plt.show()

输出Q3_Mongodb

  1. cond = factor_data['factor_quantile'] == 3
  2. save = factor_data[cond]
  3. s = pd.Series(True, index=save.index)
  4. s = s.unstack()
  5. s[s != True] = False
  6. s.columns = map(lambda x: str(x[:-2]), s.columns)
  7. mh.write(s, 'mom5_Q3codes', 'Course_data', index='datetime')

Engine回测

Order/TimeSchedule/Performance

  1. mh = MongoHandler()
  2. def initialize(context, data):
  3. context.d = mh.read('mom5_Q3codes', 'Course_data')
  4. # context.d.columns = map(lambda c: c+'.D', context.d.columns)
  5. context.d.index = pd.to_datetime(context.d.index) + timedelta(hours=15)
  6. def handle_data(context, data):
  7. pool = context.d.loc[context.current_time]
  8. stocks = pool[pool == True]
  9. target = stocks.index
  10. for code in context.portfolio.positions:
  11. if code not in target:
  12. order_target(code, 0)
  13. # pct = int(1.0/len(target)*1000)/1000.0
  14. for code in target:
  15. order_target_percent(code, 0.016)

save=true

  1. if __name__ == '__main__':
  2. import matplotlib.pyplot as plt
  3. trader = Trader()
  4. trader['data'].kwargs.update({"host": '192.168.0.103', "port": 27018})
  5. trader.back_test(__file__, map(lambda c: str(c[:-2]), all_table("HS", host='192.168.0.103', port=27018)),
  6. frequency='D', start=datetime(2015, 1, 12), end=datetime(2016, 12, 10), ticker_type='HS', save=True)
  7. plt.plot(trader.performance.equity)
  8. plt.show()

Pyfolio绩效

输入Brenchmark与组合收益

  1. import pyfolio as pf
  2. from datetime import datetime
  3. from datetime import timedelta
  4. import numpy as np
  5. import pandas as pd
  6. import matplotlib.pyplot as plt
  7. data = pd.read_excel('D:\\PycharmProjects\\bigfishtrader\\Selection_Strategy\\FiveDay_Change\\volume5_5_change&2017-04-28-12-22-24&.xls', header=0)
  8. data_s = pd.Series(data.rate.values, data.datetime.values)
  9. data_s.index = pd.to_datetime(data_s.index, format='%Y-%m-%d')
  10. data_r = data_s.pct_change().dropna()
  11. data_r.index = data_r.index.tz_localize('UTC')-timedelta(hours=15)
  12. benchmark = pd.read_csv('D:\\Python_excel\\benchmark.csv', header=None)
  13. benchmark = pd.Series(benchmark[1].values, benchmark[0].values)
  14. benchmark.index = pd.to_datetime(benchmark.index, format='%Y-%m-%d')
  15. benchmark.index = benchmark.index.tz_localize('UTC')
  16. pf.create_returns_tear_sheet(data_r, live_start_date='2016-10-10', benchmark_rets=benchmark)

用选股器:
打分法给股票打分
取交集并集
排序

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