[关闭]
@Channelchan 2018-11-12T14:21:31.000000Z 字数 9013 阅读 65943

HFDataView

如果出现读取不了数据文件的问题,将原来的版本删掉,安装新的jaqs_fxdayu:

pip install git+https://github.com/xingetouzi/jaqs-fxdayu.git

min_data数据下载:

链接:https://pan.baidu.com/s/1OBTX-zc2GfsGutlEeoznJg
提取码:uz91

如果放在同一目录下使用
path = r'./min_data/OANDA_M1'

如果放在不同目录下使用或者指定路径
path = r'../min_data/OANDA_M1'

1. 数据的读取

ds.read_bar

1) path : hdf5文件上级目录

'.\min_data\VnTrader_1Min_Db' 与 '.\min_data\OANDA_M1'

binance后缀的品种在VnTrader_1Min_Db、oanda后缀的品种在OANDA_M1的位置

2) props :

配置项包括symbol, start_date, end_date , field, freq

start_date/end_date : 20180601000000 (int, 精确到秒,共14位数字)

symbol :str/list

'BTCUSDT:binance,ETHUSDT:binance,EOSUSDT:binance' 与
'AUD_USD:oanda,EUR_USD:oanda,GBP_USD:oanda,HK33_HKD:oanda,NAS100_USD:oanda,
NZD_USD:oanda,USD_CAD:oanda,USD_CHF:oanda,USD_CNH:oanda,USD_JPY:oanda,WTICO_USD:oanda,XAU_USD:oanda'

field : str/list

'open,high,low,close,volume'

freq : str/list

'1Min, 5Min, 15Min, 30Min, 1H, 4H, 6H, 8H, 12H'

配置项均可为空,代表该项读全部

3)resample_rules :
时间变周期(resample)规则

  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/OANDA_M1'
  7. props = {'fields': 'open,high,low,close,volume','symbol': \
  8. 'USD_CNH:oanda,WTICO_USD:oanda,XAU_USD:oanda',
  9. 'freq': '15Min,1H',
  10. 'start_date':20180601000000}
  11. Time_dict = ds.bar_reader(path,props) #读取数据
  12. print(time()-start)
23.927146434783936
  1. # Time_dict
  1. #调用模块
  2. from jaqs_fxdayu.data.hf_dataview import HFDataView
  3. dv15M = HFDataView()
  4. dv1H = HFDataView()
  1. # dv1H.data

2. 初始化dv

  1. dv15M.create_init_dv(Time_dict['15Min'].dropna().set_index(["trade_date","symbol"]))
  2. dv1H.create_init_dv(Time_dict['1H'].dropna().set_index(["trade_date","symbol"]))
Initialize dataview success.
Initialize dataview success.
  1. # dv1H.get_ts('close', date_type='datetime')
  1. Gap1H = dv1H.add_formula('gap', 'close-Delay(open, 1)',add_data=True)
  1. Gap15 = dv15M.add_formula('gap', 'close-Delay(open, 1)',add_data=True)
  1. #观察价差
  2. import matplotlib.pyplot as plt
  3. plt.plot(dv15M.get_ts('gap', date_type='datetime')['USD_CNH:oanda'])
  4. plt.show()

output_13_0.png-15kB

3计算

MA20和MA55金叉死叉信号

进场信号
long:如果出现,当20日均线向上穿过55日均线以及前一个小时的20日均线向下穿过55日均线时的信号时,赋值2表示做多,下多单。

short:如果出现,当20日均线向下穿过55日均线以及前一个小时的20日均线向上穿过55日均线时的信号时,赋值-2表示做空,下空单。

出场信号
close_long:判断当前市场是否出现新的信号可以开空单,那么就平掉原来的多仓,否则继续持有多仓。赋值为1,表示平多仓。

