BigQuery를 통한 재무 시계열 분석

퀀트(quantitative analyst, 정량적 분석가)는 다양한 도구와 기술을 사용하여 시장 거래 내역과 같은 빅데이터를 마이닝하여 마켓 트렌드에 대한 정보를 얻을 수 있습니다. 견적, 거래 및 기타 이벤트가 예측 가능한 주기로 발생하므로, 이러한 데이터는 빈도 분석이나 이동 평균과 같은 기존의 기술을 사용하여 분석할 수 있는 재무 시계열을 나타냅니다.

하지만 대규모 데이터세트를 다루는 일은 어렵습니다. 데이터세트는 계속 증가하지만 기존 도구는 확장되지 않을 수 있습니다. 저장소 요구사항이 데이터세트만큼 빠르게 증가할 수 있으므로 데이터를 컴퓨터의 하드 드라이브에 다운로드하는 것은 더 이상 효과적인 방법이 아닙니다. 또한 전통적인 데이터베이스 쿼리에서 적절한 데이터 하위 집합을 검색하는 데 오랜 시간이 걸릴 수 있습니다.

Google BigQuery는 추가 전용 테이블에 SQL과 유사한 쿼리를 실행하도록 하고 Google 인프라의 처리 능력을 사용하여 결과를 매우 신속하게 반환함으로써 이러한 문제와 기타 문제를 해결합니다. BigQuery는 웹, 명령줄, 그리고 REST API를 포함한 API를 통해 사용할 수 있습니다. BigQuery를 Google Cloud Platform의 다른 구성요소나 타사 도구와 함께 사용하면 당장 필요한 데이터 분석 솔루션을 구축할 수 있으며, 나중에 솔루션을 확장할 수 있다는 사실에 안심할 수 있습니다.

재무 데이터를 다룰 때는 항상 보안이 중요합니다. Google Cloud Platform은 여러 가지 방법으로 데이터를 안전하고 확실하게 지키며 개인정보를 보호해 줍니다. 예를 들어 모든 데이터는 전송 중에 그리고 사용되지 않을 때도 암호화되며, Cloud Platform은 ISO 27001, SOC3, FINRA, PCI 규정을 준수합니다.

목표

  • 데이터세트를 BigQuery에 로드합니다.
  • BigQuery 웹 UI를 사용하여 다양한 재무 시계열 쿼리를 수행합니다.
  • 쿼리 결과를 시각화합니다.

기본 요건

  • Google Cloud Platform 콘솔 프로젝트에 BigQuery API를 사용하도록 설정합니다.
  • 결제를 사용하도록 설정합니다.
  • 클라이언트 운영체제에 Google Cloud SDK를 설치합니다.

샘플 데이터 로드

이 가이드에서는 시간 경과에 따라 국제 통화 환율의 시세를 나타내는 외환(FX) 현물 시장 데이터를 사용합니다. 이러한 값에는 사람들이 여행할 때, 대형 금융 기관이 국가 또는 지역 간에 자금을 이동할 때, 또는 투기자가 통화를 거래하여 수익을 추구할 때와 같은 다양한 통화 거래에 대해 중개인이 제시하는 가격이 기록됩니다. 데이터 형식은 다음과 같습니다.

<venue>,
<from-currency>/<to-currency>,
<timestamp>,
<bid-price>,
<ask-price>

샘플 데이터세트의 모든 가격은 영국 파운드(GBP)와 미국 달러(USD) 간의 교환에 적용됩니다. 타임스탬프는 항상 그리니치 표준시(GMT)로 표시되고 마지막 세 자리는 항상 0으로 나타나며 시계열 해상도는 1밀리초입니다. 매수 호가는 매수자가 통화에 대하여 지불하겠다고 제시한 가격을 나타내고, 매도 호가는 매도자가 단위당 제시한 가격을 나타냅니다.

