[关闭]
@Channelchan 2018-12-05T00:20:26.000000Z 字数 2567 阅读 59633

信号研究

min_data数据下载:

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

1. 获取数据

清洗数据

  1. import warnings
  2. warnings.filterwarnings('ignore')
  3. from jaqs_fxdayu.data.dataservice import LocalDataService
  4. ds = LocalDataService()
  5. from time import time
  6. ## 加freq参数
  7. start = time()
  8. path = './min_data/VnTrader_1Min_Db'
  9. props = {'fields': 'open,high,low,close,volume','symbol':
  10. 'EOSUSDT:binance',
  11. 'freq': '15Min,25Min',
  12. 'start_date':20180601000000}
  13. Time_dict = ds.bar_reader(path,props) #读取数据
  14. print(time()-start)
6.14521598815918
  1. df = Time_dict['15Min'].dropna().set_index("datetime")

画图看数据是否缺失

  1. import matplotlib.pyplot as plt
  2. plt.figure(figsize=(20,10))
  3. plt.plot(df.close)
  4. plt.show()

output_6_0.png-45.7kB

2. 信号研究

提出假设:借鉴经典的海龟策略思想,当价格突破一定周期的最高价则看多,反之看空

编写信号:

(1)读取数据,计算16个k线周期的最高最低价格指标

  1. import pandas as pd
  2. import numpy as np
  3. import os
  4. import talib as ta
  5. import matplotlib.pyplot as plt
  6. df1 = Time_dict['15Min'].dropna().set_index("datetime")
  1. df1['upband'] = ta.MAX(df1['close'].values,16)
  2. df1['downband'] = ta.MIN(df1['close'].values,16)

(2)将指标往前推一个k线,产生突破信号

  1. df1['upband'] = df1['upband'].shift(1)
  2. df1['downband'] = df1['downband'].shift(1)

(3)可视化指标

  1. fig, ax1 = plt.subplots(figsize=(15, 7))
  2. plt.plot(df1[['close','upband','downband']].loc['20180901':'20180911',])
  3. plt.grid(True)
  4. plt.axis('tight')
  5. plt.xlabel('date')
  6. plt.ylabel('Price 1nd')
  7. plt.title('two stock')
  8. plt.show()

output_14_0.png-49.7kB

(4)编写信号,若价格突破16周期最高价则看多,siganl为1,突破最低价则看空,signal为-1,若在两轨中间,则为0

可视化数据与信号

  1. df1['signal1'] = np.where(df1['close']>df1['upband'],1,np.where(df1['close']<df1['downband'],-1,0))
  1. fig, ax1 = plt.subplots(figsize=(15, 7))
  2. plt.plot(df1[['close']].loc['20180901':'20180911',])
  3. plt.grid(True)
  4. plt.axis('tight')
  5. plt.xlabel('date')
  6. plt.ylabel('Price 1nd')
  7. plt.title('two stock')
  8. ax2 = ax1.twinx() #双坐标
  9. plt.plot(df1[['signal1']].loc['20180901':'20180911',],'r')
  10. # plt.plot(df1[['signal6']].loc['20180801':'20180811',],'g')
  11. plt.ylabel('Price 2nd')
  12. plt.show()

output_17_0.png-64kB

发现问题:发现虚假信号过多,特别是在震荡的行情中开仓次数太频繁

解决方案:加入ATR波动率指标过滤信号

  1. df1['atr20'] = ta.ATR(df1['high'].values,df1['low'].values,df1['close'].values,14)
  2. df1['atr50'] = ta.ATR(df1['high'].values,df1['low'].values,df1['close'].values,76)

当14周期atr > 76周期atr,允许开仓,signal2 为 1,否则signal2 为 0 ,不允许开仓。将两个指标结合,得出signal3信号

  1. df1['signal2'] = np.where(df1['atr20']>=df1['atr50'],1,0)
  2. df1['signal3'] = np.where(df1['signal2']==1,df1['signal1'],0)

加入atr信号之后可以看到过滤掉了很多震荡行情的假信号

  1. fig, ax1 = plt.subplots(figsize=(15, 7))
  2. plt.plot(df1[['close','upband','downband']].loc['20180901':'20180911',])
  3. plt.grid(True)
  4. plt.axis('tight')
  5. plt.xlabel('date')
  6. plt.ylabel('Price 1nd')
  7. plt.title('two stock')
  8. ax2 = ax1.twinx() #双坐标
  9. plt.plot(df1[['signal3']].loc['20180901':'20180911',],'r')
  10. # plt.plot(df1[['signal2']].loc['20180901':'20180911',],'g')
  11. plt.ylabel('Price 2nd')
  12. plt.show()

output_23_0.png-64.1kB

思路验证

通过vnpy回测策略思路得到回测绩效,验证策略可行性

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注