How to use FANN(Fast Artificial Neural Network) in Python, MT4(Metatrader 4) and compile interfaces

By | 2012년 11월 23일

트레이딩 분야에 인공신경망(Artificial Neural Network) 이 도입 된지 오래 된다.

인공신경망이 트레이딩 분야에서 효과를 나타내고 있다는 측과 그렇지 못하다는 측의 의견이 분분하다.

실제 인공신경망을 사용해서 효과를 본 사람들은 자신의 노하우를 공개 하지 않는다.

인공신경망은 입력값과 출력값으로 망을 학습하는 것으로  garbage in garbage out을 확실하게 보여 준다.

인공신경망은 입력값과 출력값을 어떻게 정의하느냐에 따라 그 효율성이 완전히 달라진다.

본인도 희망을 가지고 트레이딩 분야에 인공신경망을 사용하기로 했다.

많은 검색과 조사결과 open source인 Fast Artificial Neural Network(FANN) Library가  나에게 딱 맞는거 같다.

기본적으로 C 라이브러리로 구성이 되어 있고 Metatrader 4(MT4), Python, Java,C# 등과 같은 언어와의 인터페이스를 지원하고 무엇보다 실행 “속도”에 포커스를 두고 있다.

트레이딩에서 학습과 실행은 아주 빠르게 진행되어야 하고 특히 MT4와의 인터페이스를 지원하는것이 눈에 띈다.

그러면 본격적으로 FANN을 컴파일 하고 Python에서 MT4에서 사용하는 방법을 알아 보자

MT4에서 32Bit만 지원하고 있기 때문에 32Bit  (MT5에서는 64 Bit지원)를 기준으로 하고 Windows기반 환경이다.

1. 준비

1.1  FANN 컴파일전에 Visual Studio 6.0 이상을 설치한다. (FANN컴파일을 위해서)

1) 설치후 nmake가 있는 bin폴더를 path에 추가한다.

예) C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin 를 path에 추가

2) FANN 컴파일전에 bin 폴더에 있는 vcvars32.bat을 실행한다.

1.2 MinGW 설치 : Python 인터페이스 모듈 컴파일 및 설치를 위해서

1) 다운로드 URL : http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/

 2) 설치시에 설치 할 컴파일러를 물어 보는데 gcc, g++를 체크 하여 설치한다.

3) 설치 후 bin 폴더를 path에 추가한다

예) C:\MinGW\bin

1.3 Swig 설치 :  Python 인터페이스 모듈 컴파일 및 설치를 위해서

1) 다운로드 URL :  http://www.swig.org/download.html

2) 설치 후 swig 폴더를 path에 추가한다.

예) C:\swig-2.0.8

1.4 FANN 라이브러리 소스 다운로드

참고 ) FANN-2.2.0 은 FANN-2.1.0과 하위 호환성이 있다. 2.2.0에 있는 추가 기능을 MT4에서 사용하려면 추가 별도의 코딩이 필요하고 Python에서 사용하는 경우는 Python binding없이 ctypes를 통해 바로 사용 할 수 있다. Python에서 fann dll을 바로 사용하는 방법은 다음번에 소개 하기로 한다.

1) FANN-2.1.0 또는 FANN-2.2.0 다운로드 받기

1)-1 FANN-2.1.0  :  http://sourceforge.net/projects/fann/files/fann/2.1.0beta/fann-2.1.0beta.zip/download 에서 FANN 2.1.0을 다운 받는다.

1)-2 FANN-2.2.0 : http://leenissen.dk/fann/wp/download/

– FANN-2.2.0에는 Python binding 소스가 없으므로 2.1.0을 받아서 python 폴더를 복사해서 사용한다.

– 복사한 python\examples의 원할한 실행을 위해서 FANN-2.1.0\benchmarks 폴더도 복사 해온다.

2) 압축을 풀고  fann-2.1.0beta\fann-2.1.0 폴더를 밖으로 꺼집어 낸후 fann-2.1.0beta 폴더는 삭제

예)  D:\AFTR\FANN-2.1.0

3) FANN-2.1.0 폴더에 bin 폴더가 없으면 bin 폴더를 만들고 bin폴더를 path에 추가한다. 추후 컴파일된 FANN DLL을 넣기 위한것이고 MT4나 Python에서 사용시 해당 폴더에 있는 FANN DLL을 참조하기 위함

예)  D:\AFTR\FANN-2.1.0\bin 또는 D:\AFTR\FANN-2.2.0\bin

 

2. FANN C 라이브러리 컴파일

2.1 vcvars32.bat 을 실행한다.

2.2 FANN-2.1.0 또는 FANN-2.2.0 사용

2.2 window용 DLL에서 표준 DLL을 생성하기 위해서 FANN-2.1.0\src\include\fann.h 파일을 다음과 같이 수정한다.

1) “FANN_API __stdcall” 을 찾는다

2) #define FANN_API __stdcall 에서 #define FANN_API 로 변경한다 (__stdcall) 삭제  —> 아주중요함

– __stdcall이 있는 경우 python 인터페이스 DLL이 생성되지 않으며 DLL 호출시 에러 발생함

==========FANN-2.1.0 인경우 ================

2.3 command창으로 나간다 (cmd)

2.3 D:\AFTR\FANN-2.1.0\MicrosoftWindowsDll 폴더로 이동한다.

2.4 nmake를 실행한다.

예) D:\AFTR\FANN-2.1.0\MicrosoftWindowsDll>namke

2.4 nmake를 실하면 현재 폴더에 bin 폴더가 생기고 dll 및 lib등의 최종결과 물이 생성된다.

예) D:\AFTR\FANN-2.1.0\MicrosoftWindowsDll\bin

