본문 바로가기

backup

[HFT 시스템 트레이딩]자기상관관계 분석2

자기상관관계분석을 이어서 하겠습니다.

지난 글에서 언급했듯이 자기상관관계분석을 데이타를 순차적으로 한번에 읽으면서 구하는 방법을 알아보겠습니다.


먼저 자기상관관계는 공식은 다음과 같습니다.



여기서 시그마 부분을 바로 이전 값에서 새로운 데이타를 넣었을 때 변화는 다음과 같습니다.

이 공식은 자료가 없어서 제가 직접 풀었는데, 테스트해보니 값이 정확하게 동작하네요. 이 값에서 n-1과 분산으로 나누면 자기상관계수입니다.


지난 번 프로그램에서 자기상관관계 부분을 추가하면 다음과 같습니다.








굳이 왜 이렇게 하느냐하면 일단 계산 걸리는 속도가 최소한 절반으로 줄어듭니다. 본래 자기상관관계나 분산 등을 구하려면 평균값을 알아야 합니다. 그러기 위해서는 데이타를 한번 전체를 읽어야 합니다. 그리고 다시 그 데이타를 한번 더 읽어야지만 분산을 구할 수 있습니다.


분봉 정도 데이타도 부담이 없기는 한데, 1초 단위나 틱 단위의 데이타는 시간이 많이 걸립니다. C에서는 그 시간도 matlab이나 R쓰는 것보다 훨씬 빠르기는 합니다. 이 데이타를 분석하는데도 통화쌍 하나당 사실 180초 정도 밖에 걸리지는 않긴 한데, 일반적인 두번 데이타를 두번 읽는 방법으로 분산을 구하려고 하면 그 두배가 걸리게 됩니다.


통화쌍 15개를 다 돌리려니 은근 시간이 걸리는군요. 그렇게 시간이 걸리는 이유가 파일 읽는 시간이 대부분이기는 한데, 데이타를 전부 메모리에 올리는 것도 용량이 작을 때는 가능하지만, 양이 늘어나면 불가능하죠.

그래서 두번 데이타를 읽지 않고 한번만 읽어서 하는 방법을 구현한 것입니다.


그리고 프로그래밍 팁 하나 if문이 어셈블리어로 바뀌게 되면 if 에서 true가 되면 jump를 하게 됩니다. cpu에서 동작을 할 때 다음 동작을 미리 준비를 하는데, jump가 일어나면 미리 준비를 한 것이 무용지물이 되고 속도가 느려지는 원인이 됩니다. 그래서 특별한 예외상황만 if에서 잡아주고, 일반적으로 대부분의 일반적인 일은 else문에서 일어나게 하는게 성능 개선이 도움이 됩니다.


만약 위의 구문에서 if(n == 1) 이 아니라 if(n > 1)으로 하고 else 구문안의 내용과 바꾸게 되면 계속 jump가 일어나서 성능이 느려질 수 있습니다. 가능한 jump가 일어나지 않도록 프로그래밍하는 것도 HFT프로그래밍의 팁중 하나입니다.


다음 글에서는 15개 통화쌍에 대해서 자기상관관계포함해서 통계분석한 자료 올리도록 하겠습니다.