close_short:判断当前市场是否出现新的信号可以开多单,那么就平掉原来的空仓,否则继续持有空仓。赋值为-1,表示平空仓。

  1. # 进场信号
  2. long = dv1H.add_formula("long","If((Ts_Mean(close,20)>Ts_Mean(close,55)) && (Delay(Ts_Mean(close,20),1)<=Delay(Ts_Mean(close,55),1)),2,0)", add_data=True)
  3. short = dv1H.add_formula("short","If((Ts_Mean(close,20)<Ts_Mean(close,55)) && (Delay(Ts_Mean(close,20),1)>=Delay(Ts_Mean(close,55),1)),-2,0)", add_data=True)
  4. # 出场信号
  5. close_long = dv1H.add_formula("closeLong","If(short==-2,1,0)", add_data=True)
  6. close_short = dv1H.add_formula("closeShort","If(long==2,-1,0)", add_data=True)
  1. dv1H.get_ts('long').stack()[dv1H.get_ts('long').stack()==2]#观察出现做多信号的时间点
trade_date      symbol       
20180607220000  USD_CNH:oanda    2.0
20180612160000  USD_CNH:oanda    2.0
20180614210000  USD_CNH:oanda    2.0
20180705180000  USD_CNH:oanda    2.0
20180710220000  USD_CNH:oanda    2.0
20180713180000  USD_CNH:oanda    2.0
20180717180000  USD_CNH:oanda    2.0
20180723180000  USD_CNH:oanda    2.0
20180726190000  USD_CNH:oanda    2.0
20180731050000  USD_CNH:oanda    2.0
20180801170000  USD_CNH:oanda    2.0
20180807010000  USD_CNH:oanda    2.0
20180809200000  USD_CNH:oanda    2.0
20180822160000  USD_CNH:oanda    2.0
20180829080000  USD_CNH:oanda    2.0
20180904150000  USD_CNH:oanda    2.0
20180907160000  USD_CNH:oanda    2.0
20180914140000  USD_CNH:oanda    2.0
dtype: float64
  1. #通过测试报告,看多空信号的绩效,这里是定义报告格式
  2. from jaqs_fxdayu.research import TimingDigger
  3. tdMa = TimingDigger(output_folder=".", output_format='pdf',signal_name='Ma')
  4. def TimingSignal(td, dv, long='long', short='short',closeLong='closeLong', closeShort='closeShort'\
  5. , mhp=None,sl=None,sp=None):
  6. # step 1:实例化TimingDigger 通过output_folder和output_format指定测试报告的输出路径和输出格式,通过signal_name指定绩效文件名称
  7. #多空信号分别计算一遍 输出汇总结果
  8. td.process_signal(
  9. enter_signal=dv.get_ts(long),
  10. exit_signal=dv.get_ts(closeLong),
  11. sig_type="long", # 信号类型 long/short
  12. price=dv.get_ts('close'),
  13. max_holding_period=mhp, # 最大持有天数 可为空
  14. stoploss=-sl, # 止损百分比 负数 可为空
  15. stopprofit=sp, # 止盈百分比 正数 可为空
  16. )
  17. td.process_signal(
  18. enter_signal=dv.get_ts(short),
  19. exit_signal=dv.get_ts(closeShort),
  20. sig_type="short", # 信号类型 long/short
  21. price=dv.get_ts("close"),
  22. max_holding_period=mhp, # 最大持有天数 可为空
  23. stoploss=-sl, # 止损百分比 负数 可为空
  24. stopprofit=sp, # 止盈百分比 正数 可为空
  25. )
  1. TimingSignal(tdMa, dv1H, mhp=100, sl=0.05, sp=0.3)#调取数据
Nan Data Count (should be zero) : 0;  Percentage of effective data: 0%
Nan Data Count (should be zero) : 0;  Percentage of effective data: 0%

主要看的是win_ratio和win_mean/loss_mean,其他是基础的统计指标。
胜率win_ratio最好在0.4以上,盈亏比:win_mean/loss_mean在1以上,具体看两者比例。

  1. tdMa.create_event_report(sig_type="long")
*****-Summary-*****
Event Analysis
                      win    loss     all
