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

In [1]:
%matplotlib inline
import os
import numpy as np
import pandas as pd
from PyFin.api import *
from alphamind.api import *
from alphamind.strategy.strategy import Strategy, RunningSetting
from matplotlib import pyplot as plt

plt.style.use('ggplot')

In [2]:
# Back test parameter settings
start_date = '2016-01-01'
end_date = '2018-03-30'

freq = '10b'
industry_name = 'sw'
industry_level = 1
turn_over_target = 0.4
batch = 1
horizon = map_freq(freq)
weights_bandwidth = 0.01
universe = Universe('zz800')
data_source = os.environ['DB_URI']
benchmark_code = 905
method = 'risk_neutral'

In [3]:
# Model settings
alpha_factors = {
    'f01': CSQuantiles(LAST('EPS'), groups='sw1'),
    'f02': CSQuantiles(LAST('ROE'), groups='sw1'),
    }

weights = dict(f01=1.,
               f02=1.)

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

data_meta = DataMeta(freq=freq,
                     universe=universe,
                     batch=1,
                     neutralized_risk=None,
                     pre_process=None,
                     post_process=None,
                     data_source=data_source)

In [4]:
# Constraintes settings

industry_names = industry_list(industry_name, industry_level)
constraint_risk = ['SIZE', 'SIZENL', 'BETA']
total_risk_names = constraint_risk + ['benchmark', 'total']
all_styles = risk_styles + industry_styles + macro_styles

b_type = []
l_val = []
u_val = []

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

for name in total_risk_names:
    if name == 'benchmark':
        b_type.append(BoundaryType.RELATIVE)
        l_val.append(0.8)
        u_val.append(1.0)
    else:
        b_type.append(BoundaryType.ABSOLUTE)
        l_val.append(0.0)
        u_val.append(0.0)

bounds = create_box_bounds(total_risk_names, b_type, l_val, u_val)

In [5]:
# Running settings
running_setting = RunningSetting(weights_bandwidth=weights_bandwidth,
                                 rebalance_method=method,
                                 bounds=bounds,
                                 turn_over_target=turn_over_target)

In [6]:
# Strategy
strategy = Strategy(alpha_model,
                    data_meta,
                    universe=universe,
                    start_date=start_date,
                    end_date=end_date,
                    freq=freq,
                    benchmark=benchmark_code)

strategy.prepare_backtest_data()
ret_df, positions = strategy.run(running_setting=running_setting)


2019-02-10 00:33:29,656 - ALPHA_MIND - INFO - alpha factor data loading finished ...
2019-02-10 00:33:30,687 - ALPHA_MIND - INFO - industry data loading finished ...
2019-02-10 00:33:31,236 - ALPHA_MIND - INFO - benchmark data loading finished ...
2019-02-10 00:33:36,367 - ALPHA_MIND - INFO - risk_model data loading finished ...
2019-02-10 00:33:40,488 - ALPHA_MIND - INFO - returns data loading finished ...
2019-02-10 00:33:40,798 - ALPHA_MIND - INFO - starting backting ...
2019-02-10 00:33:41,103 - ALPHA_MIND - INFO - alpha models training finished ...
D:\ProgramData\anaconda3\lib\site-packages\pandas\core\frame.py:4024: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  downcast=downcast, **kwargs)
2019-02-10 00:33:41,174 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 re-balance: 799 codes
2019-02-10 00:33:41,241 - ALPHA_MIND - INFO - 2016-01-18 00:00:00 re-balance: 800 codes
D:\ProgramData\anaconda3\lib\site-packages\cvxpy-1.0.10-py3.6-win-amd64.egg\cvxpy\problems\problem.py:614: RuntimeWarning: overflow encountered in long_scalars
  if self.max_big_small_squared < big*small**2:
2019-02-10 00:33:41,362 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 re-balance: 800 codes
2019-02-10 00:33:41,474 - ALPHA_MIND - INFO - 2016-02-22 00:00:00 re-balance: 800 codes
2019-02-10 00:33:41,584 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 re-balance: 800 codes
2019-02-10 00:33:41,694 - ALPHA_MIND - INFO - 2016-03-21 00:00:00 re-balance: 800 codes
2019-02-10 00:33:41,810 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 re-balance: 800 codes
2019-02-10 00:33:41,943 - ALPHA_MIND - INFO - 2016-04-19 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,074 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,190 - ALPHA_MIND - INFO - 2016-05-18 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,328 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,453 - ALPHA_MIND - INFO - 2016-06-17 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,577 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,704 - ALPHA_MIND - INFO - 2016-07-15 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,836 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 re-balance: 800 codes
2019-02-10 00:33:42,980 - ALPHA_MIND - INFO - 2016-08-12 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,109 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,274 - ALPHA_MIND - INFO - 2016-09-09 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,396 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,507 - ALPHA_MIND - INFO - 2016-10-18 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,626 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,766 - ALPHA_MIND - INFO - 2016-11-15 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,877 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 re-balance: 800 codes
2019-02-10 00:33:43,986 - ALPHA_MIND - INFO - 2016-12-13 00:00:00 re-balance: 800 codes
2019-02-10 00:33:44,099 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 re-balance: 800 codes
2019-02-10 00:33:44,212 - ALPHA_MIND - INFO - 2017-01-11 00:00:00 re-balance: 800 codes
2019-02-10 00:33:44,354 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 re-balance: 799 codes
2019-02-10 00:33:44,483 - ALPHA_MIND - INFO - 2017-02-15 00:00:00 re-balance: 799 codes
2019-02-10 00:33:44,599 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 re-balance: 800 codes
2019-02-10 00:33:44,726 - ALPHA_MIND - INFO - 2017-03-15 00:00:00 re-balance: 800 codes
2019-02-10 00:33:44,855 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 re-balance: 800 codes
2019-02-10 00:33:44,982 - ALPHA_MIND - INFO - 2017-04-14 00:00:00 re-balance: 800 codes
2019-02-10 00:33:45,134 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 re-balance: 800 codes
2019-02-10 00:33:45,248 - ALPHA_MIND - INFO - 2017-05-15 00:00:00 re-balance: 800 codes
2019-02-10 00:33:45,373 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 re-balance: 800 codes
2019-02-10 00:33:45,492 - ALPHA_MIND - INFO - 2017-06-14 00:00:00 re-balance: 800 codes
2019-02-10 00:33:45,611 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 re-balance: 800 codes
2019-02-10 00:33:45,736 - ALPHA_MIND - INFO - 2017-07-12 00:00:00 re-balance: 800 codes
2019-02-10 00:33:45,890 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,021 - ALPHA_MIND - INFO - 2017-08-09 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,133 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,280 - ALPHA_MIND - INFO - 2017-09-06 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,435 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,553 - ALPHA_MIND - INFO - 2017-10-11 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,670 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,803 - ALPHA_MIND - INFO - 2017-11-08 00:00:00 re-balance: 800 codes
2019-02-10 00:33:46,942 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,065 - ALPHA_MIND - INFO - 2017-12-06 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,193 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,336 - ALPHA_MIND - INFO - 2018-01-04 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,477 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,602 - ALPHA_MIND - INFO - 2018-02-01 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,724 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,859 - ALPHA_MIND - INFO - 2018-03-08 00:00:00 re-balance: 800 codes
2019-02-10 00:33:47,989 - ALPHA_MIND - INFO - 2018-03-22 00:00:00 re-balance: 800 codes

In [7]:
ret_df[['turn_over', 'excess_return']].cumsum().plot(figsize=(14, 7), secondary_y='turn_over')


Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x215af4105c0>

In [ ]: