@Channelchan
2018-11-12T11:24:37.000000Z
字数 5036
阅读 66062
1:4,2:8...,20:80
import warningswarnings.filterwarnings('ignore')
from jaqs_fxdayu.data.dataservice import LocalDataServiceds = LocalDataService()from time import time## 加freq参数start = time()path = r'./min_data/VnTrader_1Min_Db'props = {'fields': 'open,high,low,close,volume','symbol': 'BTCUSDT:binance', 'freq': '1H','start_date':20180101000000}Time_dict = ds.bar_reader(path,props)print(time()-start)
25.29762315750122
from jaqs_fxdayu.data.hf_dataview import HFDataViewdv1H = HFDataView()
dv1H.create_init_dv(Time_dict.set_index(["trade_date","symbol"]))
Initialize dataview success.
MaStatistic是用了多对均线对来做打分,金叉为1,死叉为0
# 1、定义calcuate对均线进行打分import talib as taimport numpy as npimport pandas as pddef calculate(close, timePeriod):mas = ta.MA(close.iloc[:,0].values, timePeriod)mal = ta.MA(close.iloc[:,0].values, 5*timePeriod)df = pd.DataFrame({'long': mal, 'short': mas}, index=close.index).dropna()df['direction'] = list(map(lambda s, l: 1 if s > l else 0, df['short'], df['long']))return df['direction']
# dv1H.get_ts('close',date_type='datetime').tail()
# dv1H.get_ts('close',date_type='datetime').iloc[:,0].values
dvClose = dv1H.get_ts('close',date_type='datetime').dropna()x = np.array(range(1,21,1))signalDf = pd.DataFrame({t: calculate(dvClose, t) for t in x})
# signalDf
#2、信号的加总相乘signalDf['signal'] = pd.Series({name: true.sum()*5 for name, true in signalDf.iterrows()})
# signalDf['signal']
# dv1H.get_ts('close',date_type='datetime')
# 3、绘图观察import matplotlib.pyplot as pltfrom talib import abstractfig, (ax,ax1) = plt.subplots(2,1,sharex=True, figsize=(15,15))ax.plot(dv1H.get_ts('close',date_type='datetime'))ax1.plot(signalDf['signal'], 'g', alpha=0.3)ax1.plot(abstract.EMA(signalDf,200,price='signal'), 'r', alpha=0.8)ax1.hlines(60, signalDf['signal'].index[0], signalDf['signal'].index[-1])ax1.hlines(40, signalDf['signal'].index[0], signalDf['signal'].index[-1])plt.show()

# dv1H.get_ts('close')
#4、定义信号事件def signalAppend(signalDf):signalDf['time'] = signalDf.indexsignalDf["trade_date"] = signalDf['time'].apply(lambda x:int(x.strftime(format="%Y-%m-%d %H:%M:%S").replace("-","").replace(":","").replace(" ","")))signalDf["symbol"] = "BTCUSDT:binance"signalDf = signalDf.set_index(["trade_date","symbol"])signalSe = signalDf.signal.unstack()dv1H.append_df(signalSe,'signalSe')signalAppend(signalDf)
# dv1H.get_ts('signalSe')
加总相乘,60分以上做多,40分以下做空
# 5、设定进出场条件long = dv1H.add_formula('long','If((signalSe>=60) && (Delay(signalSe,1)<60), 2, 0)', add_data=True)short = dv1H.add_formula('short','If((signalSe<=40) && (Delay(signalSe,1)>40), -2, 0)', add_data=True)closeLong = dv1H.add_formula('closeLong','If(short==-2,1,0)', add_data=True)closeShort = dv1H.add_formula("closeShort",'If(long==2,-1,0)', add_data=True)
#6、计算绩效from jaqs_fxdayu.research import TimingDiggertdMaStatistic = TimingDigger(output_folder=".", output_format='pdf',signal_name='MaStatistic')def TimingSignal(td, dv, mhp=None,sl=None,sp=None):# step 1:实例化TimingDigger 通过output_folder和output_format指定测试报告的输出路径和输出格式,通过signal_name指定绩效文件名称#多空分别计算一遍 输出汇总结果td.process_signal(enter_signal=dv.get_ts("long"),exit_signal=dv.get_ts("closeLong"),sig_type="long", # 信号类型 long/shortprice=dv.get_ts("close"),max_holding_period=mhp, # 最大持有天数 可为空stoploss=-sl, # 止损百分比 负数 可为空stopprofit=sp, # 止盈百分比 正数 可为空)td.process_signal(enter_signal=dv.get_ts("short"),exit_signal=dv.get_ts("closeShort"),sig_type="short", # 信号类型 long/shortprice=dv.get_ts("close"),max_holding_period=mhp, # 最大持有天数 可为空stoploss=-sl, # 止损百分比 负数 可为空stopprofit=sp, # 止盈百分比 正数 可为空)TimingSignal(tdMaStatistic, dv1H, 100, 0.15, 0.7)
Nan Data Count (should be zero) : 0; Percentage of effective data: 1%
Nan Data Count (should be zero) : 0; Percentage of effective data: 1%
主要看的是win_ratio和win_mean/loss_mean,其他是基础的统计指标。
胜率win_ratio最好在0.4以上,盈亏比:win_mean/loss_mean在1以上,具体看两者比例。
tdMaStatistic.create_event_report(sig_type="long")
*****-Summary-*****
Event Analysis
win loss all
t-stat 4.826 -10.177 1.163
p-value 0.000 0.000 0.248
mean 0.068 -0.027 0.009
std 0.079 0.019 0.069
info_ratio 0.853 -1.385 0.125
skewness 1.309 -0.686 2.130
kurtosis 0.565 -0.578 4.644
pct5 0.002 -0.063 -0.060
pct25 0.008 -0.040 -0.032
pct50 0.037 -0.020 -0.010
pct75 0.090 -0.011 0.011
pct95 0.228 -0.003 0.177
occurance 33.000 55.000 88.000
win_ratio NaN NaN 0.375
win_mean/loss_mean NaN NaN 2.512
tdMaStatistic.create_event_report(sig_type="short")
*****-Summary-*****
Event Analysis
win loss all
t-stat 6.566 -11.196 0.919
p-value 0.000 0.000 0.360
mean 0.068 -0.030 0.006
std 0.060 0.021 0.062
info_ratio 1.143 -1.483 0.096
skewness 0.672 -1.049 1.346
kurtosis -0.803 0.797 1.316
pct5 0.003 -0.067 -0.062
pct25 0.019 -0.041 -0.030
pct50 0.050 -0.026 -0.013
pct75 0.109 -0.015 0.022
pct95 0.180 -0.006 0.149
occurance 34.000 58.000 92.000
win_ratio NaN NaN 0.370
win_mean/loss_mean NaN NaN 2.237
tdMaStatistic.create_event_report(sig_type="long_short")#同时计算多空头信号的绩效
*****-Summary-*****
Event Analysis
win loss all
t-stat 7.880 -15.138 1.482
p-value 0.000 0.000 0.140
mean 0.068 -0.029 0.007
std 0.070 0.020 0.065
info_ratio 0.970 -1.430 0.111
skewness 1.145 -0.892 1.799
kurtosis 0.467 0.297 3.381
pct5 0.002 -0.065 -0.061
pct25 0.008 -0.041 -0.031
pct50 0.044 -0.024 -0.011
pct75 0.099 -0.013 0.020
pct95 0.193 -0.004 0.172
occurance 67.000 113.000 180.000
win_ratio NaN NaN 0.372
win_mean/loss_mean NaN NaN 2.362