샘플 데이터를 로드하려면 다음 단계를 따르세요.

  1. 현재 프로젝트를 설정합니다. 터미널 창에서 다음 명령어를 입력합니다.

    gcloud config set project <your_project_id>
    
  2. BigQuery에서 새 데이터세트를 만듭니다.

    bq mk timeseries
    
  3. 두 개의 CSV 파일에서 데이터를 로드합니다. 첫 번째 파일에는 2014년 1월의 데이터가 들어있고 두 번째 파일에는 2월의 데이터가 들어있습니다. 이러한 데이터세트를 로드하는 데 잠시 시간이 걸릴 수 있습니다.

    bq load timeseries.gbpusd_0114 gs://solutions-public-assets/time-series-master/GBPUSD_2014_01.csv venue:STRING,currencies:STRING,time:TIMESTAMP,bid:FLOAT,ask:FLOAT
    
    bq load timeseries.gbpusd_0214 gs://solutions-public-assets/time-series-master/GBPUSD_2014_02.csv venue:STRING,currencies:STRING,time:TIMESTAMP,bid:FLOAT,ask:FLOAT
    
  4. BigQuery 웹 UI를 엽니다.

  5. 테이블 스키마를 봅니다. 프로젝트 이름 아래에서 시계열 데이터세트를 확장한 다음 gbpusd_0114를 클릭합니다.

다음 그림은 gbpusd_0114 테이블의 테이블 스키마를 보여줍니다. gbpusd_0214 테이블의 스키마는 동일합니다.

테이블 세부정보

1월 견적에 대한 쿼리

FX 데이터가 어떻게 표시되는지 확인할 수 있는 간단한 쿼리로 시작해 봅니다.

  1. BigQuery 웹 UI에서 쿼리 작성을 클릭합니다.

  2. 새 쿼리 텍스트 상자에 다음 쿼리를 입력합니다.

    SELECT
     venue,
     currencies,
     time,
     bid,
     ask
    FROM
     timeseries.gbpusd_0114
    ORDER BY
     time ASC
    LIMIT   1000;
    
  3. 쿼리 실행을 클릭합니다.

    잠시 시간을 내어 다음이전 링크와 같이 도구에서 제공하는 컨트롤을 사용하여 데이터를 탐색해 보세요. 시간 열의 데이터 형식은 기본 데이터의 해상도를 밀리초 단위까지 전부 표시하지 않습니다.

    2014-01-01 00:10:10 UTC
    
  4. 기본 제공 함수를 사용하여 시간 정보의 형식을 다시 지정하도록 쿼리를 수정합니다. 새 쿼리 텍스트 상자에서 다음과 같이 SELECT 문의 첫 번째 부분을 변경합니다.

    SELECT FORMAT_UTC_USEC(time) AS time,
    

    FORMAT_UTC_USEC는 시간 데이터의 형식을 협정 세계시(UTC)로 다시 지정하는 기본 제공 함수입니다. BigQuery는 대규모 데이터 세트를 더 쉽게 쿼리하는 데 사용할 수 있는 여러 가지 기본 함수를 제공합니다.

  5. 쿼리 실행을 클릭하여 결과를 확인합니다. 이제 데이터 형식이 타임스탬프의 전체 해상도를 표시하는 UTC가 되었습니다.

    2014-01-01 00:00:05.763000
    

일정 기간 내의 매수 호가 보기

다음으로는 쿼리를 수정하여 결과를 특정 기간으로 제한합니다. 이렇게 하면 CSV 파일로 빠르게 다운로드할 수 있는 보다 관리하기 쉬운 결과 집합이 생성됩니다.

새 쿼리 텍스트 상자에 다음 쿼리를 입력하고 실행합니다. 이 쿼리는 결과를 1월 1일의 30분에 해당하는 기간으로 제한합니다.

SELECT
  TIME(time) AS time,
  bid
FROM
  timeseries.gbpusd_0114
WHERE
  time BETWEEN TIMESTAMP("2014-01-01 00:00:00.000")
  AND TIMESTAMP("2014-01-01 00:29:59.999")
ORDER BY
  time ASC;

이 쿼리는 TIME 함수를 사용하여 축약된 시간 형식을 표시합니다. 결과가 특정한 날짜의 결과임을 알기 때문에, 전체 타임스탬프를 볼 필요가 없으며, 이 형식은 다음 단계에서 작성하는 차트에서 더 보기 편하게 나타납니다.

