• 请在环境变量中设置DB_URI指向数据库

In [1]:
%matplotlib inline
import os
import datetime as dt
import numpy as np
import pandas as pd
from PyFin.api import *
from alphamind.api import *
from matplotlib import pyplot as plt

plt.style.use('ggplot')
dt.datetime.now()


Out[1]:
datetime.datetime(2019, 2, 10, 0, 16, 56, 354078)

In [2]:
start_date = '2017-04-10'
end_date = '2018-04-09'

freq = '5b'
horizon = map_freq(freq)
neutralized_risk = risk_styles + industry_styles
universe = Universe('zz500')
data_source = os.environ['DB_URI']
offset = 1
method = 'ls'
industry_name = 'sw'
industry_level = 1

risk_model = 'short'
executor = NaiveExecutor()
ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')
engine = SqlEngine(data_source)

In [8]:
alpha_factors = {
    'f01': LAST('EPS'),
    'f02': LAST('ROE')
    }

weights = dict(f01=1.0,
               f02=1.0,
              )

alpha_model = ConstLinearModel(features=alpha_factors, weights=weights)

def predict_worker(params):
    data_meta = DataMeta(freq=freq,
                         universe=universe,
                         batch=1,
                         neutralized_risk=neutralized_risk,
                         risk_model='short',
                         pre_process=[winsorize_normal, standardize],
                         post_process=[standardize],
                         warm_start=0,
                         data_source=data_source)
    ref_date, model = params
    er, _ = predict_by_model(ref_date, model, data_meta)
    return er

In [9]:
%%time
predicts = [predict_worker((d.strftime('%Y-%m-%d'), alpha_model)) for d in ref_dates]


Wall time: 1min 9s

In [10]:
industry_names = industry_list(industry_name, industry_level)
industry_total = engine.fetch_industry_matrix_range(universe, dates=ref_dates, category=industry_name, level=industry_level)

previous_pos = pd.DataFrame()
rets = []
turn_overs = []
leverags = []

for i, ref_date in enumerate(ref_dates):
    ref_date = ref_date.strftime('%Y-%m-%d')
    industry_matrix = industry_total[industry_total.trade_date == ref_date]
    
    res = industry_matrix.dropna()
    codes = res.code.values.tolist()
        
    er = predicts[i].loc[codes].values
    
    alpha_logger.info('{0} full re-balance: {1}'.format(ref_date, len(er)))
    target_pos, _ = er_portfolio_analysis(er,
                                          industry_matrix.industry_name.values,
                                          None,
                                          None,
                                          False,
                                          None,
                                          method=method)
        
    target_pos['code'] = codes
    turn_over, executed_pos = executor.execute(target_pos=target_pos)

    executed_codes = executed_pos.code.tolist()
    dx_returns = engine.fetch_dx_return(ref_date, executed_codes, horizon=horizon, offset=offset)
    result = pd.merge(executed_pos, dx_returns, on=['code'])

    leverage = result.weight.abs().sum()

    ret = result.weight.values @ (np.exp(result.dx.values) - 1.)
    rets.append(np.log(1. + ret))
    executor.set_current(executed_pos)
    turn_overs.append(turn_over)
    leverags.append(leverage)

    previous_pos = executed_pos
    alpha_logger.info('{0} is finished'.format(ref_date))