2.5 bin에 있는 모든 파일을 1.4 3)에서 만든 FANN-2.1.0\bin에 복사한다.

예)  D:\AFTR\FANN-2.1.0\bin

==========FANN-2.2.0 인경우 ================

 2.3  Visual Studio 10.0에서 D:\AFTR\FANN-2.2.0\VS2010\fann.sln을 오픈하여 전체 솔루션을 빌드 한다.

2.4 빌드된 dll 및  lib파일은 자동으로 D:\AFTR\FANN-2.2.0\bin에 생성된다.

3. Python용 FANN 인터페이스 라이브러리 컴파일 및 설치 그리고 실행

3.1 FANN-2.1.0\python 폴더로 이동한다.

     (FANN-2.2.0의 경우 FANN-2.1.0에 있는 python 폴더를 복사 해오고 FANN-2.2.o\python 폴더로 이동한다.)

3.2 해당 폴더에 있는 setup.py를 수정한다. (올바른 컴파일 및 설치를 위해서)

1) extra_objects=[‘../src/doublefann.o’] 를 libraries = [‘../bin/fanndouble’]로 변경한다 –> 아주중요함

2) VERSION=’2.1.0′  은 FANN 버전에 맞게 수정한다. (2.2.0 인경우  VERSION=’2.2.0′ 으로 수정한다)

3.3 python setup.py install build --compiler=mingw32 를 실행한다.

1) 컴파일 후  python extension으로 자동으로 설치된다.

3.4 정상동작 확인을 위해 FANN-2.1.0\python 폴더의 상위 폴더나 다른 폴더로 이동한다. FANN-2.1.0\python에서 python을 실행하고 확인하는 경우 에러발생함

예)

D:\AFTR\FANN-2.1.0> python 실행

>>> from pyfann import libfann # 정상동작 확인 함

3.5 예제 실행 해보기

1) 예제 폴더  : FANN-2.1.0\python\examples

2) 예제 실행전에 examples 폴더 아래 nets 폴더를 만든다. (예제 실행시 없으면 예제 결과 저장시 에러남)

3) simple_train.py, mushroom.py,cascade_train.py 실행 해본다.

 

4. MT4에서 사용하기

4.1 Fann2MQL Site : https://code.google.com/p/fann2mql/

4.1 사용법 참조 URL : http://articles.mql4.com/777

 4.2 MT4 인터페이스 파일 다운로드 URL : http://fann2mql.wordpress.com/download/

4.3 인스톨 하는법 : http://fann2mql.wordpress.com/documentation/instalation/

4.4 MT4 인터페이스 DLL 컴파일하기

1) TBB(Thread Building Block) 를 다운 받아서 압축을 푼다 : http://threadingbuildingblocks.org/download

예) C:\usr\tbb41_20121003oss

2) Visual Studio에서 Fann2MQL 설치시 Metatrader experts에 생성된 src에 있는 Fann2MQL.vcproj을 오픈한다.

3) 설치된 FANN-2.1.0 (또는 FANN-2.2.0), TBB에 있는 include와 lib로 프로젝트 파일을 수정한다. (Debug, Release등 버전별로 각각 수정 해준다)

3)-1 Fann2MQL 프로젝트의 properties를 오픈한다.

3)-2 properties > Configuration properties > C/C++ > General > Additional include Directories 에 있는기존  include 디렉터리를 변경하고 나머는 그대로 둔다.

예) C:\usr\tbb41_20121003oss\include;D:\AFTR\FANN-2.2.0\src\include;

3)-3 properties > Configuration properties > C/C++ > General > Precompiled Header의 값을 “Create (Y/c)”로 바꾼다

3)-4 properties > Configuration properties > Linker > General > Additional Library Directories 에 있는기존  library 디렉터리를 변경하고 나머는 그대로 둔다.

예) C:\usr\tbb41_20121003oss\lib\ia32\vc10

3)-4  properties > Configuration properties > Linker > Input > Additional Dependencies 에 있는기존  값을 변경하고 나머는 그대로 둔다

예) tbb.lib;D:\AFTR\FANN-2.2.0\bin\fanndouble.lib

3)-5 컴파일시에 Fann2MQL.cpp 에 f2M_train_fast function에서 link에러가 발생하는데

//fann_train(_fanns[ann], input_vector, output_vector);
fann_compute_MSE(_fanns[ann], output_vector);
fann_backpropagate_MSE(_fanns[ann]);
fann_update_weights(_fanns[ann]);

fann_train(_fanns[ann], input_vector, output_vector);
//fann_compute_MSE(_fanns[ann], output_vector);
//fann_backpropagate_MSE(_fanns[ann]);
//fann_update_weights(_fanns[ann]);

로 바꿔 준다.

그리고 f2M_train_fast function은 실제로 사용하지 않으면 된다.

3)-6 각 버전별로 buid를 하면 src\Debug, src\Release , src\ReleaseMT 등의 폴더가 생기고 그 안에 Fann2MQL.dll 파일 생성된다.

3)-7 생성된 Fann2MQL.dll은 experts\libraries에 복사 한다. 그리고 설치된 TBB에 있는 tbb.dll도 같이 복사한다.

3)-8 주의사항 : 기존에 Fann2MQL_0.1.3.msi로 설치한 경우 windows7의 경우는 windows\SysWOW64에 windows XP등은 windows\system32에 기 설치된 tbb.dll, fanndoubleMT.dll이 있는데 이를 삭제 하여야 한다. 삭제 하지 않으면 오동작을 하거나 에러가 발생함

3)-8 C:\usr\tbb41_20121003oss\bin\ia32\vc10에 있는 tbb.dll을 windows\system32 또는\SysWOW64에 복사하거나 경로가 걸려 있는 곳에 tbb.dll을 복사한다.

답글 남기기