In [1]:
%cd "E:\Project\backtrader_strategy"

import sys
import utils
import pandas as pd
import numpy as np
import talib
import plotly
import plotly.offline
from plotly.offline import iplot
import cufflinks as cf
plotly.offline.init_notebook_mode(connected=True)
cf.set_config_file(theme=None, sharing='private', offline=True)
import plotly.plotly as py
import plotly.tools as tls
import plotly.graph_objs as go
import backtrader as bt
import talib
import math
import qrisk
from IPython.display import display, clear_output
from t1_short.t1_short_runner import T1ShortRunner
import t1_short.short_v3


def prepare_full_period_df_func(df):
    df['vol_sma5'] = talib.SMA(df['volume'].values, timeperiod=5)
    return df

def full_period_progress_func(idx, pool_size, stock):
    clear_output(wait=True)
    display('loading {}   {} / {}'.format(stock, idx + 1, pool_size))
    
def period_progress_func(begin_date, end_date, stock_idx, position_weight_df):
    clear_output(wait=True)
    display(begin_date + ' - ' + end_date)
    display('back testing {}   {} / {}'.format(position_weight_df.index[stock_idx],
                                               stock_idx, position_weight_df.index.size))


runner = T1ShortRunner(
    factor='small_size',
    begin_date='2012-01-01',
    end_date='2017-06-01',
    datafeed_cls=t1_short.short_v3.PeriodHQData,
    strategy_cls=t1_short.short_v3.Strategy,
    prepare_full_period_df_func=t1_short.short_v3.prepare_full_period_df_func,
    full_period_progress_func=full_period_progress_func,
    period_progress_func=period_progress_func
)

runner.run()

clear_output(wait=True)
dimensions=(None, 400)
param_df = pd.DataFrame()

cumulative_return_series = runner.cumulative_return_series.copy()
non_cumulative_returns_series = runner.non_cumulative_returns_series.copy()
transactions_df = runner.transactions_df.copy()


year_list = qrisk.aggregate_returns(runner.non_cumulative_returns_series, qrisk.YEARLY).index.tolist()

stat_df = pd.DataFrame(
    np.nan, 
    index=pd.Index(year_list), 
    columns=['最大回撤(%)', '交易次数', '胜率(%)', '盈利日', '盈利日比重(%)', '盈利月', '盈利月比重(%)', '年化收益(%)', '夏普比']
)

# display(non_cumulative_returns_series)
for year, yearly_non_cum_returns in non_cumulative_returns_series.groupby(non_cumulative_returns_series.index.year):
    stat_df.at[year, '最大回撤(%)'] = qrisk.max_drawdown(yearly_non_cum_returns) * 100
    stat_df.at[year, '盈利日'] = yearly_non_cum_returns[yearly_non_cum_returns > 0].size
    stat_df.at[year, '盈利日比重(%)'] = stat_df.at[year, '盈利日'] / yearly_non_cum_returns[yearly_non_cum_returns != 0].size * 100
    monthly_returns = qrisk.aggregate_returns(yearly_non_cum_returns, qrisk.MONTHLY)
    stat_df.at[year, '盈利月'] = monthly_returns[monthly_returns > 0].size
    stat_df.at[year, '盈利月比重(%)'] = stat_df.at[year, '盈利月'] / monthly_returns.size * 100
    stat_df.at[year, '年化收益(%)'] = qrisk.annual_return(yearly_non_cum_returns) * 100
    stat_df.at[year, '夏普比'] = qrisk.sharpe_ratio(yearly_non_cum_returns)

profit_series = transactions_df['price']
op_df = transactions_df.iloc[::2].drop(['sid', 'value'], axis=1)
op_df.columns = ['amount', 'sell_price', 'symbol']
op_df.amount = op_df.amount.abs()
op_df['buy_price'] = transactions_df.iloc[1::2]['price'].values
op_df['price_diff'] = op_df['sell_price'] - op_df['buy_price']
op_df['profit_rate'] = (op_df['sell_price'] - op_df['buy_price']) / op_df['sell_price']
op_df = op_df[['symbol', 'sell_price', 'buy_price', 'price_diff', 'amount', 'profit_rate']]


for year, yearly_op_df in op_df.groupby(op_df.index.year):
    stat_df.at[year, '交易次数'] = yearly_op_df.index.size
    price_diff_series = yearly_op_df['price_diff']
    stat_df.at[year, '胜率(%)'] = price_diff_series[price_diff_series > 0].size / stat_df.at[year, '交易次数'] * 100
    
display(stat_df.round(2))

runner.cumulative_return_series.iplot(dimensions=dimensions, title='累计收益曲线')
# runner.non_cumulative_returns_series.iplot(dimensions=dimensions)
# non_cumulative_returns_series.iplot(kind='bar', dimensions=dimensions)
op_df['profit_rate'].iplot(
    kind='histogram', 
    histnorm='probability', 
    title='操作利润率分布(未剔除手续费)', 
    vline=['0'],
    dimensions=dimensions
)
最大回撤(%) 交易次数 胜率(%) 盈利日 盈利日比重(%) 盈利月 盈利月比重(%) 年化收益(%) 夏普比
2012 -0.01 841.0 88.35 193.0 85.40 11.0 91.67 2.32 16.83
2013 -0.02 1109.0 79.53 185.0 78.06 12.0 100.00 1.90 13.54
2014 -0.02 1203.0 77.31 204.0 83.27 12.0 100.00 1.73 14.15
2015 -0.12 3805.0 69.59 175.0 71.72 12.0 100.00 6.50 4.47
2016 -0.03 1387.0 77.65 191.0 78.28 12.0 100.00 2.24 10.50
2017 -0.01 295.0 77.97 66.0 77.65 5.0 100.00 1.42 8.26
C:\ProgramData\Anaconda2\lib\site-packages\cufflinks\plotlytools.py:156: FutureWarning:

pandas.tslib is deprecated and will be removed in a future version.
You can access Timestamp as pandas.Timestamp