t-stat              2.437  -4.674  -0.852
p-value             0.071   0.001   0.406
mean                0.005  -0.004  -0.001
std                 0.004   0.003   0.005
info_ratio          1.218  -1.349  -0.207
skewness           -0.061  -0.333   0.926
kurtosis           -1.742  -1.214   0.223
pct5                0.000  -0.008  -0.007
pct25               0.001  -0.006  -0.004
pct50               0.006  -0.003  -0.002
pct75               0.010  -0.002   0.000
pct95               0.010  -0.000   0.010
occurance           5.000  13.000  18.000
win_ratio             NaN     NaN   0.278
win_mean/loss_mean    NaN     NaN   1.521
  1. tdMa.create_event_report(sig_type="short")
*****-Summary-*****
Event Analysis
                         win    loss     all
t-stat                   NaN  -8.571  -6.710
p-value                  NaN   0.000   0.000
mean                0.002000  -0.005  -0.004
std                 0.000000   0.002   0.003
info_ratio               inf  -2.213  -1.677
skewness            0.000000   0.000   0.517
kurtosis           -3.000000  -0.803  -0.018
pct5                0.002000  -0.008  -0.008
pct25               0.002000  -0.007  -0.007
pct50               0.002000  -0.004  -0.004
pct75               0.002000  -0.004  -0.004
pct95               0.002000  -0.001  -0.000
occurance           1.000000  16.000  17.000
win_ratio                NaN     NaN   0.059
win_mean/loss_mean       NaN     NaN   0.393
  1. tdMa.create_event_report(sig_type="long_short") #同时计算多空头信号的绩效
*****-Summary-*****
Event Analysis
                      win    loss     all
t-stat              2.532  -9.093  -3.529
p-value             0.052   0.000   0.001
mean                0.005  -0.004  -0.003
std                 0.004   0.002   0.004
info_ratio          1.132  -1.718  -0.605
skewness            0.264  -0.041   1.344
kurtosis           -1.654  -1.066   1.869
pct5                0.000  -0.008  -0.008
pct25               0.001  -0.007  -0.006
pct50               0.004  -0.004  -0.004
pct75               0.009  -0.002  -0.001
pct95               0.010  -0.000   0.007
occurance           6.000  29.000  35.000
win_ratio             NaN     NaN   0.171
win_mean/loss_mean    NaN     NaN   1.133

Alpha101

Algotithm:

  1. 文档:http://www.fxdayu.com/static/standalone/tutorials.html?article=245,

    https://jaqs.readthedocs.io/zh_CN/latest/user_guide.html#dataview

  2. 源码查阅:Pycharm

  1. for dvAdd in [dv15M, dv1H]:
  2. dvAdd.add_formula('alpha1_C','Ts_Argmax(SignedPower(If(Return(close,1)<0, StdDev(Return(close,1),20),close),2),5)',add_data=True)
  1. import matplotlib.pyplot as plt
  2. def Plot_Mean(dv, alpha, chart_name='dv_alpha_ma', ShortPeriod=20, LongPeriod=60, n=0):
  3. fig,(ax,ax1) = plt.subplots(2,1,sharex=True, figsize=(15,15))
  4. ax.plot(dv.get_ts('close', date_type='datetime').iloc[:,0].iloc[n:])
  5. ax.set_title(chart_name,fontsize=24,color='b')
  6. ax1.plot(alpha.iloc[n:], alpha=0.1)
  7. ax1.plot(pd.Series(alpha.rolling(ShortPeriod).mean(), index=alpha.index).iloc[n:])
  8. ax1.plot(pd.Series(alpha.rolling(LongPeriod).mean(), index=alpha.index).iloc[n:])
  9. # plt.savefig(chart_name)
  10. plt.show()
  1. dv_dict = {'alpha1_dv15M':dv15M, 'alpha1_dv1H':dv1H}
  2. alpha1_dict = {n: dv.get_ts('alpha1_C', date_type='datetime') for n, dv in dv_dict.items()}
  1. # alpha1_dict
  1. import pandas as pd
  2. #alpha1_dv15M是15分钟线,1H是1小时线,ma30和ma60代表对信号进行均线处理和观察是否与价格存在涨跌关系
  3. for name, alpha in alpha1_dict.items():
  4. Plot_Mean(globals()[name.split('_')[1]], alpha.iloc[:,0], chart_name=name+'_ma30_ma60',ShortPeriod=30, LongPeriod=60, n=-1000)#橘色短线 绿色长线

