%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
)