결과를 CSV 파일로 다운로드하고 Google 스프레드시트에서 차트를 보는 방법으로 이 데이터를 시각화할 수 있습니다. 방법은 다음과 같습니다.

  1. CSV로 다운로드를 클릭합니다.
  2. Google 스프레드시트를 열고 새로운 스프레드시트를 작성합니다.
  3. 파일 > 가져오기를 클릭합니다. 컴퓨터에서 파일을 업로드하여 결과 파일을 가져옵니다.
  4. 파일 가져오기 대화상자에서 현재 시트 바꾸기를 선택한 다음 가져오기를 클릭합니다.
  5. CTRL+A를 눌러 스프레드시트의 모든 데이터를 선택합니다.
  6. 삽입 > 차트를 클릭하여 데이터에서 새 차트를 만듭니다.
  7. 차트 탭에서 선 차트를 선택한 다음 삽입을 클릭합니다.

다음 그림은 선 차트로 나타낸 데이터를 보여줍니다.

호가를 보여주는 선 차트

이 날 달러의 추세가 처음 20분간은 파운드에 비해 낮아지다가 다음 5분간은 약간 회복되었습니다.

테이블 결합

BigQuery에 로드한 데이터가 두 개의 CSV 파일로 분할되었으며 이제 두 테이블에 있습니다. 다음 예와 같이 테이블 쿼리를 삽입하여 데이터를 손쉽게 결합할 수 있습니다. 이 경우 SQL 문은 'gbpusd'를 포함하는 ID가 있는 모든 테이블을 결합합니다. 이는 앞에서 생성한 두 테이블에서 모두 true입니다. 이 쿼리는 단순히 데이터 세트의 첫 번째 타임스탬프와 마지막 타임스탬프를 반환합니다.

SELECT
  MIN(time) AS time1,
  MAX(time) AS time2
FROM
  (TABLE_QUERY(timeseries,
      'table_id CONTAINS "gbpusd"'));

이름으로 특정 테이블을 결합할 수도 있습니다. 예를 들어 다음 쿼리는 1월 31일에서 2월 1일 사이 자정(GMT) 무렵의 매도 호가를 검색합니다. SELECT 절에 쉼표로 구분된 열을 나열하면 BigQuery SQL이 UNION을 수행합니다. 이 연산은 이전에 SQL을 사용해 보았다면 예상할 수 있는 전통적인 JOIN 연산이 아닙니다.

SELECT
  STRFTIME_UTC_USEC(time,"%m-%d-%Y %r") AS time,
  ask
FROM
  timeseries.gbpusd_0114,
  timeseries.gbpusd_0214
WHERE
  time BETWEEN TIMESTAMP("2014-01-31 23:30:00.000")
  AND TIMESTAMP("2014-02-01 00:29:59.999")
ORDER BY
  time ASC;

이 쿼리는 두 가지 이유로 STRFTIME_UTC_USEC 함수를 사용하여 타임스탬프의 형식을 지정합니다. 첫째, 타임스탬프가 이틀에 걸쳐 정렬할 수 있는 형식이어야 합니다. 정렬된 결과가 날짜 변경을 반영하지 않으므로 HOUR와 같은 형식은 유효하지 않습니다. 둘째, 차트의 라벨이 적절한 형식이어야 합니다. 예를 들어 마이크로초를 포함한 전체 UTC 시간을 사용하여 차트에 라벨을 지정할 수는 있지만, 추가 시간 정보는 차트 라벨로 특별히 유용하지 않습니다.

다음 차트는 결과의 그래프를 보여줍니다.

여러 파일의 선 차트

이제 두 테이블 간의 경계를 지나면서 매도 호가가 어떻게 되었는지 정확하게 알 수 있습니다.

데이터 빈도 분석

금융 시장에서는 때때로 시가의 변동률을 통해 유용한 정보를 얻을 수 있습니다. 쿼리를 실행하여 일정 기간 동안 틱(tick)이라고 하는 외환 시가의 개수에 대한 정보를 얻을 수 있습니다. 틱은 시계가 똑딱하는 것처럼 일정한 시간의 단위가 아닙니다. 여기서 틱 하나는 대체로 가격 변동을 나타내는 하나의 시가를 뜻합니다.

