[关闭]
@Channelchan 2018-11-12T19:24:37.000000Z 字数 5036 阅读 65878

MAStatisticResearch

策略逻辑:主要是通过用多对均线来做打分,金叉为1,死叉为0,对信号的分数进行加总相乘,在60分以上做多,40分以下做空

1、定义calcuate对均线进行打分

2、对信号进行加总相乘

3、绘图观察

4、定义信号事件

5、设定进出场条件

6、计算绩效

A Pairs Percent of MA

1:4,2:8...,20:80

  1. import warnings
  2. warnings.filterwarnings('ignore')
  1. from jaqs_fxdayu.data.dataservice import LocalDataService
  2. ds = LocalDataService()
  3. from time import time
  4. ## 加freq参数
  5. start = time()
  6. path = r'./min_data/VnTrader_1Min_Db'
  7. props = {'fields': 'open,high,low,close,volume','symbol': 'BTCUSDT:binance', 'freq': '1H',
  8. 'start_date':20180101000000}
  9. Time_dict = ds.bar_reader(path,props)
  10. print(time()-start)
25.29762315750122
  1. from jaqs_fxdayu.data.hf_dataview import HFDataView
  2. dv1H = HFDataView()
  1. dv1H.create_init_dv(Time_dict.set_index(["trade_date","symbol"]))
Initialize dataview success.

计算信号

MaStatistic是用了多对均线对来做打分,金叉为1,死叉为0

  1. # 1、定义calcuate对均线进行打分
  2. import talib as ta
  3. import numpy as np
  4. import pandas as pd
  5. def calculate(close, timePeriod):
  6. mas = ta.MA(close.iloc[:,0].values, timePeriod)
  7. mal = ta.MA(close.iloc[:,0].values, 5*timePeriod)
  8. df = pd.DataFrame({'long': mal, 'short': mas}, index=close.index).dropna()
  9. df['direction'] = list(map(lambda s, l: 1 if s > l else 0, df['short'], df['long']))
  10. return df['direction']
  1. # dv1H.get_ts('close',date_type='datetime').tail()
  1. # dv1H.get_ts('close',date_type='datetime').iloc[:,0].values
  1. dvClose = dv1H.get_ts('close',date_type='datetime').dropna()
  2. x = np.array(range(1,21,1))
  3. signalDf = pd.DataFrame({t: calculate(dvClose, t) for t in x})
  1. # signalDf
  1. #2、信号的加总相乘
  2. signalDf['signal'] = pd.Series({name: true.sum()*5 for name, true in signalDf.iterrows()})
  1. # signalDf['signal']
  1. # dv1H.get_ts('close',date_type='datetime')
  1. # 3、绘图观察
  2. import matplotlib.pyplot as plt
  3. from talib import abstract
  4. fig, (ax,ax1) = plt.subplots(2,1,sharex=True, figsize=(15,15))
  5. ax.plot(dv1H.get_ts('close',date_type='datetime'))
  6. ax1.plot(signalDf['signal'], 'g', alpha=0.3)
  7. ax1.plot(abstract.EMA(signalDf,200,price='signal'), 'r', alpha=0.8)
  8. ax1.hlines(60, signalDf['signal'].index[0], signalDf['signal'].index[-1])
  9. ax1.hlines(40, signalDf['signal'].index[0], signalDf['signal'].index[-1])
  10. plt.show()

output_15_0.png-127.2kB

  1. # dv1H.get_ts('close')
  1. #4、定义信号事件
  2. def signalAppend(signalDf):
  3. signalDf['time'] = signalDf.index
  4. signalDf["trade_date"] = signalDf['time'].apply(lambda x:int(x.strftime(format="%Y-%m-%d %H:%M:%S").replace("-","").replace(":","").replace(" ","")))
  5. signalDf["symbol"] = "BTCUSDT:binance"
  6. signalDf = signalDf.set_index(["trade_date","symbol"])
  7. signalSe = signalDf.signal.unstack()
  8. dv1H.append_df(signalSe,'signalSe')
  9. signalAppend(signalDf)
  1. # dv1H.get_ts('signalSe')

加总相乘,60分以上做多,40分以下做空

  1. # 5、设定进出场条件
  2. long = dv1H.add_formula('long','If((signalSe>=60) && (Delay(signalSe,1)<60), 2, 0)', add_data=True)
  3. short = dv1H.add_formula('short','If((signalSe<=40) && (Delay(signalSe,1)>40), -2, 0)', add_data=True)
  4. closeLong = dv1H.add_formula('closeLong','If(short==-2,1,0)', add_data=True)
  5. closeShort = dv1H.add_formula("closeShort",'If(long==2,-1,0)', add_data=True)
  1. #6、计算绩效
  2. from jaqs_fxdayu.research import TimingDigger
  3. tdMaStatistic = TimingDigger(output_folder=".", output_format='pdf',signal_name='MaStatistic')
  4. def TimingSignal(td, dv, mhp=None,sl=None,sp=None):
  5. # step 1:实例化TimingDigger 通过output_folder和output_format指定测试报告的输出路径和输出格式,通过signal_name指定绩效文件名称
  6. #多空分别计算一遍 输出汇总结果
  7. td.process_signal(
  8. enter_signal=dv.get_ts("long"),
  9. exit_signal=dv.get_ts("closeLong"),
  10. sig_type="long", # 信号类型 long/short
  11. price=dv.get_ts("close"),
  12. max_holding_period=mhp, # 最大持有天数 可为空
  13. stoploss=-sl, # 止损百分比 负数 可为空
  14. stopprofit=sp, # 止盈百分比 正数 可为空
  15. )
  16. td.process_signal(
  17. enter_signal=dv.get_ts("short"),
  18. exit_signal=dv.get_ts("closeShort"),
  19. sig_type="short", # 信号类型 long/short
  20. price=dv.get_ts("close"),
  21. max_holding_period=mhp, # 最大持有天数 可为空
  22. stoploss=-sl, # 止损百分比 负数 可为空
  23. stopprofit=sp, # 止盈百分比 正数 可为空
  24. )
  25. 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以上,具体看两者比例。

  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
  1. 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
  1. 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
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注