我们平时见到的很多交易策略都可以理解为模式识别策略,比如双均线策略,MACD等等,只是由于均线策略或者MACD策略都不是标准的模式,所以往往不会纳入到模式识别的范畴之内。
今天想结合一个简单的模式识别和python的数据分析,设计一款实际可用的交易策略
识别什么模式
我们假设一个比较简单的模式,0代表跌,1代表涨,那么111111代表连续涨了6次,000000代表连续跌了6次,111111000000代表连续涨了6次,之后连续跌了6次。现在假定我们要识别模式000000-111111之间任意一种(比如001001),并标注出识别该模式之后价格走势情况
模式识别变成指标
我们将我们要识别的模式变成10进制,即
000000 = 0
000001 = 1
000010 = 2
000011 = 3
......
111111 = 63
我们将识别之后的价格走势图也按照上面的模式变成0-63这样的数据,
我们将要识别的模式取名pattern, 识别之后的模式叫recognition, 根据这两个数组的值写成指标,将指标拖入到图表中,具体的指标是这样:
提取指标数据
上面指标包含了两条线,我们还需要提取指标数据:
步骤如下:
一、建立指标数据文件,比如命名为pr.csv
二、在指标头部添加如下代码:
string filename = "pr.csv";string dirname = "indicator";int file_handle = FileOpen(dirname + "//" + filename, FILE_READ|FILE_WRITE|FILE_CSV);三、在指标循环内添加如下代码,可以将任意的指标数据导入到文件中
if(file_handle != INVALID_HANDLE){ FileWrite(file_handle, ExtRecognition, ExtPattern, ExtDuration);}else PrintFormat("Failed to open %s file, Error code = %d",filename,GetLastError());指标数据分析
获取到我们想要的指标后,我们可以使用python对指标数据进行分析,去掉前10000条无效数据,
import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_csv('pr.csv', sep="\t", encoding="utf-16LE", header=None)df = df.drop(df.index[0:10000])df.tail()得到如下结果
101159 24.0 42 4905.0101160 24.0 42 4906.0101161 24.0 42 4907.0101162 24.0 42 4907.0101163 24.0 42 4909.0我们总共获取了大约10万条数据,其中 24表示要识别的模式(23 = 010111 跌涨跌涨涨涨),对应的识别模式是42(41 = 101001 涨跌涨跌跌涨)
接下来,我们需要知道如下信息:
一、任一模式下会出现哪些识别模式,出现频率最高的模式是哪一个
二、任一模式出现的频次是怎样的?有没有规律
如下代码就是将统计任一模式下可能出现的识别模式,并保存在csv文件中,供MT5中设计交易策略时使用
def dec2bin(num): num1, digit1 = divmod(num, 2) num2, digit2 = divmod(num1, 2) num3, digit3 = divmod(num2, 2) num4, digit4 = divmod(num3, 2) num5, digit5 = divmod(num4, 2) num6, digit6 = divmod(num5, 2) return str(digit6) + str(digit5) + str(digit4) + str(digit3) + str(digit2) + str(digit1)a = []b = []for i in range(1, 65): for j in range(1, 65): a.append({'i': i, 'j': j, 'count': df[(df[0] == i) & (df[1] == j)].shape[0]}) b.append({'i': dec2bin(i-1), 'j': dec2bin(j-1), 'count': df[(df[0] == i) & (df[1] == j)].shape[0]})df2 = pd.DataFrame(a)df3 = pd.DataFrame(b)df2.to_csv('pr3.csv', sep=',', encoding='ANSI', header=None, index=None)df3.to_csv('pr4.csv', sep=',', encoding='ANSI', header=None, index=None)获得如下信息,我们截取其中任意3条信息
18,14,018,15,018,16,25上面的信息表示:
- 在出现模式18时,识别模式14出现的次数是0
- 在出现模式18时,识别模式15出现的次数是0
- 在出现模式18时,识别模式16出现的次数是25
如下代码获取任一模式出现的频次
df[0].value_counts().plot(kind='bar', figsize=(20, 6))
交易策略设计
接下来,我们就要使用该模型识别进行交易策略的设计
一、每出现一个新的tick的时候,利用指标识别出当前的模式,比如8
二、读取csv文件,找出某个任一模式下最可能出现的识别模式,并基于此给出买卖信号,比如,对于8模式最可能对应的识别模式是25,我们就会基于此模式25(24=011000 跌涨涨跌跌跌)设计交易计划
下面的代码就是在MT5平台读取csv数据的示例代码
file_handle = FileOpen(dirname + "//" + filename, FILE_READ|FILE_CSV|FILE_ANSI, ","); if(file_handle!=INVALID_HANDLE) { //--- 读取来自数组文件的所有数据 int line_count = 0; int field_count = 0; while(!FileIsEnding(file_handle)){ string str = FileReadString(file_handle); if(line_count >= ArraySize(file_array)){ ArrayResize(file_array, ArraySize(file_array) + 1024); } file_array[line_count].pattern = (int) str; field_count = 1; while(!FileIsLineEnding(file_handle)){ str = FileReadString(file_handle); if(field_count == 1){ file_array[line_count].recognition = (int) str; field_count++; } else if(field_count == 2){ file_array[line_count].count = (int) str; field_count++; } else { field_count++; Print("field count is ", field_count); continue; } } line_count++; } ArrayResize(file_array, line_count); // Print("size is ", ArraySize(file_array)); FileClose(file_handle); } else{ Print("File open failed, error ",GetLastError()); }回测
我们将设计好的交易策略应用于模拟盘,并检测模式是否能够识别正确,检测开仓方向是否正确,接下来就需要对该交易策略进行回测,由于MT5回测读取文件信息会产生错误,在下一篇文章中我们将文件直接放进交易策略中进行回测,欢迎继续关注我们 |
|