제 자신을 Denis라고 소개하게 되어 기쁩니다. 알고리즘 거래와 관련된 모든 정보를 제공하는 채널인 ClosetoAlgotrading에 오신 것을 진심으로 환영합니다.
딥 러닝의 힘만을 활용하여 거래 전략을 만든다는 생각이 처음 떠오른 지 꽤 오래되었습니다. 이 개념은 수익성 있는 거래를 실행하는 데 필요한 매개변수를 자율적으로 식별할 수 있는 신경망 개발을 중심으로 합니다. 이 흥미진진한 여행을 시작하기 위해 저는 라이브 실험을 하기로 결정했습니다. 여러분의 관심도 끌 수 있기를 바랍니다. 다음 에피소드에서는 강력한 거래 전략을 수립하기 위한 데이터 과학 접근 방식을 구현하는 것과 관련된 각 단계를 초기 단계부터 최종 생산까지 안내할 것입니다.
제 목표는 데이터 준비, 엄격한 테스트 등을 포함하여 모든 중간 단계를 포괄적으로 다루는 것입니다. 앞으로 저는 TensorFlow 2.0을 활용하고 tfx 파이프라인이 제공하는 가능성을 탐색할 것입니다. 나는 복잡한 계산이나 규칙을 피하고 대신 딥 러닝의 힘에 의존하여 진정으로 수익성 있는 벤처를 만들 수 있는지 확인하려고 합니다. 이 아이디어가 마음에 든다면 채널을 구독하고 이 매력적인 탐험에 동참해 보시기 바랍니다. 우리는 함께 알고리즘 거래의 우여곡절을 탐색하고 숨겨진 잠재력을 풀기 위해 노력할 것입니다.
데이터 과학 접근 방식을 더 깊이 탐구하고 싶은 사람들을 위해 간단한 Google 검색을 통해 주제를 설명하는 다양한 리소스를 얻을 수 있습니다. 결과 중에서 이 방법론을 따르는 것과 관련된 단계를 설명하는 유익한 기사와 시각적 표현을 접할 수 있습니다.
여정의 첫 번째 중요한 블록은 비즈니스 이해 단계입니다. 이 시점에서 우리는 목표를 세심하게 정의하고 이러한 목표를 달성하는 데 있어 전략의 효율성을 평가하기 위한 측정 가능한 가치인 KPI(핵심 성과 지표)를 설정해야 합니다. 이 단계를 시작하려면 특정 비즈니스 도메인의 복잡성을 철저히 이해하는 데 시간을 할애하는 것이 중요합니다. 목표에 대한 심오한 이해를 얻음으로써 명확하고 집중하여 진행할 수 있습니다. 특정 결과를 예측하는 것이 목적인지 특정 현상을 분류하는 것이 목적인지를 분별하는 것이 중요합니다.
우리가 해야 할 일의 성격을 결정하려면 근본적인 질문에 대한 답을 찾아야 합니다. 질문이 "얼마나" 또는 "얼마나 많이"를 중심으로 진행되는 경우 회귀 작업을 처리하고 있는 것입니다. 반면에 우리가 "어떤 범주"에 대해 묻는다면 우리는 분류의 영역으로 모험을 떠나는 것입니다. 달성하려는 작업의 유형을 파악한 후에는 성공을 의미하는 메트릭을 정의하는 것이 중요합니다. 우리의 경우 이러한 메트릭에는 투자 수익률(ROI) 및 정확도가 포함될 수 있습니다. 결국 우리의 궁극적인 목표는 시장에서 이익을 얻는 것이므로 미래의 가격 움직임을 확실히 파악해야 합니다.
미래의 가격 움직임을 효과적으로 예측하려면 방향을 결정하는 것뿐만 아니라 정확한 가격 수준과 도달할 시간을 식별해야 합니다. 그러나 방향을 아는 것만으로는 부족하다. 정확한 가격 수준과 도달 시간이 필요합니다. 목표 가격에 대한 끝없는 대기 기간을 피하기 위해 최소 예상 가격 목표와 최대 대기 기간을 정의할 수 있습니다. 즉, 우리는 가격이 상승, 하락 또는 동일한 수준으로 유지될 수 있는 분류 작업과 유사한 미래 가격 움직임의 방향을 확인하려고 합니다.
방향을 예측할 때 모델의 성능을 초기에 측정하기 위해 분류 정확도를 사용할 수 있습니다. 이 메트릭은 올바른 예측 수를 총 예측 수로 나눈 값을 백분율로 표현하기 위해 100을 곱한 값입니다. 이제 목표주가 수준은? 거래 전략의 경우 수익 수준을 투자 자본의 백분율로 정의할 수 있습니다. 또한 단일 거래에 대한 최대 허용 위험으로 손절매 수준을 설정하여 위험 허용 범위를 결정해야 합니다. 우리의 이익 및 정지 수준은 각 거래에 대한 ROI 값으로 사용됩니다. 예를 들어 100달러에 주식을 사서 105달러에 도달하면 매도한다고 가정해 봅시다. 이 5%의 가격 변동은 5%의 투자 수익을 가져올 것입니다. 이익실현과 손절매를 모두 포함하는 출구 수준을 정의한 상태에서 시간 문제를 해결해야 합니다. 우리는 가격이 원하는 수준에 도달할 때까지 무한정 기다리기를 원하지 않습니다.
따라서 고정된 기간 대신 거래량을 사용하더라도 최대 보유 기간을 설정합니다. 이 선택의 근거는 데이터 준비에 대해 자세히 설명하는 다음 에피소드에서 더 명확해질 것입니다.
지금까지의 접근 방식을 요약하면 다음과 같습니다. 이익실현, 손절매, 포지션 마감을 위한 최대 보유 기간을 사용하는 일중 전략을 개발하고 있습니다. 거래를 시작하기 위해 미래 가격의 방향(위, 아래 또는 평평함)을 예측할 수 있는 분류 모델을 훈련할 것입니다. 처음에는 정확도를 모델의 효율성 측정 기준으로 사용합니다. 이 토대를 마련한 상태에서 오늘의 논의를 마치겠습니다. 우리는 우리의 목표, 대상 및 성능 지표를 정의했습니다. 다음 에피소드에서는 데이터를 자세히 살펴보고 추가 분석 및 개발을 위해 데이터 세트와 레이블을 준비합니다.
This is the first episode of the video series where we will try to create a trading strategy using the data science approach, deep learning models, TensorFlo...
거래 시스템을 만드는 매혹적인 여정의 두 번째 부분에 오신 것을 환영합니다. 이전 비디오에서 우리의 목표에 대해 논의했으며 오늘은 데이터 세트를 준비하고 레이블을 지정하는 데 집중할 것입니다. 그럼 바로 들어가 봅시다!
시작하려면 데이터 세트 준비에 도움이 되는 일련의 함수를 정의했습니다. 가장 먼저 데이터를 로드해야 합니다. 오늘 데모에서는 작은 데이터 세트를 사용하여 코드의 런타임을 관리할 수 있도록 유지하겠습니다. 보시다시피 데이터 세트는 시간, 가격, 볼륨, 입찰 및 매도와 같은 정보를 포함하는 틱 데이터로 구성됩니다. 이 데모의 목적을 위해 저는 1년 동안의 데이터를 활용할 것입니다. 데이터 세트의 특성을 이해하기 위해 몇 가지 통계를 검토하는 것부터 시작하겠습니다. 우리가 관찰한 주요 측면 중 하나는 약 $100를 맴도는 최소 및 최대 가격입니다. 이것은 이익 비율을 쉽게 계산할 수 있기 때문에 유리합니다.
또한 데이터 세트에 중요한 매개변수인 스프레드 크기를 도입했습니다. 스프레드는 Ask와 Bid 가격의 차이로 계산됩니다. 스프레드 크기가 중요한 이유는 무엇입니까? 설명을 위해 Bid 가격이 $100이고 Ask 가격이 $101인 예를 살펴보겠습니다. 이 경우 스프레드는 $1입니다. 우리가 주식을 사고 즉시 매도한다면 우리는 항상 스프레드를 잃게 될 것입니다. 이 예에서는 $1에 해당합니다. 스프레드 크기에 대한 통찰력을 얻기 위해 저는 매 초마다 하루 종일 평균 스프레드를 계산했습니다. 그래프에 표시된 것처럼 스프레드는 일반적으로 1에서 2센트 사이이며 때때로 약간 더 큰 스프레드가 발생합니다. 이 분석을 바탕으로 스프레드가 3센트 미만인 경우에만 거래를 실행하기로 결정할 수 있습니다.
흥미롭게도 그래프는 가장 큰 스프레드가 시장 개장 후 처음 몇 분 동안 발생하는 경향이 있음을 보여줍니다. 결과적으로 일중 전략을 실행할 때 초기 10-15분을 건너뛰는 것이 현명합니다. 이제 기간을 정의하고 스프레드를 조사했으므로 모델에 대한 레이블을 생성하여 가격 이동 방향을 예측할 수 있습니다. 이러한 레이블을 어떻게 생성합니까? 이전 비디오에서 언급했듯이 포지션을 여는 트리거가 없기 때문에 예상 수익을 기반으로 각 막대에 대한 레이블을 생성해야 합니다.
이를 달성하기 위해 가격이 창 장벽을 넘을 때 레이블이 생성되는 창 방법을 사용할 것입니다. 작동 방식은 다음과 같습니다. 길이가 n 바인 창을 정의하고 예상 수익률(%)을 기준으로 상한 및 하한 창 장벽을 설정합니다. 이 창을 막대 하나의 단계 크기로 모든 막대 위로 슬라이드할 때 가격이 창 밖으로 나가면 창의 첫 번째 막대에 레이블이 표시됩니다. 레이블 생성을 진행하기 전에 창에 대한 매개변수를 설정하겠습니다. 기본 아이디어는 간단하지만 최적의 창 크기와 장벽 수준을 선택하는 것은 어려울 수 있습니다. 개인적으로 저는 이 문제와 씨름하는 데 상당한 시간을 보냈지만 아직 결정적인 해결책을 찾지 못했습니다.
이 문제를 해결하기 위해 하루 동안의 과거 변동성과 전체 데이터 세트를 계산할 것입니다. 예를 들어, 제시된 그래프는 해당 변동성과 함께 하루 동안 각 틱의 가격 변동을 보여줍니다. 또한 전체 데이터 세트의 변동성을 평가할 수 있습니다. 표시된 바와 같이 평균 변동성은 현재 가격의 약 30센트에 해당하는 0.003%에 불과합니다. 그러나 하루 종일 창을 사용할 생각은 없습니다. 윈도우 길이를 결정하기 위해 임의의 크기로 100개의 윈도우를 생성하려고 시도했고 각 윈도우 내의 평균 변동성을 평가했습니다. 결과 그래프는 길이가 다른 창의 평균 변동성을 나타냅니다. 예를 들어 창 크기를 50개 막대로 선택하면 약 0.001%의 변동성을 예상할 수 있습니다.
이 변동성 값은 최소 예상 수익을 정의하고 손절 가격의 크기를 계산하는 데 유용합니다. 이 정보를 가지고 틱 데이터에서 볼륨 막대를 생성할 수 있습니다. 눈금 대신 막대를 사용하면 하나의 막대가 일반적으로 비슷한 부피를 포함하므로 안정적인 조건을 보장하므로 창 길이를 더 쉽게 계산할 수 있습니다. 볼륨 막대를 생성하기 위해 틱을 반복하고 사전 정의된 목표 볼륨(예: 1000)을 초과하거나 같을 때까지 볼륨을 누적합니다. 이 누적 단계에서 발생하는 틱은 하나의 볼륨 막대를 나타냅니다. 예를 들어 하루 동안의 볼륨 막대를 생성해 보겠습니다. 그림과 같이 선택한 날짜에 대해 179개의 막대를 얻습니다.
결과적으로 가격 그래프는 이제 이러한 볼륨 막대로 구성됩니다. 또한 종가를 사용하여 각 막대의 백분율 변화와 일일 변동성을 계산할 수 있습니다. 그러나 하루 종일 창을 사용할 생각은 없습니다. 창 길이를 결정하기 위해 전체 데이터 세트에 대해 평균 변동성과 무작위로 생성된 창을 사용했습니다. 결과 그래프는 전체 데이터 세트에 대한 창 변동성을 보여줍니다.
이제 이러한 준비 단계를 완료했으므로 레이블을 생성할 준비가 되었습니다. 이 시연에서는 50바의 창 크기와 평균 가격을 기준으로 약 30센트에 해당하는 0.003%의 기대 수익률을 선택했습니다. 레이블 지정 프로세스가 끝나면 교차 레이블로 알려진 여러 유사한 레이블을 찾을 수 있습니다. 서로 다른 이벤트에 대해 동일한 라벨을 사용하지 않기 위해 창의 첫 번째 막대와 가격이 창 장벽을 교차하는 막대 사이의 가장 가까운 거리에 있는 레이블만 유지합니다. 검사 결과 약 700개의 레이블이 세 가지 범주(위, 아래 및 평면)에 고르게 분포되어 있음을 확인했습니다.
이제 데이터 세트를 저장해 보겠습니다. 우리는 두 개의 파일을 생성할 것입니다. 하나는 볼륨 막대 데이터 세트를 포함하고 다른 하나는 각 막대에 대한 틱 정보를 포함합니다. 후자는 우리 모델에서 유용할 수 있으므로 보존할 가치가 있습니다. 이것으로 오늘의 논의를 잠시 중단하겠습니다. 나는 우리가 충분한 근거를 다루었다고 믿으며, 데이터 라벨링에 대해 더 깊이 탐구하는 데 관심이 있는 사람들을 위해 가치 있는 통찰력을 제공하는 Marcos Lopez de Prado의 책 3장과 4장을 탐색할 것을 권장합니다.
우리의 다음 단계는 기능 엔지니어링과 tfx 파이프라인을 통해 모든 것을 실행하는 것입니다. 조만간 새로운 에피소드를 만들어 더 흥미로운 정보를 공유할 수 있기를 바랍니다.
This is the second episode of the video series where we will try to create a trading strategy using the data science approach, deep learning models, TensorFl...
Denis와 함께 "Close to AlgoTrading"의 또 다른 에피소드에 다시 오신 것을 환영하게 되어 기쁩니다. 우리는 설 연휴 이후 실험을 재개했고 진행이 더디긴 했지만 여전히 전진하고 있습니다. 오늘 동영상에서는 라벨이 지정된 데이터를 자세히 살펴보고 TFX 파이프라인을 살펴보겠습니다. 자, 바로 들어가 봅시다!
이전 비디오에서 우리는 데이터에 대한 레이블을 성공적으로 만들었지만 그래프에 어떻게 표시되는지 보여주는 것을 잊었습니다. 빠른 복습으로 모든 데이터를 새 데이터 프레임에 저장했습니다. 계속해서 이 데이터 프레임을 읽어봅시다.
데이터 프레임 내에서 'dir' 열에는 레이블이 포함되어 있고 'cross_idx' 열은 가격이 정의된 창을 넘을 때의 틱 번호를 나타냅니다. 이러한 열을 기반으로 시작 및 종료 위치 이벤트를 시각적으로 표시하기 위해 간단한 함수를 만들었습니다. 그래프에서 열린 위치 이벤트는 채워진 삼각형으로 표시되고 닫은 위치 이벤트는 채워지지 않은 삼각형으로 표시됩니다.
보시다시피 대부분의 공개 이벤트는 가격 차트의 로컬 최대 또는 최소 지점에서 발생합니다. 앞으로 이전에 사용했던 것과 유사한 작은 데이터 세트로 계속 작업할 것입니다. 또한 데이터 세트를 학습, 평가 및 테스트 데이터 세트로 분할합니다.
이제 레이블을 더 잘 이해했으므로 다음 단계로 이동하여 TFX 파이프라인 작업을 시작하겠습니다. TFX에 익숙하지 않은 사용자를 위해 Tensorflow Extended를 의미하며 확장 가능한 고성능 기계 학습 작업을 위해 특별히 설계된 강력한 프레임워크입니다. TFX 파이프라인은 데이터 수집, 모델링, 학습, 추론 제공, 배포 관리와 같은 기계 학습 워크플로의 다양한 단계를 수행하는 일련의 구성 요소로 구성됩니다.
TFX에 익숙해지려면 구성 요소 및 상호 연결 방법에 대한 자세한 정보를 제공하는 공식 Tensorflow TFX 웹 페이지를 탐색하는 것이 좋습니다. 비디오 설명에서 관련 링크를 찾을 수 있습니다.
저 역시 TFX를 처음 접하기 때문에 각 에피소드에서 함께 학습할 것입니다. 오늘은 파이프라인의 처음 네 가지 구성 요소에 중점을 둘 것입니다. 간단히 소개하자면 다음과 같습니다.
ExampleGen: 파이프라인의 이 초기 입력 구성 요소는 입력 데이터 세트를 수집하고 선택적으로 다른 하위 집합으로 분할합니다. 우리의 경우 사용자 지정 시계열 분할을 직접 지원하지 않으므로 수동으로 데이터를 훈련, 평가 및 테스트 데이터 세트로 분할했습니다.
StatisticsGen: 이 구성 요소는 데이터 세트에 대한 통계를 계산하여 데이터 분포, 표준 편차, 누락된 값 등에 대한 통찰력을 제공합니다. 추가 분석을 위해 통계 아티팩트를 생성합니다.
SchemaGen: 통계를 검토한 후 SchemaGen 구성 요소는 관찰된 데이터 특성을 기반으로 데이터 스키마를 생성합니다. 스키마는 데이터의 구조와 속성을 설명합니다.
ExampleValidator: 이 구성 요소는 통계 및 스키마를 참조로 사용하여 데이터 세트의 이상 및 누락된 값을 확인합니다. 예기치 않거나 일관되지 않은 데이터 패턴을 식별하는 데 도움이 됩니다.
우리가 올바른 길을 가고 있는지 확인하기 위해 Tensorflow 팀이 템플릿으로 제공한 시카고 택시 예제를 사용하겠습니다. 이 예는 데이터 분석, 유효성 검사, 변환, 모델 교육 및 제공을 포함하는 종단 간 워크플로를 보여줍니다.
이제 초점을 다시 자체 데이터로 전환해 보겠습니다. 필요한 모듈을 가져오고 입력 및 출력 데이터 폴더에 필요한 변수를 설정한 후 데이터를 TFX 파이프라인으로 로드할 수 있습니다. 입력 폴더에는 평가, 교육 및 테스트 데이터 세트에 대한 하위 폴더가 포함되어 있습니다.
ExampleGen 구성 요소를 사용하여 데이터를 파이프라인에 쉽게 로드할 수 있어야 합니다. 그러나 ExampleGen은 사용자 지정 시계열 분할을 직접 지원하지 않는 것 같습니다. 기본적으로 데이터를 교육 및 평가 세트로만 분할합니다. 다행스럽게도 데이터를 수동으로 분할하고 자체 입력 분할 구성을 구성하여 입력 분할과 출력 분할 간의 일대일 매핑을 보장할 수 있습니다.
결과적으로 ExampleGen 구성 요소는 두 개의 아티팩트를 생성합니다. 하나는 교육 데이터 세트용이고 다른 하나는 평가 데이터 세트용입니다. 훈련 세트의 처음 세 가지 요소를 검토하여 원래 데이터 세트와 일치하는지 확인합시다. 계속해서 ExampleGen 구성 요소의 출력을 StatisticsGen 구성 요소로 전달합니다. 이 구성 요소는 교육 및 평가 데이터 세트 모두에 대한 통계 아티팩트를 생성합니다. 단 하나의 명령으로 데이터 분포, 표준 편차, 결측값 등 데이터 세트 통계를 시각적으로 나타낼 수 있습니다.
여기에서 학습 데이터 세트에 대한 통계를 관찰하여 데이터 특성에 대한 귀중한 통찰력을 얻을 수 있습니다. 평가 세트에 대해 동일한 통계 세트를 검사할 수도 있습니다. 통계에 따르면 레이블의 2%만이 0이 아닌 것으로 나타났습니다. 이는 수익성 있는 거래에 대한 진입 이벤트가 이상값일 수 있음을 시사합니다. 클래스 간의 불균형으로 인해 향후 문제가 될 수 있습니다.
다음으로 SchemaGen 구성 요소를 사용하여 데이터 스키마를 자동으로 생성합니다. 이 스키마는 관찰된 통계에서 파생되지만 원하는 경우 고유한 데이터 설명을 정의할 수도 있습니다. 출력은 데이터 구조 및 속성에 대한 포괄적인 설명을 제공하는 스키마입니다. 마지막으로 생성된 통계 및 스키마를 기반으로 데이터의 유효성을 검사하는 ExampleValidator 구성 요소에 도달합니다. 데이터 세트의 이상 또는 불일치를 확인합니다. 예를 들어 시카고 택시의 예에서 '_company' 기능에 예기치 않은 문자열 값이 있습니다. ExampleValidator를 사용하여 자체 데이터 세트에서 이러한 문제를 감지할 수 있습니다.
우리의 경우 다행스럽게도 데이터 세트에서 이상이나 불일치가 발생하지 않습니다. 이는 데이터가 비교적 깨끗하고 기대치와 일치함을 나타내는 긍정적인 신호입니다. 이것으로 TFX에 대한 간략한 소개를 마치겠습니다. 다음 에피소드에서는 나머지 TFX 구성요소에 대해 자세히 알아보고 데이터를 변환하고 모델을 학습시키는 방법을 살펴보겠습니다.
This is the third part of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to review our generated l...
"Close to Algotrading"의 또 다른 에피소드에 오신 것을 환영합니다. 저는 Denis입니다. 오늘 우리는 거래 전략 구축의 일환으로 TFX 파이프라인을 계속 탐색할 것입니다.
이전 비디오에서는 TFX 파이프라인의 처음 네 가지 구성 요소인 ExampleGen, StatisticsGen, SchemaGen 및 ExampleValidator에 대해 다루었습니다. 이러한 구성 요소는 파이프라인의 기반을 마련하여 데이터 유효성 검사 및 일관성을 보장합니다.
이제 나머지 구성 요소인 Transformer, Trainer, Evaluator, ModelValidator 및 Pusher에 대해 살펴보겠습니다. 이러한 구성 요소를 사용하면 데이터를 변환하고, 모델을 교육하고, 성능을 평가하고, 기준에 대해 모델을 검증하고, 마지막으로 검증된 모델을 프로덕션 환경으로 푸시할 수 있습니다.
하지만 진행하기 전에 몇 가지 중요한 사항을 말씀드리겠습니다. TFX 파이프라인은 강력한 프레임워크를 제공하지만 여전히 일부 버그가 있을 수 있고 특정 구성 요소가 구축 중일 수 있다는 점에 유의할 가치가 있습니다. 그러나 각 단계에 신중하게 접근하고 그 과정에서 제한 사항에 대해 논의해 봅시다. 이전 비디오에서 데이터를 성공적으로 검증했으며 이제 변환 단계로 넘어갈 차례입니다. 이를 위해 TFX에서 제공하는 Transformer 구성 요소를 사용합니다.
Transform 구성요소는 교육과 제공 모두에 대해 일관된 데이터 변환 및 기능 엔지니어링을 수행하는 역할을 합니다. 즉, 모델 교육과 프로덕션에서 사용하는 데 동일한 데이터 변환 기능을 사용할 수 있습니다. 이 기능은 처음에 TFX를 탐색하기 시작한 주된 이유 중 하나입니다.
변환 프로세스를 시작하려면 두 개의 Python 파일을 만들어야 합니다. 첫 번째 파일에는 숫자 기능 및 레이블 목록과 같은 상수가 포함됩니다. 두 번째 파일에는 입력 데이터를 전처리하기 위해 tf.Transform에서 사용하는 콜백 함수인 전처리 함수(preprocessing_fn)가 포함됩니다. 이 함수에서는 데이터 변환 및 기능 구성 단계를 정의합니다. 지금은 모든 숫자 입력 기능을 z 점수로 변환하고 레이블 값을 -1, 0, 1에서 각각 0, 1, 2로 변경하는 데 집중하겠습니다. TensorFlow 추정기가 양수 값을 예상하기 때문에 이 레이블 변환이 필요합니다.
TFX의 현재 버전에서는 TensorFlow 에스티메이터만 지원된다는 점에 유의해야 합니다. Keras 모델을 사용하려면 model_to_estimator API를 사용하여 추정기로 변환해야 합니다. TFX 버전 0.21은 Trainer 구성 요소에 대한 Keras 모델을 지원한다고 주장하지만 대화형 컨텍스트 기능에 몇 가지 문제가 발생했습니다. TFX 팀이 곧 이러한 문제를 해결하고 안정적이고 완벽하게 작동하는 도구를 제공할 수 있기를 바랍니다.
이제 데이터 변환을 진행해 보겠습니다. 보시다시피 Transform 구성 요소는 생성된 예제, 데이터 스키마 및 preprocessing_fn 함수를 포함하는 파일 경로와 같은 매개 변수를 입력으로 예상합니다. 변환이 완료되면 모델 생성 및 학습으로 이동할 수 있습니다. Trainer 구성 요소는 우리가 정의한 사양에 따라 모델 교육을 담당합니다.
모델 및 입력 함수가 포함된 Python 파일에서 Trainer 구성 요소에서 호출할 trainer_fn 함수를 정의합니다. 이 함수는 다음 항목이 포함된 사전을 반환해야 합니다.
estimator: 모델 학습에 사용되는 TensorFlow estimator입니다.
train_spec: TensorFlow train_and_evaluate() 호출의 학습 부분에 대한 구성입니다.
eval_spec: TensorFlow train_and_evaluate() 호출의 평가 부분에 대한 구성입니다.
eval_input_receiver_fn: 모델 유효성 검사 시 ModelValidator 구성 요소에서 사용하는 구성입니다.
이 파일 내에서 교육 및 평가를 위한 입력 기능과 레이블을 생성하는 _input_fn 함수를 정의합니다. 제공 입력을 빌드하는 _example_serving_receiver_fn 및 TFMA(TensorFlow Model Analysis)에 필요한 입력을 준비하는 _eval_input_receiver_fn과 같은 추가 기능도 있습니다.
추정기를 생성하기 위해 build_estimator 함수를 정의합니다. 이 함수에서는 입력 기능 세트를 설정하고 추정기를 생성합니다. DNNClassifier와 DNNEstimator가 TensorFlow 1에서 기능 전달과 관련된 오류를 일으켰기 때문에 DNNLinearCombinedEstimator를 사용했다는 점을 언급할 가치가 있습니다. 저는 TensorFlow 2 방법을 사용하고 있기 때문에 이것이 사실이 아니라고 생각합니다. 안타깝게도 이 문제에 대한 해결책을 찾지 못했습니다. 그러나 선형 추정기는 잘 작동하는 것 같습니다.
이제 모델이 정의되었으므로 Trainer 구성 요소를 사용하여 교육을 진행할 수 있습니다. 보시다시피 Trainer 구성 요소는 transformer_examples, 데이터 스키마, 변환 그래프, 교육 및 평가 인수와 같은 다른 매개 변수와 함께 trainer_fn 함수를 포함하는 module_file을 예상합니다. 지금은 교육 및 평가를 위한 단계 수만 지정했습니다. 모델 학습이 완료되면 TFMA(TensorFlow Model Analysis)를 사용한 모델 분석으로 넘어갈 수 있습니다. 진행하기 전에 제공된 링크를 따라 TFMA를 설치했는지 확인하십시오. TFMA를 사용하면 전체 데이터 세트 또는 특정 기능 슬라이스에서 모델에 대한 분석을 수행할 수 있습니다. 이 경우 전체 데이터 세트, 레이블 및 두 가지 특정 기능의 세 가지 슬라이스에 대한 분석을 수행합니다.
전체 데이터 세트를 분석한 결과 98%의 놀라운 정확도를 관찰했습니다. 그러나 레이블을 기반으로 모델의 성능을 검사할 때 지속적으로 레이블 0을 예측한다는 것을 알 수 있습니다. 이 결과는 레이블의 균형이 맞지 않고 모델에 유용한 기능이 없기 때문에 예상된 것입니다. 그럼에도 불구하고 TFMA는 모델의 성능을 평가하는 편리한 방법을 제공합니다.
앞으로 내보낸 모델의 유효성을 검사하는 데 도움이 되는 ModelValidator 구성 요소가 있습니다. 새 모델을 기준(예: 현재 서비스 중인 모델)과 비교하고 미리 정의된 기준을 충족하는지 확인합니다. 이 유효성 검사에는 평가 데이터 세트에 대한 모델 평가와 AUC 및 손실과 같은 메트릭 계산이 포함됩니다. 새 모델의 메트릭이 기준선과 관련하여 개발자가 지정한 기준을 충족하는 경우 모델은 "충분히 양호"한 것으로 간주되고 표시됩니다.
마지막으로 모델이 유효성 검사를 통과했는지 확인하는 Pusher 구성 요소가 있습니다. 모델이 유효성 검사 기준을 충족하면 지정된 파일 대상으로 푸시됩니다. 이 단계에서는 검증된 모델만 프로덕션 환경에 배포되도록 합니다.
파이프라인을 마무리하기 위해 모든 구성 요소를 Apache Beam 파이프라인으로 내보낼 수 있습니다. 그런 다음 필요한 모든 파일을 zip 아카이브로 패키징할 수 있습니다. 아카이브에서 서버의 작업 디렉토리로 파일의 압축을 풀면 파이프라인을 실행할 수 있습니다. 실행이 완료되면 TensorFlow Serving과 함께 사용할 수 있는 훈련된 모델이 준비됩니다. Docker 컨테이너에서 TensorFlow Serving을 시작하고 사용하는 방법에 관심이 있다면 제 채널에서 비디오 자습서를 찾을 수 있습니다.
이 시리즈에서 많은 부분을 다루었지만 TFX의 현재 버전에는 여전히 특정 제한 사항이 있다는 점에 유의해야 합니다. 특정 요구 사항에 따라 Keras 모델을 사용하여 변환 기능에만 의존하는 파이프라인을 구현해야 할 수도 있습니다. 그러나 TFX에 대한 이러한 탐색이 유익하고 유익한 정보가 되었기를 바랍니다.
다음 비디오에서는 거래 전략 개발이라는 주요 목표로 돌아갈 것입니다. 계속 지켜봐주세요! 이 비디오에 댓글, 구독 및 좋아요를 누르는 것을 잊지 마세요. 시청해주셔서 감사하고, 다음 영상에서 만나요!
This is the part IV of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to diving deeper into the TF...
"Close to Algotrading"의 또 다른 에피소드에 오신 것을 환영합니다. 제 이름은 Denis입니다. 딥 러닝 거래 시스템 개발에 대한 제 경험과 실패를 공유하기 위해 이 자리에 섰습니다.
TensorFlow를 사용하여 전체 시스템을 구현하는 데 상당한 시간을 할애했지만 라이브러리의 품질에 상당히 실망했음을 인정해야 합니다. 개념에 감사하지만 TensorFlow에서 제공하는 문서는 좌절의 원인이었습니다. 박사 학위를 가진 명석한 사람들도 잘 구성된 문서를 작성하는 데 어려움을 겪는 것 같습니다. 과거에 비해 개선됐지만 여러 부분에서 여전히 혼란스럽다.
그러나 설명서는 내가 만난 더 큰 문제에 비해 사소한 문제입니다. 많은 기능이 사용하려고 할 때 예상대로 작동하지 않으며 공식 예제도 제대로 작동하지 않는 경우가 있습니다. 이로 인해 이 프레임워크의 일부 핵심 사항을 놓친 것은 아닌지 의문이 들었습니다. 하지만 이 비디오의 주요 주제인 나의 실패로 돌아가 봅시다. 기억하시겠지만 저는 지정된 백분율을 기준으로 가격 변동에 대한 레이블을 생성하기로 결정했습니다. 이러한 레이블의 대부분은 데이터에서 로컬 최소값 또는 최대값으로 판명되었습니다.
몇 가지 간단한 데이터 처리 및 준비를 수행한 후 간단한 LSTM 네트워크를 만들어 테스트했습니다. 내 기대는 그다지 높지 않았지만 결과는 정말 실망스러웠습니다. 함께 제공되는 시각적 개체에서 볼 수 있듯이 네트워크는 의미 있는 학습에 실패했습니다.
이제 신경망이 기적을 행하기 위한 것이 아님을 기억하는 것이 중요합니다. 아마도 우리의 접근 방식을 재평가해야 할 때일 것입니다. 예측하려는 이벤트는 전체 데이터 세트의 2%만 나타냅니다. 이러한 이벤트는 이상치로 간주될 수 있으며 우리의 단순 네트워크는 이를 나머지 데이터와 구별하기 위해 고군분투합니다. 또한 이러한 이벤트는 관련이 없고 뚜렷한 원인이 있을 가능성이 높아 이를 정확하게 예측하는 모델을 구축하기 어렵습니다.
이러한 과제를 감안할 때 데이터를 더 잘 이해하고 예측력으로 기능을 식별하는 데 집중해야 한다는 것이 분명해졌습니다. 이를 염두에 두고 간단한 이동 평균 전략을 다시 검토하기로 결정했습니다. 우리의 초기 접근 방식에서는 왜 우리가 입장을 취해야 하는지에 대한 명확한 이해가 부족했습니다. 그러나 이제 포지션을 여는 전략이 생겼습니다. 완벽하지는 않지만 우리가 활용할 수 있는 널리 사용되는 전략입니다. 두 개의 이동 평균과 RSI(Relative Strength Index) 표시기를 데이터 세트에 추가하고 이동 평균이 서로 교차하는 모든 이벤트를 수집했습니다. 이를 통해 가격 이동 방향을 추정할 수 있었습니다.
다음으로 이전과 동일한 라벨링 방법을 사용하여 메타 라벨을 만들었지만 이번에는 이동 평균이 서로 교차하는 막대에만 라벨을 지정했습니다. 여기서 중요한 차이점이 있습니다. 위치 방향(길거나 짧음)을 이미 알고 있기 때문에 레이블의 의미가 달라집니다. 1 레이블은 이익을 나타내고 -1은 손실을 나타내며 255는 다른 경우에 할당됩니다. 업데이트된 데이터 세트와 레이블을 사용하여 간단한 LSTM 모델을 교육하고 완벽한 ROC(Receiver Operating Characteristic) 곡선을 얻었습니다. ROC 곡선은 다양한 분류 임계값에서 분류 모델의 성능을 보여줍니다. ROC 곡선의 AUC(Area Under the Curve) 값은 모델이 클래스를 얼마나 잘 구별하는지 평가하는 데 도움이 됩니다.
그러나 모델의 예측을 검토했을 때 일관되게 클래스 0을 예측하는 것을 확인했습니다. 이 결과는 다시 한 번 관련 이벤트만 사용하는 대신 전체 데이터 세트를 사용했기 때문에 발생했습니다. 우리의 데이터 세트는 불균형 상태로 남아 있었고 기능에는 예측 능력이 부족했습니다. ROC 곡선은 다른 클래스를 예측할 때 모델의 성능 저하를 가릴 수 있으므로 불균형 데이터 세트에 적합하지 않습니다.
데이터의 불균형을 해결하기 위해 조정을 했고 공개 이벤트와 관련된 데이터에만 집중했습니다. 불행히도 이러한 수정 후에도 내 모델은 예측력을 발휘하지 못했습니다. 무작위 모델과 동일한 결과를 생성했습니다. 또한 간단한 피드포워드 모델을 시도했는데 약간 더 나은 결과를 보여주었지만 여전히 만족스럽지 못했습니다. 결론적으로 볼 수 있듯이 모델에 품질이 좋지 않은 데이터를 공급하면 딥 러닝에 마법이 없습니다. "Garbage in, garbage out"의 원칙은 이러한 맥락에서 유효합니다. 또한 고도로 불균형한 데이터셋과 강력한 예측력을 가진 기능이 부족한 데이터셋을 처리할 때 분류 모델은 데이터셋의 대부분을 구성하는 클래스를 예측하는 경향이 있습니다.
앞서 언급했듯이 데이터를 이해하고 시장을 이길 수 있는 방법을 찾는 데 도움이 되는 프로세스를 식별하는 것이 중요합니다.
이것으로 오늘의 에피소드를 마칩니다. 통찰력 있고 유익한 정보를 얻으셨기를 바랍니다. 조심하고 집에 머물며 건강을 유지하십시오.
This is the part V of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to have a look at my fails. W...
저는 Denis입니다. "Close to Alga Trading"의 또 다른 에피소드에 오신 것을 환영합니다. 이전 에피소드에서 우리는 딥 러닝을 사용하여 수익성 있는 거래 전략을 구축하기 위해 노력했습니다. 지금까지의 진행 상황을 요약해 보겠습니다.
우리는 비효율성을 찾기 위해 시장 상황을 관찰하는 것으로 시작했습니다. 일단 식별되면 간단한 규칙을 만들고 딥 러닝 모델을 위한 데이터를 준비했습니다. 그러나 직접 접근 방식을 구현했을 때 원하는 결과를 얻지 못했다는 사실을 발견했습니다. 이를 통해 접근 방식을 재고하고 대안 전략을 고려해야 한다는 사실을 깨닫게 되었습니다.
오늘 에피소드에서는 강화 학습이라는 새로운 방향을 살펴보겠습니다. 강화 학습은 체스, 도타, 바둑과 같은 게임에서 인간의 성능을 능가하는 다양한 영역에서 상당한 성공을 거두었습니다. 제어 로봇과 자율주행차에도 활용된다. 그렇다면 거래에 적용하지 않겠습니까? 그 성공을 보장할 수는 없지만 탐색해 볼 수 있는 흥미로운 방법입니다.
시작하려면 강화 학습에 대한 간략한 소개를 살펴보고 주요 정의에 익숙해지도록 합시다.
강화 학습은 최적의 제어 문제를 해결하기 위해 시행 착오를 통해 학습하는 것으로 설명할 수 있습니다. 간단히 말해서 최종 수치 보상을 최대화하기 위해 주어진 환경 상태에서 취할 최선의 조치를 찾는 것입니다. 이 개념을 더 잘 이해하기 위해 간단한 비유로 시각화해 봅시다.
트레이더가 모니터 앞에 앉아 주식을 사고팔고 있다고 상상해 보십시오. 여기서 트레이더는 에이전트를 나타내고 차트 가격과 브로커는 환경을 형성합니다. 에이전트는 환경의 현재 상태를 관찰하고 주식 구매와 같은 조치를 취합니다. 그 대가로 에이전트는 브로커 수수료가 될 수 있는 보상을 받습니다. 환경이 바뀌면 에이전트는 더 많은 주식을 사거나 팔거나 아무것도 하지 않을 수 있습니다. 거래일 종료 시 에이전트는 긍정적이거나 부정적인 최종 보상을 받습니다. 에이전트의 목표는 이 최종 보상을 최대화하는 것입니다.
강화 학습에서 우리의 목표는 환경과 상호 작용하여 학습할 수 있는 에이전트를 설계하는 것입니다. 이제 여정 내내 접하게 될 주요 정의에 익숙해지도록 합시다.
에이전트: 결정을 내리고, 작업을 수행하고, 환경을 관찰하고, 피드백을 받고, 보상을 최대화하는 것을 목표로 하는 알고리즘입니다.
환경: 에이전트가 거주하는 세계입니다. 에이전트가 결정을 내리는 데 사용할 수 있는 모든 데이터를 포함합니다.
상태: 에이전트가 감지하는 환경의 구성입니다.
보상: 조치를 취한 후 에이전트가 받는 피드백입니다. 에이전트가 최대화하려는 값입니다. 중요한 것은 강화 학습에서 보상이 반드시 돈이나 물리적 트로피를 의미하지는 않는다는 것입니다. 단순히 음수일 수도 있는 숫자 값이며 우리의 목표는 이 값을 최대화하는 것입니다.
조치: 주어진 환경에서 에이전트가 수행할 수 있는 모든 것. 간단히 하기 위해 구매, 판매 또는 아무것도 하지 않는 세 가지 작업을 고려해 보겠습니다.
에피소드: 전체 작업의 완전한 실행.
이것은 우리가 여행 내내 사용할 주요 정의입니다. 향후 비디오에서 다룰 중요한 추가 용어가 있습니다.
이번 강화학습 입문과 함께 환경에 대해 알아보고 다음 영상에서 TensorFlow를 사용하여 우리만의 환경을 만들어 보도록 하겠습니다.
오늘 저와 함께 해주셔서 감사합니다. 여러분과 함께 강화 학습을 더 탐구할 수 있기를 기대합니다. 곧 봐요!
This is the part VI of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to have a look at the main d...
나는 Denis이고 당신은 "Close to AlgoTrading"을 보고 있습니다. 지난 에피소드에서는 강화 학습에 대한 간략한 소개를 제공했습니다. 오늘은 에이전트를 위한 간단한 거래 환경을 만드는 방법에 대해 알아보겠습니다. 자세한 내용을 살펴보겠습니다.
먼저 거래 환경이 무엇을 나타내는지 고려해야 합니다. 가격 데이터만을 기반으로 합니까, 아니면 전체 주문서, 뉴스 또는 Twitter의 소문과 같은 추가 요소를 통합해야 합니까? 이 결정은 우리 환경의 복잡성을 형성할 것입니다.
다음으로 에이전트가 수행할 수 있는 작업을 결정해야 합니다. "매수" 및 "매도" 작업으로 제한해야 합니까, 아니면 특정 단계를 건너뛸 수 있습니까? 행동 공간을 정의하는 것은 에이전트의 의사 결정 프로세스에 매우 중요합니다.
이제 대상과 보상을 정의하는 방법에 대해 논의하겠습니다. 현실 세계에서 거래 환경에는 연속적인 상태 공간이 있습니다. 그러나 단순화를 위해 내부 작업 및 구현을 이해할 수 있도록 환경을 가능한 한 간단하게 유지하겠습니다.
시작하려면 실제 가격 데이터를 사용하는 대신 20개의 값으로 구성된 랜덤 워크 프로세스를 생성합니다. 이 시뮬레이션 일일 가격은 우리의 입력으로 사용됩니다. 에피소드는 이 가격 시퀀스의 중간부터 시작됩니다. 즉, 초기 상태에는 10개의 과거 가격이 포함됩니다. 나머지 보이지 않는 가격은 0으로 채워집니다. 각 단계마다 새로운 가격이 어레이에 추가됩니다. 에이전트가 20개의 가격을 모두 볼 수 있게 되면 에피소드가 종료됩니다. 따라서 에피소드 완결까지 총 10단계가 남았습니다.
가격 데이터 외에도 상태에는 오픈 포지션에 대한 정보가 포함됩니다. 오픈 포지션이 없는 경우 [0,0], 롱 포지션인 경우 [1,0], 숏 포지션인 경우 [0,1]과 같이 원-핫 인코딩을 사용하여 포지션을 표현해 보겠습니다.
일반적인 거래 행위를 고려하여 열려 있는 포지션이 없는 경우 "매수" 및 "매도"를 포함합니다. 그러나 이미 열려 있는 직책이 있는 경우 에이전트는 직책을 건너뛰거나 닫는 것만 선택할 수 있습니다. 따라서 이 시나리오에서 "매도" 또는 "매수" 작업은 "건너뛰기"와 동일합니다.
에이전트의 목표는 10일 동안 손익(PnL)을 최대화하는 것입니다. 따라서 보상을 일일 PnL로 정의합니다.
환경의 구조와 동작을 명확하게 이해했으므로 이제 구현 단계로 진행할 수 있습니다. 앞에서 언급했듯이 TensorFlow(tf-agent) 프레임워크를 활용할 것입니다. tf-agent 팀은 tf-agent에 적합한 환경 개발에 대한 포괄적인 가이드를 제공했으며, 코드를 더 깊이 이해하려면 확인하는 것이 좋습니다.
환경을 만들기 위해 모든 Python 환경이 구현해야 하는 인터페이스를 정의하는 PyEnvironment 클래스를 상속하는 것으로 시작합니다. Init 함수 내에서 변수를 초기화하고 초기 상태를 설정하며 가장 중요한 작업 및 관찰 사양을 지정합니다. 우리의 경우 행동 공간은 최소값과 최대값이 각각 0과 3으로 설정된 4개의 다른 행동으로 구성됩니다. 관찰 사양은 가격이 0에서 시작하고 최대 한도가 없는 환경 상태를 설명합니다. 가격의 데이터 유형은 유동적입니다. 동작 및 관찰 사양을 반환하는 것은 tf-agent와의 원활한 통합을 위해 매우 중요합니다.
구현해야 할 다음 중요한 기능은 재설정입니다. 이 기능은 환경을 초기 상태로 재설정합니다. 이 기능의 올바른 구현을 보장하는 것은 환경의 적절한 기능을 위해 매우 중요합니다.
이제 가장 중요한 기능인 단계에 대해 논의해 보겠습니다. 단계 기능은 입력 매개변수로 작업을 수신하고 환경의 상태 전환 관리를 담당합니다. 이 함수에서는 가능한 모든 조치를 처리하고 PnL(보상)을 계산합니다. 이 함수는 관찰(에이전트가 다음 단계에서 행동을 선택하기 위해 관찰할 수 있는 환경 상태의 일부), 보상(에이전트의 학습 목표), 단계 유형(이 시간 단계가 시퀀스의 첫 번째, 중간 또는 마지막) 및 할인.
단계 함수에는 두 가지 반환 시나리오가 있습니다. 하나는 중간 단계에 대한 것이고 다른 하나는 에피소드의 마지막 단계에 대한 것입니다.
환경을 만든 후에는 버그를 식별하고 수정하기 위해 유효성을 검사하는 것이 중요합니다. util 패키지는 이러한 목적으로 사용할 수 있는 validate_py_environment라는 함수를 제공합니다. 또한 환경 사양을 확인하면 모든 것이 예상대로 작동하는지 확인하는 데 도움이 됩니다.
사용할 준비가 된 환경에서는 동작을 디버깅하고 유효성을 검사하기 위해 다양한 작업으로 테스트하는 것이 좋습니다.
간단한 DQN tf-agent를 사용하여 몇 가지 테스트를 수행했으며 결과는 다음과 같습니다. 20,000보 후 에이전트는 허용 가능한 성능을 보여주었습니다. 그러나 에이전트가 배울 수 있는 시계열은 하나뿐이므로 비교적 간단합니다. 두 번째 시계열을 도입하고 20,000단계를 실행하면 결과가 유망하지 않을 수 있습니다. 그러나 약 100,000걸음으로 에이전트의 성능이 크게 향상되었습니다.
This is the part VII of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to have a look at the tradi...
안녕하세요, 제 이름은 Denis이고 "Close to AlgoTrading"을 보고 계십니다. 이 비디오에서는 강화 학습 에이전트에 대한 이전 환경에 대한 간략한 업데이트를 제공합니다. Q-Learning 및 DQN 에이전트에 대한 간략한 설명도 제공합니다. 그런 다음 tf-agents 라이브러리에서 rDQN 에이전트에 대한 기본 학습 단계를 구현하고 테스트 결과에 대해 논의합니다.
시작하려면 이전 비디오에서 만든 거래 환경을 다시 살펴보겠습니다. 그 환경에서 우리는 합성 생성 데이터를 사용했습니다. 그러나 이 업데이트된 버전에서 우리 환경은 기록 데이터가 입력 매개변수로 포함된 데이터 프레임을 수신합니다. 환경에 대한 관찰_사양은 "Price"와 "Pos"라는 두 개의 키가 있는 사전입니다. "가격" 키에는 시가, 종가, 고가, 저가 및 볼륨 데이터가 포함된 20개의 요소가 포함되어 있습니다. "Pos" 키에는 오픈 포지션에 대한 정보가 포함되어 있습니다.
각 에피소드가 시작될 때 데이터에서 20개의 가격 조각을 무작위로 선택합니다. 이 변경을 통해 강화 학습 에이전트는 실제 과거 데이터에서 학습할 수 있습니다.
계속해서 Q-Learning과 Q-Table의 개념에 대해 논의해 봅시다. Q-Learning은 (상태, 행동)의 모든 쌍에 Q-값을 할당하는 것을 포함합니다. Q-테이블로 알려진 이 테이블은 에이전트가 현재 상태에서 최대 Q-값을 가진 작업을 선택하는 데 사용됩니다. 에이전트는 환경을 탐색하고, 보상을 받고, 관찰된 보상을 기반으로 Q-값을 업데이트합니다.
Q-값을 업데이트하기 위해 이전 Q-값과 미래 Q-값을 포함하는 공식을 사용합니다. Q-Table에서 다음 상태에 대한 최대 Q-값을 찾아 미래 Q-값을 계산합니다. 획득한 미래 Q-값으로 시작 쌍(상태, 동작)과 관련된 Q-값을 업데이트합니다.
그러나 우리의 경우 금융 시장은 상태 공간이 매우 넓어 Q-Table을 사용하는 것이 비실용적입니다. 이 문제를 극복하기 위해 심층 신경망을 사용하여 주어진 상태에 대한 Q 값을 예측할 수 있습니다. DQN 에이전트(Deep Q-Network 에이전트)로 알려진 이 접근 방식은 Q-값이 역전파를 통해 손실을 최소화하여 업데이트되는 Q-네트워크를 사용합니다. DQN 에이전트에서 사용되는 손실함수는 특정 방정식으로 주어진다.
이제 Q-Learning과 DQN 에이전트를 잘 이해했으므로 tf-agents 라이브러리를 사용하여 rDQN 에이전트에 대한 기본 학습 단계를 구현해 보겠습니다.
전체 학습 알고리즘은 다음 단계를 따릅니다.
환경을 만듭니다.
에이전트를 생성합니다.
일부 정책을 사용하여 환경에서 데이터를 수집합니다.
수집된 데이터를 사용하여 에이전트를 훈련시킵니다.
에이전트의 성능을 확인합니다.
3단계부터 반복합니다.
환경을 만드는 것은 간단한 작업입니다. 거래 환경을 TFPyEnvironment로 래핑하여 tf-agent와 원활하게 통합할 수 있습니다.
다음으로 DQN 에이전트를 위한 Q-Network를 생성합니다. tf-agents 라이브러리는 Q-network를 정의하는 데 사용할 수 있는 Q-Network 클래스를 제공합니다. 우리는 40개의 뉴런으로 구성된 하나의 숨겨진 완전 연결 레이어로 간단한 Q-네트워크를 정의합니다. 우리의 관찰은 사전이므로 간단한 전처리 계층도 정의합니다.
Q-Network가 생성되면 DQN 에이전트 생성을 진행합니다. Q-network를 매개변수로 전달하여 tf_agents.agents.dqn.dqn_agent 클래스를 인스턴스화합니다. 또한 모델 훈련을 위한 옵티마이저와 손실 함수를 정의합니다.
에이전트를 교육하려면 환경의 데이터가 필요합니다. 정책을 사용하여 이 데이터를 수집하고 이 단계에서는 작업을 무작위로 선택할 수 있습니다. DQN 에이전트에는 평가 및 배포에 사용되는 agent.policy와 데이터 수집에 사용되는 agent.collect_policy의 두 가지 정책이 있습니다.
데이터 수집에는 현재 상태를 취하고, 작업을 선택하고, 다음 상태 및 보상을 받고, 이 정보를 버퍼에 저장하는 작업이 포함됩니다. 여러 단계 또는 에피소드를 수집하여 궤적을 형성합니다. tf-agents 라이브러리는 에피소드가 끝날 때까지 단계를 수집하는 DynamicEpisodeDriver라는 드라이버를 제공합니다. 드라이버는 회신 버퍼를 포함하여 관찰자를 업데이트합니다.
데이터를 저장하기 위해 tf-agents 라이브러리에서 일반적으로 사용되는 TFUniformReplayBuffer를 사용할 수 있습니다. 버퍼가 저장할 데이터 요소의 사양, 배치 크기 및 각 배치 세그먼트의 최대 길이를 정의합니다.
데이터 수집 단계가 완료되면 에이전트를 교육할 수 있습니다. 에이전트는 재생 버퍼에 액세스해야 합니다. 에이전트에 데이터를 공급하기 위해 tf.data.Dataset 파이프라인을 생성합니다. 재생 버퍼의 각 행은 단일 궤적을 저장하지만 DQN 에이전트는 손실을 계산하기 위해 현재 관찰과 다음 관찰이 모두 필요합니다. 따라서 num_steps 매개변수를 2로 설정하여 데이터 세트 파이프라인이 배치의 각 항목에 대해 두 행을 샘플링할 수 있도록 합니다.
이 시점에서 우리는 동일한 데이터에 대해 두 명의 DQN 에이전트를 교육하고 성능을 평가할 수 있는 모든 것을 갖추고 있습니다. 한 에이전트는 간단한 Q-Network를 사용하고 다른 에이전트는 QRNNNetwork를 사용합니다. 두 에이전트는 200일 간의 과거 가격 데이터를 사용하여 훈련됩니다.
700개의 훈련 단계 후에 우리는 단순한 Q-Network 에이전트가 많이 배우지 않았고 대부분 음의 평균 수익을 보인다는 것을 관찰했습니다. 그러나 QRNNNetwork 에이전트는 대부분 양의 평균 수익률을 나타냅니다. 이 결과는 RNN 에이전트가 데이터의 일부 역학을 캡처하고 더 빨리 학습할 수 있으므로 기대와 일치합니다.
이 간단한 실험은 수익성 있는 에이전트를 구축하는 데 강화 학습을 사용할 수 있는 희망을 제공하지만 에이전트의 성능을 평가하기 위해 고려해야 할 다른 메트릭이 여전히 있습니다. 향후 비디오에서 이에 대해 살펴보겠습니다.
This is the part VIII of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to explore the training st...
우리의 여정에서 전략 테스트라는 중요한 이정표에 도달했음을 발표하게 되어 기쁩니다. 이를 위해 간단한 백테스팅 Python 프레임워크를 활용하여 테스트를 수행합니다. 시작하려면 "pip install" 명령과 프레임워크 이름을 실행하여 프레임워크를 설치할 수 있습니다.
프레임워크 작성자는 이를 효과적으로 사용하는 방법을 보여주는 간단한 예제를 제공했습니다. 그러나 이에 뛰어들기 전에 자체 전략을 구현해야 합니다. 전략에 필요한 모든 변수를 초기화하고 정의하는 것으로 시작하겠습니다.
한 가지 흥미로운 측면은 TensorFlow API를 사용하여 저장된 정책을 로드할 수 있다는 것입니다. QRNNNetwork를 사용하고 있으므로 정책의 초기 상태를 가져와야 합니다. 결과적으로 초기화 기능을 구현했습니다. 이제 모든 새 단계에서 호출되는 "다음" 함수를 구현할 차례입니다. 처음에는 처음 10일 동안 데이터를 수집해야 하며 그 후에 관찰 사전을 공급할 수 있습니다. 각 단계에서 관찰을 업데이트하고 정책에 전달합니다.
관찰 사전을 만든 후에는 정책 모델에서 입력으로 필요하므로 시간 단계 개체를 만들어야 합니다. 이 프로세스를 용이하게 하기 위해 관찰 데이터를 시간 단계 개체로 변환하는 간단한 함수를 만들었습니다. 여기서 중요한 요소는 관찰 데이터와 step_type입니다. timestep 개체를 얻은 후 정책에서 작업을 검색할 수 있습니다. 보시다시피 "runPolicy" 함수는 step_type이 0이면 정책 상태를 재설정하고 작업과 새 policy_state를 반환합니다.
다음으로 위치 상태를 업데이트하고 작업을 실행해야 합니다. 마지막으로 "다음" 기능의 끝에서 카운터를 증가시키고 모든 것을 초기 상태로 재설정하여 새 에피소드의 시작을 시뮬레이션합니다. 엄청난! 우리는 전략을 성공적으로 구현했습니다. 이제 테스트 목적으로 데이터가 필요합니다. panda_datareader 라이브러리를 사용하여 Yahoo Finance에서 일일 데이터를 검색할 수 있습니다. 1년 간의 과거 데이터를 사용하여 인텔 주식에 대한 전략을 테스트하는 것부터 시작하겠습니다.
백 테스트 개체를 만들고 테스트를 시작합니다. 테스트 결과 106%의 수익률을 보여주어 인상적입니다. 그러나 백테스팅 프레임워크는 100%부터 계산을 시작한다는 점에 유의해야 합니다. 즉, 실제 수익은 6%에 불과합니다. 그럼에도 불구하고 우리 정책이 광범위하게 훈련되지 않았다는 점을 고려하면 나쁘지 않은 결과입니다. 보다 포괄적인 평가를 제공하기 위해 AMD 주식에 대한 전략도 테스트해 보겠습니다. 보시다시피 AMD의 결과는 약 40%의 감소를 보여줍니다. 따라서 우리는 AMD와 Intel 주식에 대한 우리 전략의 성과를 나란히 비교할 수 있습니다.
이제 백테스팅 프레임워크와 함께 에이전트 정책을 사용하는 방법을 알게 되었습니다. 마찬가지로 실제 거래 환경에 Python을 사용하는 경우 동일한 방식으로 정책을 사용할 수 있습니다. 그러나 다른 언어를 사용하는 경우 Flask 프레임워크를 사용하여 정책을 배포하고 REST API를 통해 액세스할 수 있습니다.
This is the final episode of the Deep Learning Trading Strategy from the beginning to the production series.In this video we are going to see how to use the ...
여러분, 안녕하세요! 모두 잘 지내고 계시길 바랍니다. 마지막으로 영상을 공개한 지 꽤 시간이 지났지만, 제가 당신을 잊지 않았다는 것을 확신시켜 드리고 싶습니다. 오늘 저는 자동 거래 시스템의 소프트웨어 아키텍처라는 새롭고 흥미로운 주제를 시작하게 되어 기쁩니다.
소프트웨어 아키텍처에 대해 자세히 알아보기 전에 먼저 거래 시스템이 무엇이고 구성 요소가 무엇인지 이해해 봅시다. 이 비디오에서는 자동 거래 시스템의 구조와 요소를 살펴봅니다. 이제 "해 아래 새 것이 없다"는 속담처럼 말입니다. 이 분야에서 여정을 시작했을 때 나는 거래 시스템에 대한 잘 구성된 설명을 찾기 위해 노력하고 있었습니다. 구현해야 할 블록과 강력한 소프트웨어 솔루션을 만드는 방법을 쉽게 이해할 수 있는 것을 원했습니다.
Rishi K. Narang의 "Inside the Black Box"라는 책에서 그는 알파 모델, 위험 모델, 거래 비용 모델, 포트폴리오 구성 모델 및 실행 모델의 5가지 공통 블록으로 구성된 정량 시스템을 설명합니다. 또한 데이터라는 필수 블록이 하나 더 있습니다.
데이터 블록부터 시작하여 이 구조를 자세히 살펴보겠습니다. 데이터 블록은 기술적으로 거래 시스템의 일부는 아니지만 시스템의 모든 구성 요소가 의존하는 산소로서 중요한 역할을 합니다. 데이터 블록은 거래 시스템에 필요한 다양한 유형의 데이터를 포함합니다. 이 데이터는 거래소, 규제 기관, 통신사와 같은 다양한 소스와 미시 경제 데이터, 중개인 수수료 또는 포트폴리오 정보와 같은 기타 관련 소스에서 가져올 수 있습니다.
이제 데이터 블록을 이해했으므로 거래 시스템의 요소와 이들 간의 관계를 살펴보겠습니다. 다이어그램에서 정보의 흐름을 나타내는 화살표를 볼 수 있습니다. 알파 모델, 위험 모델 및 거래 비용 모델은 최종 결정을 내리지 않습니다. 대신 포트폴리오 구성 모델에 정보를 제공하고 실행 모델을 트리거합니다. 이러한 요소의 하위 집합만 존재하고 요소 간의 관계가 다를 수 있는 전략이 있다는 점에 유의하는 것이 중요합니다. 그러나 이 구조는 거래 시스템의 주요 요소에 대한 전체적인 관점을 제공합니다.
이 구조의 첫 번째 요소는 알파 모델입니다. 알파 모델은 미래 결과를 예측하도록 설계된 거래 아이디어 또는 전략을 나타냅니다. 일반적으로 이 모델의 출력은 반환 또는 방향 예측입니다. 거래 모델에는 가격 데이터와 기술 분석을 기반으로 하는 기술 모델과 재무 데이터와 기본 분석을 활용하는 기본 모델의 두 가지 잘 알려진 유형이 있습니다. 우리는 또한 두 가지 측면을 결합한 하이브리드 모델을 가질 수 있습니다. 복잡성에 관계없이 알파 모델의 주요 목적은 예측 형태로 조언을 제공하는 것입니다.
다음으로 위험 모델이 있습니다. 위험 모델은 손실로 이어질 수 있는 요인에 대한 노출을 줄이거나 최소화하도록 설계되었습니다. 위험 모델은 두 가지 유형으로 분류할 수 있습니다. 첫 번째 유형은 하드 사이징 또는 복잡한 기능과 같은 전략을 사용하여 위험을 줄이기 위한 포지션 사이징에 중점을 둡니다. 이러한 유형의 위험 모델의 결과는 포지션 크기입니다. 두 번째 유형의 위험 모델은 시장 방향 위험과 같은 특정 유형의 위험을 완화하는 것을 목표로 합니다. 이러한 경우 모델은 산출물로 헤지 포지션을 제안할 수 있습니다.
세 번째 요소는 거래 비용 모델입니다. 이 모델은 거래 실행과 관련된 비용에 대한 정보를 제공합니다. 수수료 및 수수료, 슬리피지, 시장 영향의 세 가지 주요 비용이 있습니다. 거래 비용 모델은 고정 비용 값을 반환하는 단순한 모델부터 실제 비용을 최대한 정확하게 예측하는 것을 목표로 하는 2차 비용 함수와 같은 보다 복잡한 모델까지 다양합니다. 아래 그래프는 다양한 비용 함수가 어떻게 작동하는지 보여줍니다.
정보를 제공하는 모든 요소가 있으면 포트폴리오 구성 모델로 이동합니다. 이 모델은 알파 모델, 위험 모델 및 거래 비용 모델에서 입력을 받아 다양한 자산 간에 자금을 할당하는 방법을 결정합니다. 어떤 목적 함수를 기반으로 포트폴리오를 구성하는 것을 목표로 합니다. 포트폴리오 구성 모델에는 규칙 기반 모델(예: 동일한 가중치, 동일한 위험, 의사 결정 트리 방법) 및 포트폴리오 최적화 프로그램의 두 가지 기본 유형이 있습니다. 후자는 포트폴리오에서 보다 최적의 자산 할당을 달성하기 위해 목적 함수를 최적화하는 것과 관련됩니다.
마지막으로 포트폴리오 구성 모델에서 정보를 받아 가능한 최상의 가격으로 주문을 실행하는 데 중점을 둔 실행 모델이 있습니다. 간단한 시장 또는 지정가 주문에서 시장의 미시 구조를 분석하고 기계 학습 알고리즘을 활용하는 보다 복잡한 모델에 이르기까지 다양한 유형의 실행 모델이 있습니다.
이것으로 양적 거래 시스템의 주요 요소에 대한 간략한 설명을 마칩니다. 이 개요를 통해 거래 시스템 구조와 일반적으로 작동하는 방식을 더 잘 이해할 수 있기를 바랍니다.
다음 비디오에서는 이 설명을 기반으로 소프트웨어 시스템 아키텍처를 만들어 보겠습니다. 이 주제가 흥미롭다면 향후 업데이트를 위해 채널 구독을 고려하십시오. 시청해주셔서 감사하고 다음 영상에서 뵙겠습니다.
This video briefly describes the common structure of a Quantitative Trading System. Also, it provides the information about the relationships between the ele...
TensorFlow 2.0 및 TFX를 사용하여 처음부터 프로덕션까지 딥 러닝 트레이딩 전략
TensorFlow 2.0 및 TFX를 사용하여 처음부터 프로덕션까지 딥 러닝 트레이딩 전략
제 자신을 Denis라고 소개하게 되어 기쁩니다. 알고리즘 거래와 관련된 모든 정보를 제공하는 채널인 ClosetoAlgotrading에 오신 것을 진심으로 환영합니다.
딥 러닝의 힘만을 활용하여 거래 전략을 만든다는 생각이 처음 떠오른 지 꽤 오래되었습니다. 이 개념은 수익성 있는 거래를 실행하는 데 필요한 매개변수를 자율적으로 식별할 수 있는 신경망 개발을 중심으로 합니다. 이 흥미진진한 여행을 시작하기 위해 저는 라이브 실험을 하기로 결정했습니다. 여러분의 관심도 끌 수 있기를 바랍니다. 다음 에피소드에서는 강력한 거래 전략을 수립하기 위한 데이터 과학 접근 방식을 구현하는 것과 관련된 각 단계를 초기 단계부터 최종 생산까지 안내할 것입니다.
제 목표는 데이터 준비, 엄격한 테스트 등을 포함하여 모든 중간 단계를 포괄적으로 다루는 것입니다. 앞으로 저는 TensorFlow 2.0을 활용하고 tfx 파이프라인이 제공하는 가능성을 탐색할 것입니다. 나는 복잡한 계산이나 규칙을 피하고 대신 딥 러닝의 힘에 의존하여 진정으로 수익성 있는 벤처를 만들 수 있는지 확인하려고 합니다. 이 아이디어가 마음에 든다면 채널을 구독하고 이 매력적인 탐험에 동참해 보시기 바랍니다. 우리는 함께 알고리즘 거래의 우여곡절을 탐색하고 숨겨진 잠재력을 풀기 위해 노력할 것입니다.
데이터 과학 접근 방식을 더 깊이 탐구하고 싶은 사람들을 위해 간단한 Google 검색을 통해 주제를 설명하는 다양한 리소스를 얻을 수 있습니다. 결과 중에서 이 방법론을 따르는 것과 관련된 단계를 설명하는 유익한 기사와 시각적 표현을 접할 수 있습니다.
여정의 첫 번째 중요한 블록은 비즈니스 이해 단계입니다. 이 시점에서 우리는 목표를 세심하게 정의하고 이러한 목표를 달성하는 데 있어 전략의 효율성을 평가하기 위한 측정 가능한 가치인 KPI(핵심 성과 지표)를 설정해야 합니다. 이 단계를 시작하려면 특정 비즈니스 도메인의 복잡성을 철저히 이해하는 데 시간을 할애하는 것이 중요합니다. 목표에 대한 심오한 이해를 얻음으로써 명확하고 집중하여 진행할 수 있습니다. 특정 결과를 예측하는 것이 목적인지 특정 현상을 분류하는 것이 목적인지를 분별하는 것이 중요합니다.
우리가 해야 할 일의 성격을 결정하려면 근본적인 질문에 대한 답을 찾아야 합니다. 질문이 "얼마나" 또는 "얼마나 많이"를 중심으로 진행되는 경우 회귀 작업을 처리하고 있는 것입니다. 반면에 우리가 "어떤 범주"에 대해 묻는다면 우리는 분류의 영역으로 모험을 떠나는 것입니다. 달성하려는 작업의 유형을 파악한 후에는 성공을 의미하는 메트릭을 정의하는 것이 중요합니다. 우리의 경우 이러한 메트릭에는 투자 수익률(ROI) 및 정확도가 포함될 수 있습니다. 결국 우리의 궁극적인 목표는 시장에서 이익을 얻는 것이므로 미래의 가격 움직임을 확실히 파악해야 합니다.
미래의 가격 움직임을 효과적으로 예측하려면 방향을 결정하는 것뿐만 아니라 정확한 가격 수준과 도달할 시간을 식별해야 합니다. 그러나 방향을 아는 것만으로는 부족하다. 정확한 가격 수준과 도달 시간이 필요합니다. 목표 가격에 대한 끝없는 대기 기간을 피하기 위해 최소 예상 가격 목표와 최대 대기 기간을 정의할 수 있습니다. 즉, 우리는 가격이 상승, 하락 또는 동일한 수준으로 유지될 수 있는 분류 작업과 유사한 미래 가격 움직임의 방향을 확인하려고 합니다.
방향을 예측할 때 모델의 성능을 초기에 측정하기 위해 분류 정확도를 사용할 수 있습니다. 이 메트릭은 올바른 예측 수를 총 예측 수로 나눈 값을 백분율로 표현하기 위해 100을 곱한 값입니다. 이제 목표주가 수준은? 거래 전략의 경우 수익 수준을 투자 자본의 백분율로 정의할 수 있습니다. 또한 단일 거래에 대한 최대 허용 위험으로 손절매 수준을 설정하여 위험 허용 범위를 결정해야 합니다. 우리의 이익 및 정지 수준은 각 거래에 대한 ROI 값으로 사용됩니다. 예를 들어 100달러에 주식을 사서 105달러에 도달하면 매도한다고 가정해 봅시다. 이 5%의 가격 변동은 5%의 투자 수익을 가져올 것입니다. 이익실현과 손절매를 모두 포함하는 출구 수준을 정의한 상태에서 시간 문제를 해결해야 합니다. 우리는 가격이 원하는 수준에 도달할 때까지 무한정 기다리기를 원하지 않습니다.
따라서 고정된 기간 대신 거래량을 사용하더라도 최대 보유 기간을 설정합니다. 이 선택의 근거는 데이터 준비에 대해 자세히 설명하는 다음 에피소드에서 더 명확해질 것입니다.
지금까지의 접근 방식을 요약하면 다음과 같습니다. 이익실현, 손절매, 포지션 마감을 위한 최대 보유 기간을 사용하는 일중 전략을 개발하고 있습니다. 거래를 시작하기 위해 미래 가격의 방향(위, 아래 또는 평평함)을 예측할 수 있는 분류 모델을 훈련할 것입니다. 처음에는 정확도를 모델의 효율성 측정 기준으로 사용합니다. 이 토대를 마련한 상태에서 오늘의 논의를 마치겠습니다. 우리는 우리의 목표, 대상 및 성능 지표를 정의했습니다. 다음 에피소드에서는 데이터를 자세히 살펴보고 추가 분석 및 개발을 위해 데이터 세트와 레이블을 준비합니다.
다음 여정을 놓치지 마세요. 그때까지 몸조심하시고 다음 만남을 간절히 기다리겠습니다.
처음부터 생산까지 딥 러닝 거래 전략. 파트 2.
처음부터 생산까지 딥 러닝 거래 전략. 파트 2.
거래 시스템을 만드는 매혹적인 여정의 두 번째 부분에 오신 것을 환영합니다. 이전 비디오에서 우리의 목표에 대해 논의했으며 오늘은 데이터 세트를 준비하고 레이블을 지정하는 데 집중할 것입니다. 그럼 바로 들어가 봅시다!
시작하려면 데이터 세트 준비에 도움이 되는 일련의 함수를 정의했습니다. 가장 먼저 데이터를 로드해야 합니다. 오늘 데모에서는 작은 데이터 세트를 사용하여 코드의 런타임을 관리할 수 있도록 유지하겠습니다. 보시다시피 데이터 세트는 시간, 가격, 볼륨, 입찰 및 매도와 같은 정보를 포함하는 틱 데이터로 구성됩니다. 이 데모의 목적을 위해 저는 1년 동안의 데이터를 활용할 것입니다. 데이터 세트의 특성을 이해하기 위해 몇 가지 통계를 검토하는 것부터 시작하겠습니다. 우리가 관찰한 주요 측면 중 하나는 약 $100를 맴도는 최소 및 최대 가격입니다. 이것은 이익 비율을 쉽게 계산할 수 있기 때문에 유리합니다.
또한 데이터 세트에 중요한 매개변수인 스프레드 크기를 도입했습니다. 스프레드는 Ask와 Bid 가격의 차이로 계산됩니다. 스프레드 크기가 중요한 이유는 무엇입니까? 설명을 위해 Bid 가격이 $100이고 Ask 가격이 $101인 예를 살펴보겠습니다. 이 경우 스프레드는 $1입니다. 우리가 주식을 사고 즉시 매도한다면 우리는 항상 스프레드를 잃게 될 것입니다. 이 예에서는 $1에 해당합니다. 스프레드 크기에 대한 통찰력을 얻기 위해 저는 매 초마다 하루 종일 평균 스프레드를 계산했습니다. 그래프에 표시된 것처럼 스프레드는 일반적으로 1에서 2센트 사이이며 때때로 약간 더 큰 스프레드가 발생합니다. 이 분석을 바탕으로 스프레드가 3센트 미만인 경우에만 거래를 실행하기로 결정할 수 있습니다.
흥미롭게도 그래프는 가장 큰 스프레드가 시장 개장 후 처음 몇 분 동안 발생하는 경향이 있음을 보여줍니다. 결과적으로 일중 전략을 실행할 때 초기 10-15분을 건너뛰는 것이 현명합니다. 이제 기간을 정의하고 스프레드를 조사했으므로 모델에 대한 레이블을 생성하여 가격 이동 방향을 예측할 수 있습니다. 이러한 레이블을 어떻게 생성합니까? 이전 비디오에서 언급했듯이 포지션을 여는 트리거가 없기 때문에 예상 수익을 기반으로 각 막대에 대한 레이블을 생성해야 합니다.
이를 달성하기 위해 가격이 창 장벽을 넘을 때 레이블이 생성되는 창 방법을 사용할 것입니다. 작동 방식은 다음과 같습니다. 길이가 n 바인 창을 정의하고 예상 수익률(%)을 기준으로 상한 및 하한 창 장벽을 설정합니다. 이 창을 막대 하나의 단계 크기로 모든 막대 위로 슬라이드할 때 가격이 창 밖으로 나가면 창의 첫 번째 막대에 레이블이 표시됩니다. 레이블 생성을 진행하기 전에 창에 대한 매개변수를 설정하겠습니다. 기본 아이디어는 간단하지만 최적의 창 크기와 장벽 수준을 선택하는 것은 어려울 수 있습니다. 개인적으로 저는 이 문제와 씨름하는 데 상당한 시간을 보냈지만 아직 결정적인 해결책을 찾지 못했습니다.
이 문제를 해결하기 위해 하루 동안의 과거 변동성과 전체 데이터 세트를 계산할 것입니다. 예를 들어, 제시된 그래프는 해당 변동성과 함께 하루 동안 각 틱의 가격 변동을 보여줍니다. 또한 전체 데이터 세트의 변동성을 평가할 수 있습니다. 표시된 바와 같이 평균 변동성은 현재 가격의 약 30센트에 해당하는 0.003%에 불과합니다. 그러나 하루 종일 창을 사용할 생각은 없습니다. 윈도우 길이를 결정하기 위해 임의의 크기로 100개의 윈도우를 생성하려고 시도했고 각 윈도우 내의 평균 변동성을 평가했습니다. 결과 그래프는 길이가 다른 창의 평균 변동성을 나타냅니다. 예를 들어 창 크기를 50개 막대로 선택하면 약 0.001%의 변동성을 예상할 수 있습니다.
이 변동성 값은 최소 예상 수익을 정의하고 손절 가격의 크기를 계산하는 데 유용합니다. 이 정보를 가지고 틱 데이터에서 볼륨 막대를 생성할 수 있습니다. 눈금 대신 막대를 사용하면 하나의 막대가 일반적으로 비슷한 부피를 포함하므로 안정적인 조건을 보장하므로 창 길이를 더 쉽게 계산할 수 있습니다. 볼륨 막대를 생성하기 위해 틱을 반복하고 사전 정의된 목표 볼륨(예: 1000)을 초과하거나 같을 때까지 볼륨을 누적합니다. 이 누적 단계에서 발생하는 틱은 하나의 볼륨 막대를 나타냅니다. 예를 들어 하루 동안의 볼륨 막대를 생성해 보겠습니다. 그림과 같이 선택한 날짜에 대해 179개의 막대를 얻습니다.
결과적으로 가격 그래프는 이제 이러한 볼륨 막대로 구성됩니다. 또한 종가를 사용하여 각 막대의 백분율 변화와 일일 변동성을 계산할 수 있습니다. 그러나 하루 종일 창을 사용할 생각은 없습니다. 창 길이를 결정하기 위해 전체 데이터 세트에 대해 평균 변동성과 무작위로 생성된 창을 사용했습니다. 결과 그래프는 전체 데이터 세트에 대한 창 변동성을 보여줍니다.
이제 이러한 준비 단계를 완료했으므로 레이블을 생성할 준비가 되었습니다. 이 시연에서는 50바의 창 크기와 평균 가격을 기준으로 약 30센트에 해당하는 0.003%의 기대 수익률을 선택했습니다. 레이블 지정 프로세스가 끝나면 교차 레이블로 알려진 여러 유사한 레이블을 찾을 수 있습니다. 서로 다른 이벤트에 대해 동일한 라벨을 사용하지 않기 위해 창의 첫 번째 막대와 가격이 창 장벽을 교차하는 막대 사이의 가장 가까운 거리에 있는 레이블만 유지합니다. 검사 결과 약 700개의 레이블이 세 가지 범주(위, 아래 및 평면)에 고르게 분포되어 있음을 확인했습니다.
이제 데이터 세트를 저장해 보겠습니다. 우리는 두 개의 파일을 생성할 것입니다. 하나는 볼륨 막대 데이터 세트를 포함하고 다른 하나는 각 막대에 대한 틱 정보를 포함합니다. 후자는 우리 모델에서 유용할 수 있으므로 보존할 가치가 있습니다. 이것으로 오늘의 논의를 잠시 중단하겠습니다. 나는 우리가 충분한 근거를 다루었다고 믿으며, 데이터 라벨링에 대해 더 깊이 탐구하는 데 관심이 있는 사람들을 위해 가치 있는 통찰력을 제공하는 Marcos Lopez de Prado의 책 3장과 4장을 탐색할 것을 권장합니다.
우리의 다음 단계는 기능 엔지니어링과 tfx 파이프라인을 통해 모든 것을 실행하는 것입니다. 조만간 새로운 에피소드를 만들어 더 흥미로운 정보를 공유할 수 있기를 바랍니다.
그때까지 몸조심하시고 다음 영상도 기대하겠습니다.
처음부터 생산까지 딥 러닝 거래 전략. 3부. TFX 파이프라인.
처음부터 생산까지 딥 러닝 거래 전략. 3부. TFX 파이프라인.
Denis와 함께 "Close to AlgoTrading"의 또 다른 에피소드에 다시 오신 것을 환영하게 되어 기쁩니다. 우리는 설 연휴 이후 실험을 재개했고 진행이 더디긴 했지만 여전히 전진하고 있습니다. 오늘 동영상에서는 라벨이 지정된 데이터를 자세히 살펴보고 TFX 파이프라인을 살펴보겠습니다. 자, 바로 들어가 봅시다!
이전 비디오에서 우리는 데이터에 대한 레이블을 성공적으로 만들었지만 그래프에 어떻게 표시되는지 보여주는 것을 잊었습니다. 빠른 복습으로 모든 데이터를 새 데이터 프레임에 저장했습니다. 계속해서 이 데이터 프레임을 읽어봅시다.
데이터 프레임 내에서 'dir' 열에는 레이블이 포함되어 있고 'cross_idx' 열은 가격이 정의된 창을 넘을 때의 틱 번호를 나타냅니다. 이러한 열을 기반으로 시작 및 종료 위치 이벤트를 시각적으로 표시하기 위해 간단한 함수를 만들었습니다. 그래프에서 열린 위치 이벤트는 채워진 삼각형으로 표시되고 닫은 위치 이벤트는 채워지지 않은 삼각형으로 표시됩니다.
보시다시피 대부분의 공개 이벤트는 가격 차트의 로컬 최대 또는 최소 지점에서 발생합니다. 앞으로 이전에 사용했던 것과 유사한 작은 데이터 세트로 계속 작업할 것입니다. 또한 데이터 세트를 학습, 평가 및 테스트 데이터 세트로 분할합니다.
이제 레이블을 더 잘 이해했으므로 다음 단계로 이동하여 TFX 파이프라인 작업을 시작하겠습니다. TFX에 익숙하지 않은 사용자를 위해 Tensorflow Extended를 의미하며 확장 가능한 고성능 기계 학습 작업을 위해 특별히 설계된 강력한 프레임워크입니다. TFX 파이프라인은 데이터 수집, 모델링, 학습, 추론 제공, 배포 관리와 같은 기계 학습 워크플로의 다양한 단계를 수행하는 일련의 구성 요소로 구성됩니다.
TFX에 익숙해지려면 구성 요소 및 상호 연결 방법에 대한 자세한 정보를 제공하는 공식 Tensorflow TFX 웹 페이지를 탐색하는 것이 좋습니다. 비디오 설명에서 관련 링크를 찾을 수 있습니다.
저 역시 TFX를 처음 접하기 때문에 각 에피소드에서 함께 학습할 것입니다. 오늘은 파이프라인의 처음 네 가지 구성 요소에 중점을 둘 것입니다. 간단히 소개하자면 다음과 같습니다.
ExampleGen: 파이프라인의 이 초기 입력 구성 요소는 입력 데이터 세트를 수집하고 선택적으로 다른 하위 집합으로 분할합니다. 우리의 경우 사용자 지정 시계열 분할을 직접 지원하지 않으므로 수동으로 데이터를 훈련, 평가 및 테스트 데이터 세트로 분할했습니다.
StatisticsGen: 이 구성 요소는 데이터 세트에 대한 통계를 계산하여 데이터 분포, 표준 편차, 누락된 값 등에 대한 통찰력을 제공합니다. 추가 분석을 위해 통계 아티팩트를 생성합니다.
SchemaGen: 통계를 검토한 후 SchemaGen 구성 요소는 관찰된 데이터 특성을 기반으로 데이터 스키마를 생성합니다. 스키마는 데이터의 구조와 속성을 설명합니다.
ExampleValidator: 이 구성 요소는 통계 및 스키마를 참조로 사용하여 데이터 세트의 이상 및 누락된 값을 확인합니다. 예기치 않거나 일관되지 않은 데이터 패턴을 식별하는 데 도움이 됩니다.
우리가 올바른 길을 가고 있는지 확인하기 위해 Tensorflow 팀이 템플릿으로 제공한 시카고 택시 예제를 사용하겠습니다. 이 예는 데이터 분석, 유효성 검사, 변환, 모델 교육 및 제공을 포함하는 종단 간 워크플로를 보여줍니다.
이제 초점을 다시 자체 데이터로 전환해 보겠습니다. 필요한 모듈을 가져오고 입력 및 출력 데이터 폴더에 필요한 변수를 설정한 후 데이터를 TFX 파이프라인으로 로드할 수 있습니다. 입력 폴더에는 평가, 교육 및 테스트 데이터 세트에 대한 하위 폴더가 포함되어 있습니다.
ExampleGen 구성 요소를 사용하여 데이터를 파이프라인에 쉽게 로드할 수 있어야 합니다. 그러나 ExampleGen은 사용자 지정 시계열 분할을 직접 지원하지 않는 것 같습니다. 기본적으로 데이터를 교육 및 평가 세트로만 분할합니다. 다행스럽게도 데이터를 수동으로 분할하고 자체 입력 분할 구성을 구성하여 입력 분할과 출력 분할 간의 일대일 매핑을 보장할 수 있습니다.
결과적으로 ExampleGen 구성 요소는 두 개의 아티팩트를 생성합니다. 하나는 교육 데이터 세트용이고 다른 하나는 평가 데이터 세트용입니다. 훈련 세트의 처음 세 가지 요소를 검토하여 원래 데이터 세트와 일치하는지 확인합시다. 계속해서 ExampleGen 구성 요소의 출력을 StatisticsGen 구성 요소로 전달합니다. 이 구성 요소는 교육 및 평가 데이터 세트 모두에 대한 통계 아티팩트를 생성합니다. 단 하나의 명령으로 데이터 분포, 표준 편차, 결측값 등 데이터 세트 통계를 시각적으로 나타낼 수 있습니다.
여기에서 학습 데이터 세트에 대한 통계를 관찰하여 데이터 특성에 대한 귀중한 통찰력을 얻을 수 있습니다. 평가 세트에 대해 동일한 통계 세트를 검사할 수도 있습니다. 통계에 따르면 레이블의 2%만이 0이 아닌 것으로 나타났습니다. 이는 수익성 있는 거래에 대한 진입 이벤트가 이상값일 수 있음을 시사합니다. 클래스 간의 불균형으로 인해 향후 문제가 될 수 있습니다.
다음으로 SchemaGen 구성 요소를 사용하여 데이터 스키마를 자동으로 생성합니다. 이 스키마는 관찰된 통계에서 파생되지만 원하는 경우 고유한 데이터 설명을 정의할 수도 있습니다. 출력은 데이터 구조 및 속성에 대한 포괄적인 설명을 제공하는 스키마입니다. 마지막으로 생성된 통계 및 스키마를 기반으로 데이터의 유효성을 검사하는 ExampleValidator 구성 요소에 도달합니다. 데이터 세트의 이상 또는 불일치를 확인합니다. 예를 들어 시카고 택시의 예에서 '_company' 기능에 예기치 않은 문자열 값이 있습니다. ExampleValidator를 사용하여 자체 데이터 세트에서 이러한 문제를 감지할 수 있습니다.
우리의 경우 다행스럽게도 데이터 세트에서 이상이나 불일치가 발생하지 않습니다. 이는 데이터가 비교적 깨끗하고 기대치와 일치함을 나타내는 긍정적인 신호입니다. 이것으로 TFX에 대한 간략한 소개를 마치겠습니다. 다음 에피소드에서는 나머지 TFX 구성요소에 대해 자세히 알아보고 데이터를 변환하고 모델을 학습시키는 방법을 살펴보겠습니다.
시청해주셔서 감사하고 다음 영상에서 뵙겠습니다!
4부. 처음부터 생산까지 딥 러닝 거래 전략. TFX 파이프라인 2.
4부. 처음부터 생산까지 딥 러닝 거래 전략. TFX 파이프라인 2.
"Close to Algotrading"의 또 다른 에피소드에 오신 것을 환영합니다. 저는 Denis입니다. 오늘 우리는 거래 전략 구축의 일환으로 TFX 파이프라인을 계속 탐색할 것입니다.
이전 비디오에서는 TFX 파이프라인의 처음 네 가지 구성 요소인 ExampleGen, StatisticsGen, SchemaGen 및 ExampleValidator에 대해 다루었습니다. 이러한 구성 요소는 파이프라인의 기반을 마련하여 데이터 유효성 검사 및 일관성을 보장합니다.
이제 나머지 구성 요소인 Transformer, Trainer, Evaluator, ModelValidator 및 Pusher에 대해 살펴보겠습니다. 이러한 구성 요소를 사용하면 데이터를 변환하고, 모델을 교육하고, 성능을 평가하고, 기준에 대해 모델을 검증하고, 마지막으로 검증된 모델을 프로덕션 환경으로 푸시할 수 있습니다.
하지만 진행하기 전에 몇 가지 중요한 사항을 말씀드리겠습니다. TFX 파이프라인은 강력한 프레임워크를 제공하지만 여전히 일부 버그가 있을 수 있고 특정 구성 요소가 구축 중일 수 있다는 점에 유의할 가치가 있습니다. 그러나 각 단계에 신중하게 접근하고 그 과정에서 제한 사항에 대해 논의해 봅시다. 이전 비디오에서 데이터를 성공적으로 검증했으며 이제 변환 단계로 넘어갈 차례입니다. 이를 위해 TFX에서 제공하는 Transformer 구성 요소를 사용합니다.
Transform 구성요소는 교육과 제공 모두에 대해 일관된 데이터 변환 및 기능 엔지니어링을 수행하는 역할을 합니다. 즉, 모델 교육과 프로덕션에서 사용하는 데 동일한 데이터 변환 기능을 사용할 수 있습니다. 이 기능은 처음에 TFX를 탐색하기 시작한 주된 이유 중 하나입니다.
변환 프로세스를 시작하려면 두 개의 Python 파일을 만들어야 합니다. 첫 번째 파일에는 숫자 기능 및 레이블 목록과 같은 상수가 포함됩니다. 두 번째 파일에는 입력 데이터를 전처리하기 위해 tf.Transform에서 사용하는 콜백 함수인 전처리 함수(preprocessing_fn)가 포함됩니다. 이 함수에서는 데이터 변환 및 기능 구성 단계를 정의합니다. 지금은 모든 숫자 입력 기능을 z 점수로 변환하고 레이블 값을 -1, 0, 1에서 각각 0, 1, 2로 변경하는 데 집중하겠습니다. TensorFlow 추정기가 양수 값을 예상하기 때문에 이 레이블 변환이 필요합니다.
TFX의 현재 버전에서는 TensorFlow 에스티메이터만 지원된다는 점에 유의해야 합니다. Keras 모델을 사용하려면 model_to_estimator API를 사용하여 추정기로 변환해야 합니다. TFX 버전 0.21은 Trainer 구성 요소에 대한 Keras 모델을 지원한다고 주장하지만 대화형 컨텍스트 기능에 몇 가지 문제가 발생했습니다. TFX 팀이 곧 이러한 문제를 해결하고 안정적이고 완벽하게 작동하는 도구를 제공할 수 있기를 바랍니다.
이제 데이터 변환을 진행해 보겠습니다. 보시다시피 Transform 구성 요소는 생성된 예제, 데이터 스키마 및 preprocessing_fn 함수를 포함하는 파일 경로와 같은 매개 변수를 입력으로 예상합니다. 변환이 완료되면 모델 생성 및 학습으로 이동할 수 있습니다. Trainer 구성 요소는 우리가 정의한 사양에 따라 모델 교육을 담당합니다.
모델 및 입력 함수가 포함된 Python 파일에서 Trainer 구성 요소에서 호출할 trainer_fn 함수를 정의합니다. 이 함수는 다음 항목이 포함된 사전을 반환해야 합니다.
이 파일 내에서 교육 및 평가를 위한 입력 기능과 레이블을 생성하는 _input_fn 함수를 정의합니다. 제공 입력을 빌드하는 _example_serving_receiver_fn 및 TFMA(TensorFlow Model Analysis)에 필요한 입력을 준비하는 _eval_input_receiver_fn과 같은 추가 기능도 있습니다.
추정기를 생성하기 위해 build_estimator 함수를 정의합니다. 이 함수에서는 입력 기능 세트를 설정하고 추정기를 생성합니다. DNNClassifier와 DNNEstimator가 TensorFlow 1에서 기능 전달과 관련된 오류를 일으켰기 때문에 DNNLinearCombinedEstimator를 사용했다는 점을 언급할 가치가 있습니다. 저는 TensorFlow 2 방법을 사용하고 있기 때문에 이것이 사실이 아니라고 생각합니다. 안타깝게도 이 문제에 대한 해결책을 찾지 못했습니다. 그러나 선형 추정기는 잘 작동하는 것 같습니다.
이제 모델이 정의되었으므로 Trainer 구성 요소를 사용하여 교육을 진행할 수 있습니다. 보시다시피 Trainer 구성 요소는 transformer_examples, 데이터 스키마, 변환 그래프, 교육 및 평가 인수와 같은 다른 매개 변수와 함께 trainer_fn 함수를 포함하는 module_file을 예상합니다. 지금은 교육 및 평가를 위한 단계 수만 지정했습니다. 모델 학습이 완료되면 TFMA(TensorFlow Model Analysis)를 사용한 모델 분석으로 넘어갈 수 있습니다. 진행하기 전에 제공된 링크를 따라 TFMA를 설치했는지 확인하십시오. TFMA를 사용하면 전체 데이터 세트 또는 특정 기능 슬라이스에서 모델에 대한 분석을 수행할 수 있습니다. 이 경우 전체 데이터 세트, 레이블 및 두 가지 특정 기능의 세 가지 슬라이스에 대한 분석을 수행합니다.
전체 데이터 세트를 분석한 결과 98%의 놀라운 정확도를 관찰했습니다. 그러나 레이블을 기반으로 모델의 성능을 검사할 때 지속적으로 레이블 0을 예측한다는 것을 알 수 있습니다. 이 결과는 레이블의 균형이 맞지 않고 모델에 유용한 기능이 없기 때문에 예상된 것입니다. 그럼에도 불구하고 TFMA는 모델의 성능을 평가하는 편리한 방법을 제공합니다.
앞으로 내보낸 모델의 유효성을 검사하는 데 도움이 되는 ModelValidator 구성 요소가 있습니다. 새 모델을 기준(예: 현재 서비스 중인 모델)과 비교하고 미리 정의된 기준을 충족하는지 확인합니다. 이 유효성 검사에는 평가 데이터 세트에 대한 모델 평가와 AUC 및 손실과 같은 메트릭 계산이 포함됩니다. 새 모델의 메트릭이 기준선과 관련하여 개발자가 지정한 기준을 충족하는 경우 모델은 "충분히 양호"한 것으로 간주되고 표시됩니다.
마지막으로 모델이 유효성 검사를 통과했는지 확인하는 Pusher 구성 요소가 있습니다. 모델이 유효성 검사 기준을 충족하면 지정된 파일 대상으로 푸시됩니다. 이 단계에서는 검증된 모델만 프로덕션 환경에 배포되도록 합니다.
파이프라인을 마무리하기 위해 모든 구성 요소를 Apache Beam 파이프라인으로 내보낼 수 있습니다. 그런 다음 필요한 모든 파일을 zip 아카이브로 패키징할 수 있습니다. 아카이브에서 서버의 작업 디렉토리로 파일의 압축을 풀면 파이프라인을 실행할 수 있습니다. 실행이 완료되면 TensorFlow Serving과 함께 사용할 수 있는 훈련된 모델이 준비됩니다. Docker 컨테이너에서 TensorFlow Serving을 시작하고 사용하는 방법에 관심이 있다면 제 채널에서 비디오 자습서를 찾을 수 있습니다.
이 시리즈에서 많은 부분을 다루었지만 TFX의 현재 버전에는 여전히 특정 제한 사항이 있다는 점에 유의해야 합니다. 특정 요구 사항에 따라 Keras 모델을 사용하여 변환 기능에만 의존하는 파이프라인을 구현해야 할 수도 있습니다. 그러나 TFX에 대한 이러한 탐색이 유익하고 유익한 정보가 되었기를 바랍니다.
다음 비디오에서는 거래 전략 개발이라는 주요 목표로 돌아갈 것입니다. 계속 지켜봐주세요! 이 비디오에 댓글, 구독 및 좋아요를 누르는 것을 잊지 마세요. 시청해주셔서 감사하고, 다음 영상에서 만나요!
파트 V. GIGO. 처음부터 생산까지 딥 러닝 거래 전략.
파트 V. GIGO. 처음부터 생산까지 딥 러닝 거래 전략.
"Close to Algotrading"의 또 다른 에피소드에 오신 것을 환영합니다. 제 이름은 Denis입니다. 딥 러닝 거래 시스템 개발에 대한 제 경험과 실패를 공유하기 위해 이 자리에 섰습니다.
TensorFlow를 사용하여 전체 시스템을 구현하는 데 상당한 시간을 할애했지만 라이브러리의 품질에 상당히 실망했음을 인정해야 합니다. 개념에 감사하지만 TensorFlow에서 제공하는 문서는 좌절의 원인이었습니다. 박사 학위를 가진 명석한 사람들도 잘 구성된 문서를 작성하는 데 어려움을 겪는 것 같습니다. 과거에 비해 개선됐지만 여러 부분에서 여전히 혼란스럽다.
그러나 설명서는 내가 만난 더 큰 문제에 비해 사소한 문제입니다. 많은 기능이 사용하려고 할 때 예상대로 작동하지 않으며 공식 예제도 제대로 작동하지 않는 경우가 있습니다. 이로 인해 이 프레임워크의 일부 핵심 사항을 놓친 것은 아닌지 의문이 들었습니다. 하지만 이 비디오의 주요 주제인 나의 실패로 돌아가 봅시다. 기억하시겠지만 저는 지정된 백분율을 기준으로 가격 변동에 대한 레이블을 생성하기로 결정했습니다. 이러한 레이블의 대부분은 데이터에서 로컬 최소값 또는 최대값으로 판명되었습니다.
몇 가지 간단한 데이터 처리 및 준비를 수행한 후 간단한 LSTM 네트워크를 만들어 테스트했습니다. 내 기대는 그다지 높지 않았지만 결과는 정말 실망스러웠습니다. 함께 제공되는 시각적 개체에서 볼 수 있듯이 네트워크는 의미 있는 학습에 실패했습니다.
이제 신경망이 기적을 행하기 위한 것이 아님을 기억하는 것이 중요합니다. 아마도 우리의 접근 방식을 재평가해야 할 때일 것입니다. 예측하려는 이벤트는 전체 데이터 세트의 2%만 나타냅니다. 이러한 이벤트는 이상치로 간주될 수 있으며 우리의 단순 네트워크는 이를 나머지 데이터와 구별하기 위해 고군분투합니다. 또한 이러한 이벤트는 관련이 없고 뚜렷한 원인이 있을 가능성이 높아 이를 정확하게 예측하는 모델을 구축하기 어렵습니다.
이러한 과제를 감안할 때 데이터를 더 잘 이해하고 예측력으로 기능을 식별하는 데 집중해야 한다는 것이 분명해졌습니다. 이를 염두에 두고 간단한 이동 평균 전략을 다시 검토하기로 결정했습니다. 우리의 초기 접근 방식에서는 왜 우리가 입장을 취해야 하는지에 대한 명확한 이해가 부족했습니다. 그러나 이제 포지션을 여는 전략이 생겼습니다. 완벽하지는 않지만 우리가 활용할 수 있는 널리 사용되는 전략입니다. 두 개의 이동 평균과 RSI(Relative Strength Index) 표시기를 데이터 세트에 추가하고 이동 평균이 서로 교차하는 모든 이벤트를 수집했습니다. 이를 통해 가격 이동 방향을 추정할 수 있었습니다.
다음으로 이전과 동일한 라벨링 방법을 사용하여 메타 라벨을 만들었지만 이번에는 이동 평균이 서로 교차하는 막대에만 라벨을 지정했습니다. 여기서 중요한 차이점이 있습니다. 위치 방향(길거나 짧음)을 이미 알고 있기 때문에 레이블의 의미가 달라집니다. 1 레이블은 이익을 나타내고 -1은 손실을 나타내며 255는 다른 경우에 할당됩니다. 업데이트된 데이터 세트와 레이블을 사용하여 간단한 LSTM 모델을 교육하고 완벽한 ROC(Receiver Operating Characteristic) 곡선을 얻었습니다. ROC 곡선은 다양한 분류 임계값에서 분류 모델의 성능을 보여줍니다. ROC 곡선의 AUC(Area Under the Curve) 값은 모델이 클래스를 얼마나 잘 구별하는지 평가하는 데 도움이 됩니다.
그러나 모델의 예측을 검토했을 때 일관되게 클래스 0을 예측하는 것을 확인했습니다. 이 결과는 다시 한 번 관련 이벤트만 사용하는 대신 전체 데이터 세트를 사용했기 때문에 발생했습니다. 우리의 데이터 세트는 불균형 상태로 남아 있었고 기능에는 예측 능력이 부족했습니다. ROC 곡선은 다른 클래스를 예측할 때 모델의 성능 저하를 가릴 수 있으므로 불균형 데이터 세트에 적합하지 않습니다.
데이터의 불균형을 해결하기 위해 조정을 했고 공개 이벤트와 관련된 데이터에만 집중했습니다. 불행히도 이러한 수정 후에도 내 모델은 예측력을 발휘하지 못했습니다. 무작위 모델과 동일한 결과를 생성했습니다. 또한 간단한 피드포워드 모델을 시도했는데 약간 더 나은 결과를 보여주었지만 여전히 만족스럽지 못했습니다. 결론적으로 볼 수 있듯이 모델에 품질이 좋지 않은 데이터를 공급하면 딥 러닝에 마법이 없습니다. "Garbage in, garbage out"의 원칙은 이러한 맥락에서 유효합니다. 또한 고도로 불균형한 데이터셋과 강력한 예측력을 가진 기능이 부족한 데이터셋을 처리할 때 분류 모델은 데이터셋의 대부분을 구성하는 클래스를 예측하는 경향이 있습니다.
앞서 언급했듯이 데이터를 이해하고 시장을 이길 수 있는 방법을 찾는 데 도움이 되는 프로세스를 식별하는 것이 중요합니다.
이것으로 오늘의 에피소드를 마칩니다. 통찰력 있고 유익한 정보를 얻으셨기를 바랍니다. 조심하고 집에 머물며 건강을 유지하십시오.
6부. 강화 학습. 딥러닝 트레이딩 전략의 시작부터 생산까지
6부. 강화 학습. 딥러닝 트레이딩 전략의 시작부터 생산까지
저는 Denis입니다. "Close to Alga Trading"의 또 다른 에피소드에 오신 것을 환영합니다. 이전 에피소드에서 우리는 딥 러닝을 사용하여 수익성 있는 거래 전략을 구축하기 위해 노력했습니다. 지금까지의 진행 상황을 요약해 보겠습니다.
우리는 비효율성을 찾기 위해 시장 상황을 관찰하는 것으로 시작했습니다. 일단 식별되면 간단한 규칙을 만들고 딥 러닝 모델을 위한 데이터를 준비했습니다. 그러나 직접 접근 방식을 구현했을 때 원하는 결과를 얻지 못했다는 사실을 발견했습니다. 이를 통해 접근 방식을 재고하고 대안 전략을 고려해야 한다는 사실을 깨닫게 되었습니다.
오늘 에피소드에서는 강화 학습이라는 새로운 방향을 살펴보겠습니다. 강화 학습은 체스, 도타, 바둑과 같은 게임에서 인간의 성능을 능가하는 다양한 영역에서 상당한 성공을 거두었습니다. 제어 로봇과 자율주행차에도 활용된다. 그렇다면 거래에 적용하지 않겠습니까? 그 성공을 보장할 수는 없지만 탐색해 볼 수 있는 흥미로운 방법입니다.
시작하려면 강화 학습에 대한 간략한 소개를 살펴보고 주요 정의에 익숙해지도록 합시다.
강화 학습은 최적의 제어 문제를 해결하기 위해 시행 착오를 통해 학습하는 것으로 설명할 수 있습니다. 간단히 말해서 최종 수치 보상을 최대화하기 위해 주어진 환경 상태에서 취할 최선의 조치를 찾는 것입니다. 이 개념을 더 잘 이해하기 위해 간단한 비유로 시각화해 봅시다.
트레이더가 모니터 앞에 앉아 주식을 사고팔고 있다고 상상해 보십시오. 여기서 트레이더는 에이전트를 나타내고 차트 가격과 브로커는 환경을 형성합니다. 에이전트는 환경의 현재 상태를 관찰하고 주식 구매와 같은 조치를 취합니다. 그 대가로 에이전트는 브로커 수수료가 될 수 있는 보상을 받습니다. 환경이 바뀌면 에이전트는 더 많은 주식을 사거나 팔거나 아무것도 하지 않을 수 있습니다. 거래일 종료 시 에이전트는 긍정적이거나 부정적인 최종 보상을 받습니다. 에이전트의 목표는 이 최종 보상을 최대화하는 것입니다.
강화 학습에서 우리의 목표는 환경과 상호 작용하여 학습할 수 있는 에이전트를 설계하는 것입니다. 이제 여정 내내 접하게 될 주요 정의에 익숙해지도록 합시다.
에이전트: 결정을 내리고, 작업을 수행하고, 환경을 관찰하고, 피드백을 받고, 보상을 최대화하는 것을 목표로 하는 알고리즘입니다.
환경: 에이전트가 거주하는 세계입니다. 에이전트가 결정을 내리는 데 사용할 수 있는 모든 데이터를 포함합니다.
상태: 에이전트가 감지하는 환경의 구성입니다.
보상: 조치를 취한 후 에이전트가 받는 피드백입니다. 에이전트가 최대화하려는 값입니다. 중요한 것은 강화 학습에서 보상이 반드시 돈이나 물리적 트로피를 의미하지는 않는다는 것입니다. 단순히 음수일 수도 있는 숫자 값이며 우리의 목표는 이 값을 최대화하는 것입니다.
조치: 주어진 환경에서 에이전트가 수행할 수 있는 모든 것. 간단히 하기 위해 구매, 판매 또는 아무것도 하지 않는 세 가지 작업을 고려해 보겠습니다.
에피소드: 전체 작업의 완전한 실행.
이것은 우리가 여행 내내 사용할 주요 정의입니다. 향후 비디오에서 다룰 중요한 추가 용어가 있습니다.
이번 강화학습 입문과 함께 환경에 대해 알아보고 다음 영상에서 TensorFlow를 사용하여 우리만의 환경을 만들어 보도록 하겠습니다.
오늘 저와 함께 해주셔서 감사합니다. 여러분과 함께 강화 학습을 더 탐구할 수 있기를 기대합니다. 곧 봐요!
파트 Ⅶ. 강화 학습. 거래 환경.
파트 Ⅶ. 강화 학습. 거래 환경.
나는 Denis이고 당신은 "Close to AlgoTrading"을 보고 있습니다. 지난 에피소드에서는 강화 학습에 대한 간략한 소개를 제공했습니다. 오늘은 에이전트를 위한 간단한 거래 환경을 만드는 방법에 대해 알아보겠습니다. 자세한 내용을 살펴보겠습니다.
먼저 거래 환경이 무엇을 나타내는지 고려해야 합니다. 가격 데이터만을 기반으로 합니까, 아니면 전체 주문서, 뉴스 또는 Twitter의 소문과 같은 추가 요소를 통합해야 합니까? 이 결정은 우리 환경의 복잡성을 형성할 것입니다.
다음으로 에이전트가 수행할 수 있는 작업을 결정해야 합니다. "매수" 및 "매도" 작업으로 제한해야 합니까, 아니면 특정 단계를 건너뛸 수 있습니까? 행동 공간을 정의하는 것은 에이전트의 의사 결정 프로세스에 매우 중요합니다.
이제 대상과 보상을 정의하는 방법에 대해 논의하겠습니다. 현실 세계에서 거래 환경에는 연속적인 상태 공간이 있습니다. 그러나 단순화를 위해 내부 작업 및 구현을 이해할 수 있도록 환경을 가능한 한 간단하게 유지하겠습니다.
시작하려면 실제 가격 데이터를 사용하는 대신 20개의 값으로 구성된 랜덤 워크 프로세스를 생성합니다. 이 시뮬레이션 일일 가격은 우리의 입력으로 사용됩니다. 에피소드는 이 가격 시퀀스의 중간부터 시작됩니다. 즉, 초기 상태에는 10개의 과거 가격이 포함됩니다. 나머지 보이지 않는 가격은 0으로 채워집니다. 각 단계마다 새로운 가격이 어레이에 추가됩니다. 에이전트가 20개의 가격을 모두 볼 수 있게 되면 에피소드가 종료됩니다. 따라서 에피소드 완결까지 총 10단계가 남았습니다.
가격 데이터 외에도 상태에는 오픈 포지션에 대한 정보가 포함됩니다. 오픈 포지션이 없는 경우 [0,0], 롱 포지션인 경우 [1,0], 숏 포지션인 경우 [0,1]과 같이 원-핫 인코딩을 사용하여 포지션을 표현해 보겠습니다.
일반적인 거래 행위를 고려하여 열려 있는 포지션이 없는 경우 "매수" 및 "매도"를 포함합니다. 그러나 이미 열려 있는 직책이 있는 경우 에이전트는 직책을 건너뛰거나 닫는 것만 선택할 수 있습니다. 따라서 이 시나리오에서 "매도" 또는 "매수" 작업은 "건너뛰기"와 동일합니다.
에이전트의 목표는 10일 동안 손익(PnL)을 최대화하는 것입니다. 따라서 보상을 일일 PnL로 정의합니다.
환경의 구조와 동작을 명확하게 이해했으므로 이제 구현 단계로 진행할 수 있습니다. 앞에서 언급했듯이 TensorFlow(tf-agent) 프레임워크를 활용할 것입니다. tf-agent 팀은 tf-agent에 적합한 환경 개발에 대한 포괄적인 가이드를 제공했으며, 코드를 더 깊이 이해하려면 확인하는 것이 좋습니다.
환경을 만들기 위해 모든 Python 환경이 구현해야 하는 인터페이스를 정의하는 PyEnvironment 클래스를 상속하는 것으로 시작합니다. Init 함수 내에서 변수를 초기화하고 초기 상태를 설정하며 가장 중요한 작업 및 관찰 사양을 지정합니다. 우리의 경우 행동 공간은 최소값과 최대값이 각각 0과 3으로 설정된 4개의 다른 행동으로 구성됩니다. 관찰 사양은 가격이 0에서 시작하고 최대 한도가 없는 환경 상태를 설명합니다. 가격의 데이터 유형은 유동적입니다. 동작 및 관찰 사양을 반환하는 것은 tf-agent와의 원활한 통합을 위해 매우 중요합니다.
구현해야 할 다음 중요한 기능은 재설정입니다. 이 기능은 환경을 초기 상태로 재설정합니다. 이 기능의 올바른 구현을 보장하는 것은 환경의 적절한 기능을 위해 매우 중요합니다.
이제 가장 중요한 기능인 단계에 대해 논의해 보겠습니다. 단계 기능은 입력 매개변수로 작업을 수신하고 환경의 상태 전환 관리를 담당합니다. 이 함수에서는 가능한 모든 조치를 처리하고 PnL(보상)을 계산합니다. 이 함수는 관찰(에이전트가 다음 단계에서 행동을 선택하기 위해 관찰할 수 있는 환경 상태의 일부), 보상(에이전트의 학습 목표), 단계 유형(이 시간 단계가 시퀀스의 첫 번째, 중간 또는 마지막) 및 할인.
단계 함수에는 두 가지 반환 시나리오가 있습니다. 하나는 중간 단계에 대한 것이고 다른 하나는 에피소드의 마지막 단계에 대한 것입니다.
환경을 만든 후에는 버그를 식별하고 수정하기 위해 유효성을 검사하는 것이 중요합니다. util 패키지는 이러한 목적으로 사용할 수 있는 validate_py_environment라는 함수를 제공합니다. 또한 환경 사양을 확인하면 모든 것이 예상대로 작동하는지 확인하는 데 도움이 됩니다.
사용할 준비가 된 환경에서는 동작을 디버깅하고 유효성을 검사하기 위해 다양한 작업으로 테스트하는 것이 좋습니다.
간단한 DQN tf-agent를 사용하여 몇 가지 테스트를 수행했으며 결과는 다음과 같습니다. 20,000보 후 에이전트는 허용 가능한 성능을 보여주었습니다. 그러나 에이전트가 배울 수 있는 시계열은 하나뿐이므로 비교적 간단합니다. 두 번째 시계열을 도입하고 20,000단계를 실행하면 결과가 유망하지 않을 수 있습니다. 그러나 약 100,000걸음으로 에이전트의 성능이 크게 향상되었습니다.
파트 Ⅷ. 강화 학습 거래 전략. DQN: Q네트워크, QRNN네트워크
파트 Ⅷ. 강화 학습 거래 전략. DQN: Q네트워크, QRNN네트워크
안녕하세요, 제 이름은 Denis이고 "Close to AlgoTrading"을 보고 계십니다. 이 비디오에서는 강화 학습 에이전트에 대한 이전 환경에 대한 간략한 업데이트를 제공합니다. Q-Learning 및 DQN 에이전트에 대한 간략한 설명도 제공합니다. 그런 다음 tf-agents 라이브러리에서 rDQN 에이전트에 대한 기본 학습 단계를 구현하고 테스트 결과에 대해 논의합니다.
시작하려면 이전 비디오에서 만든 거래 환경을 다시 살펴보겠습니다. 그 환경에서 우리는 합성 생성 데이터를 사용했습니다. 그러나 이 업데이트된 버전에서 우리 환경은 기록 데이터가 입력 매개변수로 포함된 데이터 프레임을 수신합니다. 환경에 대한 관찰_사양은 "Price"와 "Pos"라는 두 개의 키가 있는 사전입니다. "가격" 키에는 시가, 종가, 고가, 저가 및 볼륨 데이터가 포함된 20개의 요소가 포함되어 있습니다. "Pos" 키에는 오픈 포지션에 대한 정보가 포함되어 있습니다.
각 에피소드가 시작될 때 데이터에서 20개의 가격 조각을 무작위로 선택합니다. 이 변경을 통해 강화 학습 에이전트는 실제 과거 데이터에서 학습할 수 있습니다.
계속해서 Q-Learning과 Q-Table의 개념에 대해 논의해 봅시다. Q-Learning은 (상태, 행동)의 모든 쌍에 Q-값을 할당하는 것을 포함합니다. Q-테이블로 알려진 이 테이블은 에이전트가 현재 상태에서 최대 Q-값을 가진 작업을 선택하는 데 사용됩니다. 에이전트는 환경을 탐색하고, 보상을 받고, 관찰된 보상을 기반으로 Q-값을 업데이트합니다.
Q-값을 업데이트하기 위해 이전 Q-값과 미래 Q-값을 포함하는 공식을 사용합니다. Q-Table에서 다음 상태에 대한 최대 Q-값을 찾아 미래 Q-값을 계산합니다. 획득한 미래 Q-값으로 시작 쌍(상태, 동작)과 관련된 Q-값을 업데이트합니다.
그러나 우리의 경우 금융 시장은 상태 공간이 매우 넓어 Q-Table을 사용하는 것이 비실용적입니다. 이 문제를 극복하기 위해 심층 신경망을 사용하여 주어진 상태에 대한 Q 값을 예측할 수 있습니다. DQN 에이전트(Deep Q-Network 에이전트)로 알려진 이 접근 방식은 Q-값이 역전파를 통해 손실을 최소화하여 업데이트되는 Q-네트워크를 사용합니다. DQN 에이전트에서 사용되는 손실함수는 특정 방정식으로 주어진다.
이제 Q-Learning과 DQN 에이전트를 잘 이해했으므로 tf-agents 라이브러리를 사용하여 rDQN 에이전트에 대한 기본 학습 단계를 구현해 보겠습니다.
전체 학습 알고리즘은 다음 단계를 따릅니다.
환경을 만드는 것은 간단한 작업입니다. 거래 환경을 TFPyEnvironment로 래핑하여 tf-agent와 원활하게 통합할 수 있습니다.
다음으로 DQN 에이전트를 위한 Q-Network를 생성합니다. tf-agents 라이브러리는 Q-network를 정의하는 데 사용할 수 있는 Q-Network 클래스를 제공합니다. 우리는 40개의 뉴런으로 구성된 하나의 숨겨진 완전 연결 레이어로 간단한 Q-네트워크를 정의합니다. 우리의 관찰은 사전이므로 간단한 전처리 계층도 정의합니다.
Q-Network가 생성되면 DQN 에이전트 생성을 진행합니다. Q-network를 매개변수로 전달하여 tf_agents.agents.dqn.dqn_agent 클래스를 인스턴스화합니다. 또한 모델 훈련을 위한 옵티마이저와 손실 함수를 정의합니다.
에이전트를 교육하려면 환경의 데이터가 필요합니다. 정책을 사용하여 이 데이터를 수집하고 이 단계에서는 작업을 무작위로 선택할 수 있습니다. DQN 에이전트에는 평가 및 배포에 사용되는 agent.policy와 데이터 수집에 사용되는 agent.collect_policy의 두 가지 정책이 있습니다.
데이터 수집에는 현재 상태를 취하고, 작업을 선택하고, 다음 상태 및 보상을 받고, 이 정보를 버퍼에 저장하는 작업이 포함됩니다. 여러 단계 또는 에피소드를 수집하여 궤적을 형성합니다. tf-agents 라이브러리는 에피소드가 끝날 때까지 단계를 수집하는 DynamicEpisodeDriver라는 드라이버를 제공합니다. 드라이버는 회신 버퍼를 포함하여 관찰자를 업데이트합니다.
데이터를 저장하기 위해 tf-agents 라이브러리에서 일반적으로 사용되는 TFUniformReplayBuffer를 사용할 수 있습니다. 버퍼가 저장할 데이터 요소의 사양, 배치 크기 및 각 배치 세그먼트의 최대 길이를 정의합니다.
데이터 수집 단계가 완료되면 에이전트를 교육할 수 있습니다. 에이전트는 재생 버퍼에 액세스해야 합니다. 에이전트에 데이터를 공급하기 위해 tf.data.Dataset 파이프라인을 생성합니다. 재생 버퍼의 각 행은 단일 궤적을 저장하지만 DQN 에이전트는 손실을 계산하기 위해 현재 관찰과 다음 관찰이 모두 필요합니다. 따라서 num_steps 매개변수를 2로 설정하여 데이터 세트 파이프라인이 배치의 각 항목에 대해 두 행을 샘플링할 수 있도록 합니다.
이 시점에서 우리는 동일한 데이터에 대해 두 명의 DQN 에이전트를 교육하고 성능을 평가할 수 있는 모든 것을 갖추고 있습니다. 한 에이전트는 간단한 Q-Network를 사용하고 다른 에이전트는 QRNNNetwork를 사용합니다. 두 에이전트는 200일 간의 과거 가격 데이터를 사용하여 훈련됩니다.
700개의 훈련 단계 후에 우리는 단순한 Q-Network 에이전트가 많이 배우지 않았고 대부분 음의 평균 수익을 보인다는 것을 관찰했습니다. 그러나 QRNNNetwork 에이전트는 대부분 양의 평균 수익률을 나타냅니다. 이 결과는 RNN 에이전트가 데이터의 일부 역학을 캡처하고 더 빨리 학습할 수 있으므로 기대와 일치합니다.
이 간단한 실험은 수익성 있는 에이전트를 구축하는 데 강화 학습을 사용할 수 있는 희망을 제공하지만 에이전트의 성능을 평가하기 위해 고려해야 할 다른 메트릭이 여전히 있습니다. 향후 비디오에서 이에 대해 살펴보겠습니다.
시청해주셔서 감사하고 다음편에서 뵙겠습니다.
파트 IX 강화 학습 거래 전략. DQN: 에이전트 정책에 기반한 거래 전략 테스트
파트 IX 강화 학습 거래 전략. DQN: 에이전트 정책에 기반한 거래 전략 테스트
우리의 여정에서 전략 테스트라는 중요한 이정표에 도달했음을 발표하게 되어 기쁩니다. 이를 위해 간단한 백테스팅 Python 프레임워크를 활용하여 테스트를 수행합니다. 시작하려면 "pip install" 명령과 프레임워크 이름을 실행하여 프레임워크를 설치할 수 있습니다.
프레임워크 작성자는 이를 효과적으로 사용하는 방법을 보여주는 간단한 예제를 제공했습니다. 그러나 이에 뛰어들기 전에 자체 전략을 구현해야 합니다. 전략에 필요한 모든 변수를 초기화하고 정의하는 것으로 시작하겠습니다.
한 가지 흥미로운 측면은 TensorFlow API를 사용하여 저장된 정책을 로드할 수 있다는 것입니다. QRNNNetwork를 사용하고 있으므로 정책의 초기 상태를 가져와야 합니다. 결과적으로 초기화 기능을 구현했습니다. 이제 모든 새 단계에서 호출되는 "다음" 함수를 구현할 차례입니다. 처음에는 처음 10일 동안 데이터를 수집해야 하며 그 후에 관찰 사전을 공급할 수 있습니다. 각 단계에서 관찰을 업데이트하고 정책에 전달합니다.
관찰 사전을 만든 후에는 정책 모델에서 입력으로 필요하므로 시간 단계 개체를 만들어야 합니다. 이 프로세스를 용이하게 하기 위해 관찰 데이터를 시간 단계 개체로 변환하는 간단한 함수를 만들었습니다. 여기서 중요한 요소는 관찰 데이터와 step_type입니다. timestep 개체를 얻은 후 정책에서 작업을 검색할 수 있습니다. 보시다시피 "runPolicy" 함수는 step_type이 0이면 정책 상태를 재설정하고 작업과 새 policy_state를 반환합니다.
다음으로 위치 상태를 업데이트하고 작업을 실행해야 합니다. 마지막으로 "다음" 기능의 끝에서 카운터를 증가시키고 모든 것을 초기 상태로 재설정하여 새 에피소드의 시작을 시뮬레이션합니다. 엄청난! 우리는 전략을 성공적으로 구현했습니다. 이제 테스트 목적으로 데이터가 필요합니다. panda_datareader 라이브러리를 사용하여 Yahoo Finance에서 일일 데이터를 검색할 수 있습니다. 1년 간의 과거 데이터를 사용하여 인텔 주식에 대한 전략을 테스트하는 것부터 시작하겠습니다.
백 테스트 개체를 만들고 테스트를 시작합니다. 테스트 결과 106%의 수익률을 보여주어 인상적입니다. 그러나 백테스팅 프레임워크는 100%부터 계산을 시작한다는 점에 유의해야 합니다. 즉, 실제 수익은 6%에 불과합니다. 그럼에도 불구하고 우리 정책이 광범위하게 훈련되지 않았다는 점을 고려하면 나쁘지 않은 결과입니다. 보다 포괄적인 평가를 제공하기 위해 AMD 주식에 대한 전략도 테스트해 보겠습니다. 보시다시피 AMD의 결과는 약 40%의 감소를 보여줍니다. 따라서 우리는 AMD와 Intel 주식에 대한 우리 전략의 성과를 나란히 비교할 수 있습니다.
이제 백테스팅 프레임워크와 함께 에이전트 정책을 사용하는 방법을 알게 되었습니다. 마찬가지로 실제 거래 환경에 Python을 사용하는 경우 동일한 방식으로 정책을 사용할 수 있습니다. 그러나 다른 언어를 사용하는 경우 Flask 프레임워크를 사용하여 정책을 배포하고 REST API를 통해 액세스할 수 있습니다.
이 비디오가 흥미롭고 유익한 정보였기를 바랍니다. 하셨다면 구독을 고려해 주시고 다음편에서 뵙겠습니다.
양적 거래 시스템이란 무엇입니까? 구조 및 설명.
양적 거래 시스템이란 무엇입니까? 구조 및 설명.
여러분, 안녕하세요! 모두 잘 지내고 계시길 바랍니다. 마지막으로 영상을 공개한 지 꽤 시간이 지났지만, 제가 당신을 잊지 않았다는 것을 확신시켜 드리고 싶습니다. 오늘 저는 자동 거래 시스템의 소프트웨어 아키텍처라는 새롭고 흥미로운 주제를 시작하게 되어 기쁩니다.
소프트웨어 아키텍처에 대해 자세히 알아보기 전에 먼저 거래 시스템이 무엇이고 구성 요소가 무엇인지 이해해 봅시다. 이 비디오에서는 자동 거래 시스템의 구조와 요소를 살펴봅니다. 이제 "해 아래 새 것이 없다"는 속담처럼 말입니다. 이 분야에서 여정을 시작했을 때 나는 거래 시스템에 대한 잘 구성된 설명을 찾기 위해 노력하고 있었습니다. 구현해야 할 블록과 강력한 소프트웨어 솔루션을 만드는 방법을 쉽게 이해할 수 있는 것을 원했습니다.
Rishi K. Narang의 "Inside the Black Box"라는 책에서 그는 알파 모델, 위험 모델, 거래 비용 모델, 포트폴리오 구성 모델 및 실행 모델의 5가지 공통 블록으로 구성된 정량 시스템을 설명합니다. 또한 데이터라는 필수 블록이 하나 더 있습니다.
데이터 블록부터 시작하여 이 구조를 자세히 살펴보겠습니다. 데이터 블록은 기술적으로 거래 시스템의 일부는 아니지만 시스템의 모든 구성 요소가 의존하는 산소로서 중요한 역할을 합니다. 데이터 블록은 거래 시스템에 필요한 다양한 유형의 데이터를 포함합니다. 이 데이터는 거래소, 규제 기관, 통신사와 같은 다양한 소스와 미시 경제 데이터, 중개인 수수료 또는 포트폴리오 정보와 같은 기타 관련 소스에서 가져올 수 있습니다.
이제 데이터 블록을 이해했으므로 거래 시스템의 요소와 이들 간의 관계를 살펴보겠습니다. 다이어그램에서 정보의 흐름을 나타내는 화살표를 볼 수 있습니다. 알파 모델, 위험 모델 및 거래 비용 모델은 최종 결정을 내리지 않습니다. 대신 포트폴리오 구성 모델에 정보를 제공하고 실행 모델을 트리거합니다. 이러한 요소의 하위 집합만 존재하고 요소 간의 관계가 다를 수 있는 전략이 있다는 점에 유의하는 것이 중요합니다. 그러나 이 구조는 거래 시스템의 주요 요소에 대한 전체적인 관점을 제공합니다.
이 구조의 첫 번째 요소는 알파 모델입니다. 알파 모델은 미래 결과를 예측하도록 설계된 거래 아이디어 또는 전략을 나타냅니다. 일반적으로 이 모델의 출력은 반환 또는 방향 예측입니다. 거래 모델에는 가격 데이터와 기술 분석을 기반으로 하는 기술 모델과 재무 데이터와 기본 분석을 활용하는 기본 모델의 두 가지 잘 알려진 유형이 있습니다. 우리는 또한 두 가지 측면을 결합한 하이브리드 모델을 가질 수 있습니다. 복잡성에 관계없이 알파 모델의 주요 목적은 예측 형태로 조언을 제공하는 것입니다.
다음으로 위험 모델이 있습니다. 위험 모델은 손실로 이어질 수 있는 요인에 대한 노출을 줄이거나 최소화하도록 설계되었습니다. 위험 모델은 두 가지 유형으로 분류할 수 있습니다. 첫 번째 유형은 하드 사이징 또는 복잡한 기능과 같은 전략을 사용하여 위험을 줄이기 위한 포지션 사이징에 중점을 둡니다. 이러한 유형의 위험 모델의 결과는 포지션 크기입니다. 두 번째 유형의 위험 모델은 시장 방향 위험과 같은 특정 유형의 위험을 완화하는 것을 목표로 합니다. 이러한 경우 모델은 산출물로 헤지 포지션을 제안할 수 있습니다.
세 번째 요소는 거래 비용 모델입니다. 이 모델은 거래 실행과 관련된 비용에 대한 정보를 제공합니다. 수수료 및 수수료, 슬리피지, 시장 영향의 세 가지 주요 비용이 있습니다. 거래 비용 모델은 고정 비용 값을 반환하는 단순한 모델부터 실제 비용을 최대한 정확하게 예측하는 것을 목표로 하는 2차 비용 함수와 같은 보다 복잡한 모델까지 다양합니다. 아래 그래프는 다양한 비용 함수가 어떻게 작동하는지 보여줍니다.
정보를 제공하는 모든 요소가 있으면 포트폴리오 구성 모델로 이동합니다. 이 모델은 알파 모델, 위험 모델 및 거래 비용 모델에서 입력을 받아 다양한 자산 간에 자금을 할당하는 방법을 결정합니다. 어떤 목적 함수를 기반으로 포트폴리오를 구성하는 것을 목표로 합니다. 포트폴리오 구성 모델에는 규칙 기반 모델(예: 동일한 가중치, 동일한 위험, 의사 결정 트리 방법) 및 포트폴리오 최적화 프로그램의 두 가지 기본 유형이 있습니다. 후자는 포트폴리오에서 보다 최적의 자산 할당을 달성하기 위해 목적 함수를 최적화하는 것과 관련됩니다.
마지막으로 포트폴리오 구성 모델에서 정보를 받아 가능한 최상의 가격으로 주문을 실행하는 데 중점을 둔 실행 모델이 있습니다. 간단한 시장 또는 지정가 주문에서 시장의 미시 구조를 분석하고 기계 학습 알고리즘을 활용하는 보다 복잡한 모델에 이르기까지 다양한 유형의 실행 모델이 있습니다.
이것으로 양적 거래 시스템의 주요 요소에 대한 간략한 설명을 마칩니다. 이 개요를 통해 거래 시스템 구조와 일반적으로 작동하는 방식을 더 잘 이해할 수 있기를 바랍니다.
다음 비디오에서는 이 설명을 기반으로 소프트웨어 시스템 아키텍처를 만들어 보겠습니다. 이 주제가 흥미롭다면 향후 업데이트를 위해 채널 구독을 고려하십시오. 시청해주셔서 감사하고 다음 영상에서 뵙겠습니다.