output_30_0.png-111.6kB

output_30_1.png-122.2kB

  1. # 进场信号
  2. long = dv1H.add_formula("longAlpha1","If((Ts_Mean(alpha1_C,20)>Ts_Mean(alpha1_C,55)) && (Delay(Ts_Mean(alpha1_C,20),1)<=Delay(Ts_Mean(alpha1_C,55),1)),2,0)", add_data=True)
  3. short = dv1H.add_formula("shortAlpha1","If((Ts_Mean(alpha1_C,20)<Ts_Mean(alpha1_C,55)) && (Delay(Ts_Mean(alpha1_C,20),1)>=Delay(Ts_Mean(alpha1_C,55),1)),-2,0)", add_data=True)
  4. # 出场信号
  5. close_long = dv1H.add_formula("closeLongAlpha1","If(shortAlpha1==-2,1,0)", add_data=True)
  6. close_short = dv1H.add_formula("closeShortAlpha1","If(longAlpha1==2,-1,0)", add_data=True)
  1. dv1H.get_ts('longAlpha1').stack()[dv1H.get_ts('longAlpha1').stack()==2].tail()
trade_date      symbol       
20180919100000  USD_CNH:oanda    2.0
20180919160000  USD_CNH:oanda    2.0
20180920120000  USD_CNH:oanda    2.0
20180921080000  USD_CNH:oanda    2.0
20180921140000  USD_CNH:oanda    2.0
dtype: float64
  1. from jaqs_fxdayu.research import TimingDigger
  2. tdAlpha1 = TimingDigger(output_folder=".", output_format='pdf',signal_name='Alpha001')
  3. TimingSignal(tdAlpha1, dv1H,'longAlpha1','shortAlpha1','closeLongAlpha1','closeShortAlpha1', 100, 0.05, 0.3)
Nan Data Count (should be zero) : 0;  Percentage of effective data: 1%
Nan Data Count (should be zero) : 0;  Percentage of effective data: 1%

观察有无加入alpha的绩效区别

主要看的是win_ratio和win_mean/loss_mean,其他是基础的统计指标。
胜率win_ratio最好在0.4以上,盈亏比:win_mean/loss_mean在1以上,具体看两者比例。

  1. tdAlpha1.create_event_report(sig_type="long_short")
*****-Summary-*****
Event Analysis
                       win     loss      all
t-stat               6.496  -12.362   -1.690
p-value              0.000    0.000    0.093
mean                 0.003   -0.002   -0.000
std                  0.003    0.002    0.003
info_ratio           0.968   -1.184   -0.136
skewness             1.394   -2.036    1.319
kurtosis             1.545    5.004    3.949
pct5                 0.000   -0.005   -0.004
pct25                0.000   -0.002   -0.002
pct50                0.002   -0.001   -0.001
pct75                0.005   -0.001    0.000
pct95                0.010   -0.000    0.006
occurance           46.000  110.000  156.000
win_ratio              NaN      NaN    0.295
win_mean/loss_mean     NaN      NaN    1.626
  1. tdMa.create_event_report(sig_type="long_short")
*****-Summary-*****
Event Analysis
                      win    loss     all
t-stat              2.532  -9.093  -3.529
p-value             0.052   0.000   0.001
mean                0.005  -0.004  -0.003
std                 0.004   0.002   0.004
info_ratio          1.132  -1.718  -0.605
skewness            0.264  -0.041   1.344
kurtosis           -1.654  -1.066   1.869
pct5                0.000  -0.008  -0.008
pct25               0.001  -0.007  -0.006
pct50               0.004  -0.004  -0.004
pct75               0.009  -0.002  -0.001
pct95               0.010  -0.000   0.007
occurance           6.000  29.000  35.000
win_ratio             NaN     NaN   0.171
win_mean/loss_mean    NaN     NaN   1.133
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注