유전자 알고리즘(Genetic Algorithm)이라는 것을 들어보셨나요?
유전자 알고리즘은 매우 쉬우면서 효과적인 최적화방법입니다.
유전자 알고리즘은 마치 생명체가 세대를 거듭하면서, 자연도태 되면서 환경에 최적화 되는 것처럼
답을 찾아가는 방법입니다.
프로그래밍 방법도 쉽고, 실제 답도 비교적 잘 찾아주는 편입니다.
구현 방법은 그렇게 어렵지 않습니다.
시스템 트레이딩에서는 매매 규칙을 찾아내는데 사용할 수도 있지만, 만들어진 매매 규칙에서 최적으로 수익을 내는 입력 변수를 찾아내는데도 유용합니다.
단계1, 입력변수를 이진코드로 만들기
첫번째 순서는 입력변수를 이진코드로 만드는 것입니다.
생명체의 염색체는 일렬로 유전자가 배치되어 있습니다.
유전자 알고리즘에서는 입력 변수들을 모아서 일렬로 배치를 하여서 마치 염색체처럼 만듭니다.
만약 0~100의 값을 가지는 입력 변수 3개가 있다고 해보죠.
하나의 변수를 0~100의 값을 나타내려면 2^7 이 128이므로 이진수가 6자리가 있으면 100까지의 숫자는 충분히 표시가 가능합니다.
이진수 6자리로는 최대 127까지 쓸 수 있으니까요.
총 변수가 3개이니 유전자의 길이를 18로 하면 됩니다.
처음 6자리는 첫번째 변수의 값, 두번째 6자리는 두번째 변수의 값 세번째 6자리는 세번째 변수의 값이 됩니다.
만약 세 변수가 10, 8, 9 라고 한다면 유전자는
001010001000001001
로 표시를 하면 됩니다.(맞죠? ㅋㅋ)
이렇게 입력변수들을 일렬의 이진코드로 인코딩 하는 것이 첫번째 과정입니다.
물론 하나만 하는 것이 아니라 테스트셋을 여러개 만들어서 각각 다른 값으로 세팅을 해줍니다.
단계2, 경쟁시키기
두 번째 단계는 각각의 입력변수별 준비한 테스트셋을 백테스트를 진행해서 점수를 매기게 됩니다.
적합도 점수라고 하는데, 이부분이 매우 중요합니다. 평가기준을 무엇을 할지에 따라서 매우 다른 결과를 얻을 수 있습니다.
단계3, 교배시키기
세 번째 단계에서는 두 입력변수를 뽑아서 교배를 시키는 것입니다.
뽑는 기준은 앞에서 구한 적합도 점수입니다. 이때 무조건 높은 점수를 뽑는 것이 아니라,
높은 점수는 뽑힐 확률을 높이고, 낮은 점수는 뽑힐 확률을 낮춰서 제비 뽑기 식으로 두 개를 뽑습니다.
그렇게 해서 뽑힌 두개의 유전자를 교배 시킵니다. 교차 방법은 여러가지가 있는데
한가지 방법은 구간을 나눠서 그 구간의 값을 바꾸는 것입니다.
앞의 예에서 18자리 중에 앞의 뒤의 8자리를 서로 바꾸는 것도 하나의 방법입니다.
그렇게 해서 자식 유전자를 두개 만듭니다.
마치 생명체가 유전자를 섞어서 자식을 낳는것과 비슷합니다.
교배를 한다음은 변이를 줍니다. 돌연변이를 만드는 것이죠.
각각 유전자에 대해서 0.01 이나 0.001의 확률로 이진 코드의 값을 반대로 만들어 줍니다.
즉 본래 값이 0이면 1로 1이면 0으로 만들어 줍니다.
변이는 중요한데, 기존의 값만으로는 나올 수 없는 우월한 값이 나올 가능성을 만들어줍니다. 하지만 변이율을 너무 높이시면, 최적값 찾기가 힘들어집니다.
이 과정에서 부모의 숫자 만큼 자식 만들어주시면 됩니다.
단계4. 입력 변수 갱신
마지막단계인데, 앞에서 만들어진 자식 유전자의 이진코드를 입력변수로 다시 변환시켜 주는 과정입니다.
변환을 해서 다시 테스트셋에 입력변수들을 갱신해 줍니다.
이제 위의 단계2에서 단계4를 계속 반복해주시면 됩니다. 시스템 트레이딩의 경우 수익이나 승율이 어느 정도 이상이 될 때까지 돌릴 수도 있고, 숫자 정해서 100번 반복해 볼 수도 있습니다. 한번만 하지 말고 그렇게 몇 번 돌려보시면, 최적값 찾는데 도움이 됩니다.
아래 다이어그램 참조하세요. ^^
프로그래밍은 그렇게 어렵지 않습니다. 다른 library 구해서 쓸까하다가, 직접 개발했습니다.
로직 자체가 그렇게 어렵지는 않고, 어차피 다른 library는 제가 만든 backtest 시스템에 최적화되어 있지 않아, 익히는 시간이나 개발하는 시간이나 그렇게 차이가 나지 않을 것 같더군요.
디버깅하고 뭐하고 하는데 몇시간 걸리지 않아 개발 완료했습니다.
테스트를 계속 해보고 있는데, 최적값은 잘 나오는 것 같습니다.
다만 과최적화는 주의하셔야 합니다.
의문나는 부분이나, 실제 적용에서 잘 모르는 부분 있으시면 질문주세요.
'backup' 카테고리의 다른 글
권지아-씨스루 (1) | 2014.03.07 |
---|---|
유전자 알고리즘 프로그래밍 코드 (0) | 2014.03.06 |
HFT와 프로그래밍 언어 (2) | 2014.03.04 |
시계열 분석과 트레이딩 (2) | 2014.03.02 |
내부 표상과 학습 속도 (0) | 2014.02.28 |