다음 쿼리는 2014년 1월 16일의 시간당 틱의 개수를 반환합니다.

SELECT
  HOUR(time) AS hour,
  COUNT(time) AS num_ticks
FROM
  timeseries.gbpusd_0114
WHERE
  time BETWEEN TIMESTAMP("2014-01-16 00:00:00.000")
  AND TIMESTAMP("2014-01-16 23:59:59.999")
GROUP BY
  hour
ORDER BY
  hour ASC;

다음 막대 차트는 이 결과를 보여줍니다.

빈도가 있는 막대 그래프

차트에서 볼 수 있듯이 이 날 정오와 오후 4시(GMT) 사이에 가장 많은 수의 활동이 발생했습니다.

다음으로 아래의 쿼리를 실행하여 2014년 1월 한 달 동안 시간대별로 틱의 평균 개수를 확인합니다. 이 쿼리는 틱의 총 개수를 해당 월의 거래일 수로 나눈 다음 시간별로 그룹화하여 평균을 계산합니다.

SELECT
  HOUR(time) AS hour,
  COUNT(time)/COUNT(DISTINCT DAY(time)) AS avg_ticks
FROM
  timeseries.gbpusd_0114
GROUP BY
  hour
ORDER BY
  hour ASC;

다음 차트는 평균의 분포를 보여줍니다. 분포가 1월 16일의 결과와 비슷합니다. 따라서 그 날은 시가 변동 측면에서 그 달의 아주 평범한 날이었습니다.

평균 빈도를 보여주는 막대 그래프

이동 평균 계산

금융 시계열 분석을 위한 기본 기술 가운데 하나는 단순 이동 평균(SMA)입니다. BigQuery를 사용하여 FX 데이터의 SMA를 계산할 수 있습니다. 다음 쿼리는 1월 16일 오전 3시간 동안 매수 호가의 60초 SMA에 대한 시계열을 검색합니다.

SELECT
  TIME(S1.time) AS bid_time,
  AVG(S2.bid) AS avg_bid
FROM
  timeseries.gbpusd_0114 AS S1
JOIN EACH
  timeseries.gbpusd_0114 AS S2
ON
  S1.time = S2.time
WHERE
  TIMESTAMP_TO_SEC(S2.time)
  BETWEEN (TIMESTAMP_TO_SEC(S1.time) - 60)
  AND TIMESTAMP_TO_SEC(S1.time)
  AND
  S1.time
  BETWEEN TIMESTAMP("2014-01-16 09:00:00.000")
  AND TIMESTAMP("2014-01-16 11:59:59.999")
GROUP BY
  bid_time
ORDER BY
  bid_time ASC;

이 쿼리는 기본 제공 AVG 함수를 사용하여 평균을 계산합니다. 먼저 테이블의 타임스탬프에 자체 조인을 수행한 다음 WHERE 절을 사용하여 조인 결과를 60초 시간 범위로 제한함으로써 이동 평균의 기간을 만듭니다. 이 쿼리는 JOIN 절에 EACH 한정자를 사용하여 BigQuery에 조인이 두 개의 큰 테이블을 참조한다는 힌트를 제공합니다. 쿼리 실행 엔진은 이 힌트를 사용하여 최적화를 수행합니다. 마지막으로, GROUP BY 절은 이동 평균을 집계하고 ORDER BY 절은 결과를 정렬합니다.

다음 차트는 데이터의 선 그래프를 보여줍니다.

이동 평균을 보여주는 선 차트

테스트 데이터 삭제

테스트 데이터 작업을 마쳤으면 데이터세트를 삭제해야 합니다. 방법은 다음과 같습니다.

  1. BigQuery 웹 UI에서 timeseries 데이터세트 이름의 오른쪽에 있는 아래쪽 화살표를 클릭합니다.
  2. 데이터세트 삭제를 클릭합니다.
  3. 삭제 작업을 확인하는 메시지가 표시되면 확인을 클릭합니다.

BigQuery에 대한 자세한 내용은 BigQuery 문서를 참조하세요.

다음 단계

다른 Google Cloud Platform 기능을 직접 사용해 보세요. 가이드를 살펴보세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...