2019-02-10 00:19:34,241 - ALPHA_MIND - INFO - 2017-04-10 full re-balance: 500
2019-02-10 00:19:34,503 - ALPHA_MIND - INFO - 2017-04-10 is finished
2019-02-10 00:19:34,508 - ALPHA_MIND - INFO - 2017-04-17 full re-balance: 500
2019-02-10 00:19:34,796 - ALPHA_MIND - INFO - 2017-04-17 is finished
2019-02-10 00:19:34,802 - ALPHA_MIND - INFO - 2017-04-24 full re-balance: 500
2019-02-10 00:19:35,044 - ALPHA_MIND - INFO - 2017-04-24 is finished
2019-02-10 00:19:35,057 - ALPHA_MIND - INFO - 2017-05-02 full re-balance: 500
2019-02-10 00:19:35,288 - ALPHA_MIND - INFO - 2017-05-02 is finished
2019-02-10 00:19:35,301 - ALPHA_MIND - INFO - 2017-05-09 full re-balance: 500
2019-02-10 00:19:35,561 - ALPHA_MIND - INFO - 2017-05-09 is finished
2019-02-10 00:19:35,578 - ALPHA_MIND - INFO - 2017-05-16 full re-balance: 500
2019-02-10 00:19:35,839 - ALPHA_MIND - INFO - 2017-05-16 is finished
2019-02-10 00:19:35,849 - ALPHA_MIND - INFO - 2017-05-23 full re-balance: 500
2019-02-10 00:19:36,085 - ALPHA_MIND - INFO - 2017-05-23 is finished
2019-02-10 00:19:36,091 - ALPHA_MIND - INFO - 2017-06-01 full re-balance: 500
2019-02-10 00:19:36,356 - ALPHA_MIND - INFO - 2017-06-01 is finished
2019-02-10 00:19:36,362 - ALPHA_MIND - INFO - 2017-06-08 full re-balance: 500
2019-02-10 00:19:36,620 - ALPHA_MIND - INFO - 2017-06-08 is finished
2019-02-10 00:19:36,625 - ALPHA_MIND - INFO - 2017-06-15 full re-balance: 500
2019-02-10 00:19:36,866 - ALPHA_MIND - INFO - 2017-06-15 is finished
2019-02-10 00:19:36,873 - ALPHA_MIND - INFO - 2017-06-22 full re-balance: 500
2019-02-10 00:19:37,103 - ALPHA_MIND - INFO - 2017-06-22 is finished
2019-02-10 00:19:37,110 - ALPHA_MIND - INFO - 2017-06-29 full re-balance: 500
2019-02-10 00:19:37,404 - ALPHA_MIND - INFO - 2017-06-29 is finished
2019-02-10 00:19:37,412 - ALPHA_MIND - INFO - 2017-07-06 full re-balance: 500
2019-02-10 00:19:37,630 - ALPHA_MIND - INFO - 2017-07-06 is finished
2019-02-10 00:19:37,635 - ALPHA_MIND - INFO - 2017-07-13 full re-balance: 500
2019-02-10 00:19:37,858 - ALPHA_MIND - INFO - 2017-07-13 is finished
2019-02-10 00:19:37,866 - ALPHA_MIND - INFO - 2017-07-20 full re-balance: 500
2019-02-10 00:19:38,127 - ALPHA_MIND - INFO - 2017-07-20 is finished
2019-02-10 00:19:38,132 - ALPHA_MIND - INFO - 2017-07-27 full re-balance: 500
2019-02-10 00:19:38,421 - ALPHA_MIND - INFO - 2017-07-27 is finished
2019-02-10 00:19:38,428 - ALPHA_MIND - INFO - 2017-08-03 full re-balance: 500
2019-02-10 00:19:38,692 - ALPHA_MIND - INFO - 2017-08-03 is finished
2019-02-10 00:19:38,699 - ALPHA_MIND - INFO - 2017-08-10 full re-balance: 500
2019-02-10 00:19:38,937 - ALPHA_MIND - INFO - 2017-08-10 is finished
2019-02-10 00:19:38,942 - ALPHA_MIND - INFO - 2017-08-17 full re-balance: 500
2019-02-10 00:19:39,171 - ALPHA_MIND - INFO - 2017-08-17 is finished
2019-02-10 00:19:39,176 - ALPHA_MIND - INFO - 2017-08-24 full re-balance: 500
2019-02-10 00:19:39,410 - ALPHA_MIND - INFO - 2017-08-24 is finished
2019-02-10 00:19:39,417 - ALPHA_MIND - INFO - 2017-08-31 full re-balance: 500
2019-02-10 00:19:39,649 - ALPHA_MIND - INFO - 2017-08-31 is finished
2019-02-10 00:19:39,659 - ALPHA_MIND - INFO - 2017-09-07 full re-balance: 500
2019-02-10 00:19:39,985 - ALPHA_MIND - INFO - 2017-09-07 is finished
2019-02-10 00:19:39,993 - ALPHA_MIND - INFO - 2017-09-14 full re-balance: 500
2019-02-10 00:19:40,246 - ALPHA_MIND - INFO - 2017-09-14 is finished
2019-02-10 00:19:40,256 - ALPHA_MIND - INFO - 2017-09-21 full re-balance: 500
2019-02-10 00:19:40,573 - ALPHA_MIND - INFO - 2017-09-21 is finished
2019-02-10 00:19:40,578 - ALPHA_MIND - INFO - 2017-09-28 full re-balance: 500
2019-02-10 00:19:40,804 - ALPHA_MIND - INFO - 2017-09-28 is finished
2019-02-10 00:19:40,816 - ALPHA_MIND - INFO - 2017-10-12 full re-balance: 500
2019-02-10 00:19:41,057 - ALPHA_MIND - INFO - 2017-10-12 is finished
2019-02-10 00:19:41,068 - ALPHA_MIND - INFO - 2017-10-19 full re-balance: 500
2019-02-10 00:19:41,333 - ALPHA_MIND - INFO - 2017-10-19 is finished
2019-02-10 00:19:41,342 - ALPHA_MIND - INFO - 2017-10-26 full re-balance: 500
2019-02-10 00:19:41,571 - ALPHA_MIND - INFO - 2017-10-26 is finished
2019-02-10 00:19:41,579 - ALPHA_MIND - INFO - 2017-11-02 full re-balance: 500
2019-02-10 00:19:41,768 - ALPHA_MIND - INFO - 2017-11-02 is finished
2019-02-10 00:19:41,774 - ALPHA_MIND - INFO - 2017-11-09 full re-balance: 500
2019-02-10 00:19:41,988 - ALPHA_MIND - INFO - 2017-11-09 is finished
2019-02-10 00:19:41,993 - ALPHA_MIND - INFO - 2017-11-16 full re-balance: 500
2019-02-10 00:19:42,235 - ALPHA_MIND - INFO - 2017-11-16 is finished
2019-02-10 00:19:42,242 - ALPHA_MIND - INFO - 2017-11-23 full re-balance: 500
2019-02-10 00:19:42,534 - ALPHA_MIND - INFO - 2017-11-23 is finished
2019-02-10 00:19:42,538 - ALPHA_MIND - INFO - 2017-11-30 full re-balance: 500
2019-02-10 00:19:42,774 - ALPHA_MIND - INFO - 2017-11-30 is finished
2019-02-10 00:19:42,779 - ALPHA_MIND - INFO - 2017-12-07 full re-balance: 500
2019-02-10 00:19:43,045 - ALPHA_MIND - INFO - 2017-12-07 is finished
2019-02-10 00:19:43,053 - ALPHA_MIND - INFO - 2017-12-14 full re-balance: 500
2019-02-10 00:19:43,274 - ALPHA_MIND - INFO - 2017-12-14 is finished
2019-02-10 00:19:43,283 - ALPHA_MIND - INFO - 2017-12-21 full re-balance: 500
2019-02-10 00:19:43,547 - ALPHA_MIND - INFO - 2017-12-21 is finished
2019-02-10 00:19:43,559 - ALPHA_MIND - INFO - 2017-12-28 full re-balance: 500
2019-02-10 00:19:43,798 - ALPHA_MIND - INFO - 2017-12-28 is finished
2019-02-10 00:19:43,805 - ALPHA_MIND - INFO - 2018-01-05 full re-balance: 500
2019-02-10 00:19:44,058 - ALPHA_MIND - INFO - 2018-01-05 is finished
2019-02-10 00:19:44,067 - ALPHA_MIND - INFO - 2018-01-12 full re-balance: 500
2019-02-10 00:19:44,310 - ALPHA_MIND - INFO - 2018-01-12 is finished
2019-02-10 00:19:44,320 - ALPHA_MIND - INFO - 2018-01-19 full re-balance: 500
2019-02-10 00:19:44,578 - ALPHA_MIND - INFO - 2018-01-19 is finished
2019-02-10 00:19:44,588 - ALPHA_MIND - INFO - 2018-01-26 full re-balance: 500
2019-02-10 00:19:44,855 - ALPHA_MIND - INFO - 2018-01-26 is finished
2019-02-10 00:19:44,860 - ALPHA_MIND - INFO - 2018-02-02 full re-balance: 500
2019-02-10 00:19:45,116 - ALPHA_MIND - INFO - 2018-02-02 is finished
2019-02-10 00:19:45,123 - ALPHA_MIND - INFO - 2018-02-09 full re-balance: 500
2019-02-10 00:19:45,380 - ALPHA_MIND - INFO - 2018-02-09 is finished
2019-02-10 00:19:45,391 - ALPHA_MIND - INFO - 2018-02-23 full re-balance: 500
2019-02-10 00:19:45,660 - ALPHA_MIND - INFO - 2018-02-23 is finished
2019-02-10 00:19:45,666 - ALPHA_MIND - INFO - 2018-03-02 full re-balance: 500
2019-02-10 00:19:45,890 - ALPHA_MIND - INFO - 2018-03-02 is finished
2019-02-10 00:19:45,898 - ALPHA_MIND - INFO - 2018-03-09 full re-balance: 500
2019-02-10 00:19:46,126 - ALPHA_MIND - INFO - 2018-03-09 is finished
2019-02-10 00:19:46,136 - ALPHA_MIND - INFO - 2018-03-16 full re-balance: 500
2019-02-10 00:19:46,352 - ALPHA_MIND - INFO - 2018-03-16 is finished
2019-02-10 00:19:46,363 - ALPHA_MIND - INFO - 2018-03-23 full re-balance: 500
2019-02-10 00:19:46,630 - ALPHA_MIND - INFO - 2018-03-23 is finished
2019-02-10 00:19:46,642 - ALPHA_MIND - INFO - 2018-03-30 full re-balance: 500
2019-02-10 00:19:46,885 - ALPHA_MIND - INFO - 2018-03-30 is finished

In [11]:
ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags}, index=ref_dates)
ret_df.loc[advanceDateByCalendar('china.sse', ref_dates[-1], freq)] = 0.
ret_df = ret_df.shift(1)
ret_df.iloc[0] = 0.
ret_df['tc_cost'] = ret_df.turn_over * 0.002

ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),
                                             title='Fixed freq rebalanced: {0}'.format(freq),
                                             secondary_y='tc_cost')


Out[11]:
<matplotlib.axes._subplots.AxesSubplot at 0x1ef2b939e48>

In [ ]: