@Channelchan
2018-11-12T19:24:37.000000Z
字数 5036
阅读 65878
1:4,2:8...,20:80
import warnings
warnings.filterwarnings('ignore')
from jaqs_fxdayu.data.dataservice import LocalDataService
ds = 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 HFDataView
dv1H = HFDataView()
dv1H.create_init_dv(Time_dict.set_index(["trade_date","symbol"]))
Initialize dataview success.
MaStatistic是用了多对均线对来做打分,金叉为1,死叉为0
# 1、定义calcuate对均线进行打分
import talib as ta
import numpy as np
import pandas as pd
def 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 plt
from talib import abstract
fig, (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.index
signalDf["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 TimingDigger
tdMaStatistic = 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/short
price=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/short
price=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