[go: up one dir, main page]

<블로그 원문은 이곳에서 확인하실 수 있습니다>
게시자: Sagar Savla, 기계 인지 제품 관리자


세계보건기구(WHO)는 전 세계적으로 청각 장애인과 난청 환자의 수가 4억 6천 6백만 명 정도 있는 것으로 추정합니다. 이런 사람들이 원활히 소통하고 세상의 정보에 소외되지 않고 올바로 접근할 수 있도록 하기 위한 결정적인 기술이 바로 자동 음성 인식(ASR) 기술이며, 이 기술 덕분에 컴퓨터가 음성 언어를 감지하여 읽을 수 있는 텍스트로 변환해 자막으로 표시해 줄 수 있습니다. Youtube의 자동 자막, Slides의 프레젠테이션 그리고 전화 통화에도 Google의 ASR 기술이 숨은 활약을 펼치고 있습니다. 하지만 ASR이 지난 2, 3년간 여러 가지로 향상되었는데도 청각 장애인과 난청 환자들은 여전히 미국에서는 CART, 영국에서는 Palantypist 또는 다른 국가에서는 STTR과 같은 수동 자막 서비스에 주로 의존하고 있습니다. 이런 서비스는 보통 사람은 엄두가 나지 않을 정도로 비싸고 종종 훨씬 미리 전부터 예약해야 하는 경우가 많아, 청각 장애인과 난청 환자가 즉석 대화뿐 아니라 사교 행사에도 참가할 기회를 축소시킵니다. 우리는 기술이 이러한 격차를 해소하고 청각 장애인 및 난청 환자 커뮤니티에 큰 힘이 될 것이라 믿습니다.


오늘 우리는 자동 자막 처리 능력을 일상적 대화에 적용함으로써 그들이 실제 대화에 실시간으로 더욱 쉽게 접근할 수 있도록 도와주는 무료 Android 서비스인 Live Transcribe를 발표할 예정입니다. Google Cloud로 지원되는 Live Transcribe는 음성 대화를 실시간으로 자막으로 변환해 주며, 전 세계 인구의 80%가 사용하는 70여 가지 언어를 지원합니다. 어떤 앱을 사용하고 있든, 그 내부에서 작업 표시줄에 있는 접근성 아이콘에서 한 번만 탭하면 Live Transcribe를 바로 실행할 수 있습니다.

Live Transcribe 빌드


이전의 ASR 기반 자막 시스템에서는 대체로 계산 집약적 모델, 철저한 사용자 연구, 값비싼 연결 액세스가 필수적이었는데, 그 모든 것은 자동화된 연속 자막 기술의 채택을 가로막습니다. 이러한 문제를 해결하고 합리적 수준에서 정확한 실시간 자막 변환을 보장하기 위해, Live Transcribe는 광범위한 사용자 환경(UX) 연구 결과를 음성 처리 서버에 대한 빈틈없고 지속 가능한 연결성과 결합해 줍니다. 그뿐 아니라, 우리는 이러한 서버에 연결하느라 사용자에게 지나친 데이터 사용량을 유발하지 않도록 할 필요가 있었습니다.


클라우드 ASR에 의존하면 정확도가 더욱 높아지지만, 우리는 Live Transcribe를 사용하는 데 필요한 네트워크 데이터 사용량을 줄이고 싶었습니다. 우리는 이를 위해 AudioSet를 이용한 우리의 이전 작업을 기반으로 빌드한 온디바이스 신경망 기반 음성 감지기를 구현했습니다. 이 네트워크는 우리가 게시한 VGGish 모델과 유사한 이미지 같은 모델로, 음성을 감지하고 클라우드 ASR 엔진에 대한 네트워크 연결을 자동으로 관리하여 장시간 사용하는 동안 데이터 사용량을 최소화합니다.

사용자 환경


우리는 Live Transcribe를 최대한 직관적으로 만들기 위해 갤로뎃 대학과 제휴해 핵심적인 사용자 니즈를 충족시키면서도 기술의 잠재력을 극대화해 줄 사용자 환경 연구 협력 프로젝트에 시동을 걸었습니다. 우리는 여러 가지 다양한 모달리티, 컴퓨터, 태블릿, 스마트폰, 심지어 소형 프로젝터까지 고려하여 청각 정보와 자막을 표시할 방법을 반복적으로 실험했습니다. 마침내, 우리는 스마트폰 폼 팩터에 초점을 맞추기로 했는데, 이러한 기기 유형의 급속한 보급률 증가와 성능 향상을 고려했기 때문입니다.


이런 방향성을 정한 후, 우리는 자막 신뢰도 표시라는 또 다른 중요한 문제를 다루어야 했습니다. 예전부터 사용자에게 유용한 것으로 간주되어 온 것으로, 우리 연구팀은 단어 수준 신뢰도나 구문 수준 신뢰도를 표시할 필요성이 실제로 있는지 여부를 탐구했습니다.


자막의 신뢰도 수준 표시. 노란색은 높은 신뢰도, 녹색은 보통 신뢰도, 파란색은 낮은 신뢰도를 나타냅니다. 흰색은 신뢰도를 최종 판단하기 전에 맥락이 파악되기를 기다리는 새 텍스트를 나타냅니다. 왼쪽은 구문 수준으로 색이 표시되는 예이고 오른쪽은 단어 수준으로 색이 표시되는 예입니다.1 연구팀은 이런 신뢰도 수준 표시가 대화에 가치를 더해주기는커녕 오히려 사용자의 주의를 분산시킨다는 사실을 파악했습니다.


이전에 이 공간에서 이루어진 UX 연구를 보강하는 우리의 연구 결과에 따르면, 자막을 이러한 신호로 레이어링하지 않을 때 가장 쉽게 읽을 수 있는 것으로 밝혀졌습니다. 대신에, Live Transcribe는 텍스트를 더 나은 방식으로 제공하고 음성 이외의 다른 청각 신호로 그 내용을 보완해주는 데 초점을 맞춥니다.

또 다른 유용한 UX 신호는 현재 환경의 소음 레벨입니다. 칵테일 파티 문제로 알려져 있는 이 문제는, 컴퓨터가 떠들썩한 실내에서 말하는 화자의 말을 이해하는 것이 크나큰 난제라는 점입니다. 우리는 이 문제를 다루기 위해 배경 소음 대비 사용자의 상대적 음량을 시각화하는 표시기를 만들었습니다. 이 표시기는 기기에 장착된 마이크가 화자의 말을 얼마나 잘 수신하고 있는지 사용자에게 즉각적인 피드백을 제공하기도 하므로, 사용자가 스마트폰의 위치를 적절히 조정해 화자의 말을 좀 더 또렷이 수신하도록 할 수 있습니다.


소리 강도 및 소음 표시기는 두 개의 동심원으로 소음 레벨을 표시해 줍니다. 노이즈 플로어를 나타내는 안쪽의 밝은 원은 청각 장애 사용자에게 현재 주변 환경이 얼마나 시끄러운지 알려줍니다. 바깥쪽 원은 화자의 음성이 얼마나 잘 수신되는지 보여줍니다. 두 원이 합쳐져 두 가지 소리의 상대적 차이를 직관적으로 알 수 있게 시각적으로 보여줍니다.


향후 작업
모바일 기반 자동 음성 자막 변환에서 앞으로 개선 여지가 있는 부분으로는 온디바이스 인식, 화자 분리, 음성 강화 등이 있습니다. 자막에만 오롯이 의존하다 보면 잘못된 의사소통으로 이어질 위험이 있을 수 있습니다. 우리가 갤로뎃 대학과 함께 진행한 연구 결과, 자막을 다른 청각 신호(예: 음성 감지 및 소리 강도 표시기)와 결합하면 사용자를 위한 커뮤니케이션 옵션에 명백히 유의미한 변화가 있는 것으로 나타났습니다.


Live Transcribe는 현재 Play Store에 단계적으로 출시되고 있고 최신 업데이트를 포함한 모든 Pixel 3 기기에는 사전 설치되어 제공됩니다. 접근성 설정을 통해 Live Transcribe를 사용할 수 있습니다. The Keyword에서 이에 대한 자세한 정보를 읽어보실 수도 있습니다.


감사의 말
Live Transcribe는 연구원인 Chet Gnegy, Dimitri Kanevsky, Justin S. Paul이 Android Accessibility 팀원인 Brian Kemler, Thomas Lin, Alex Huang, Jacqueline Huang, Ben Chung, Richard Chang, I-ting Huang, Jessie Lin, Ausmus Chang, Weiwei Wei, Melissa Barnhart, Bingying Xia와의 협업을 통해 만든 제품입니다. 우리와 절친한 갤로뎃 대학의 파트너이신 Christian Vogler, Norman Williams, Paula Tucker에게도 감사의 말씀을 드립니다.




<블로그 원문은 이곳에서 확인하실 수 있습니다>

휴대기기의 브라우저를 열 필요 없이 웹페이지를 표시할 수 있는 앱을 작성하고 싶으세요? 또는 웹사이트에 구현된 안전한 결제 흐름을 이미 마련해두었으므로 모바일 앱에 결제 기능을 다시 구현하고 싶지 않을 수도 있을 것입니다. 돈 문제는 소홀히 할 수 없는 사항으로, 실수로 Save the Kraken Fund로 지불 금액의 절반을 보낸다거나 하는 일이 없기를 바라실 겁니다. 아, 저한테만 해당하는 얘기 아니냐고요? 어쨌든, Flutter 팀은 Flutter 앱에 WebView를 통합하여 이 모든 기능을 사용 가능하도록 만들어주는 정말 멋진 플러그인을 만들었습니다.
크라켄을 회복시키자는 게 아니라, 필자는 단지 Flutter 앱에 웹사이트를 표시하는 기능을 말한 것입니다.
다른 위젯과 똑같은 Flutter WebView
WebView 플러그인을 앱에 통합하는 방법은 극히 간단합니다. 이 플러그인은 다른 위젯과 다를 것 없는 위젯일 뿐입니다. WebView(initialUrl: ‘https://flutter.io'). WebView에서 javascriptMode 매개변수로 자바스크립트를 선택적으로 사용하거나 중지할 수도 있습니다. WebView에서는 기본적으로 자바스크립트가 비활성화되어 있으므로, 이를 활성화하여 사용하려면 WebView를 다음과 같이 작성하세요.
WebView(
 initialUrl: 'https://flutter.io',
 javascriptMode: JavascriptMode.unrestricted,
)
WebView에 대해 알고 싶은 거의 모든 정보와 WebView를 제어하는 기능도 바로 WebViewController를 통해 사용할 수 있습니다. 이 컨트롤러는 WebView가 완전히 빌드되어 있을 때 콜백에서 반환됩니다.
WebViewController _controller;
WebView(
 initialUrl: 'https://flutter.io',
 onWebViewCreated: (WebViewController webViewController) {
   _controller = webViewController;
 },
);
//...later on, probably in response to some event:
_controller.loadUrl('http://dartlang.org/');
WebViewController는 Flutter에서 WebView를 프로그래밍 방식으로 수정하거나 현재 표시되고 있는 URL과 같은 속성에 액세스하기 위한 티켓입니다. 이 모든 것의 실제 작동 방식을 살펴보기 위해, 필자는 다음에 찾아보기 쉽게 페이지를 북마크할 수 있는 간단한 Wikipedia 검색 앱을 작성했습니다. 위키 래빗홀이라는 말이 있습니다. Wikipedia에서 우연히 발견한 유용한 자료를 다음에 찾으려 할 때 도저히 그 탐색 경로를 알 수 없는 상황을 일컫는데, 그 경로를 절대 잊지 않도록 해주는 게 바로 이 앱입니다.



WebView를 사용하여 Flutter로 작성한 Wikipedia 탐색 앱. 나중에 볼 수 있도록 페이지를 즐겨찾기에 저장할 수 있습니다.
이 위키 래빗홀 브라우저의 완전한 코드는 GitHub 저장소에서 찾아보실 수 있습니다.


WebView는 Flutter로 만든 다른 위젯과 똑같으며 그 위의 계층에 다른 위젯을 작성하는 식으로 구성할 수 있습니다. 즐겨찾기 버튼은 WebView 위로 마우스를 가져가면 나타나는 일반적인 FloatingActionButton일 뿐이며, 이런 버튼에서 흔히 볼 수 있는 음영 효과를 주어 완성할 수 있습니다. 또한 앱 바에서 드롭다운 메뉴가 열리면 메뉴 아래에 있는 다른 위젯과 마찬가지로 메뉴가 WebView를 부분적으로 가리게 됩니다.
코드를 살펴보면 필자가 이 샘플에서 Completer 클래스와 FutureBuilder를 자주 사용한다는 점을 알아차릴 수 있을 것입니다. _controller 인스턴스 변수를 Completer로 선언하는 것은 WebViewController의 자리표시자를 설정하는 것과 같습니다. _controller.isCompleted(즉, 유효한 WebViewController가 있을 때 완료됨)를 호출하거나 FutureBuilder를 _controller.future와 함께 사용하여 WebViewController가 올바로 작동하는지 검사할 수 있습니다. 올바로 작동하는 WebViewController가 있어야만 FutureBuilder를 사용하여 즐겨찾기 추가를 위한 FloatingActionButton과 같은 새로운 UI 컴포넌트를 빌드할 수 있습니다. 그렇지 않으면 프로그램이 즐겨찾기 페이지를 저장할 때 currentUrl을 가져올 방법이 없을 것이기 때문입니다.
WebView에 관한 다른 두 가지 특징은 조금 복잡할 수 있으므로, 이어지는 두 섹션에서 좀 더 자세히 살펴봅시다.
특정 동작도 포착할 수 있는 WebView
WebView는 Flutter 위젯이므로 Flutter의 동작 명확화 프로토콜(일명 Gesture Arena)에 참가할 수 있습니다. WebView는 기본적으로 어떤 동작을 클레임한 다른 위젯이 하나도 없는 경우에만 그 동작에 대해 응답합니다. 하지만 WebView가 gestureRecognizers를 지정하여 어떤 동작을 선제적으로 클레임하도록 만들 수 있습니다.
WebView가 동작에 응답하는 다른 위젯(예: ListView) 내부에 있는 경우 앱이 동작에 응답하는 방식을 지정하고 싶을 수도 있을 것입니다. 사용자가 화면을 가로질러 손가락을 드래그할 경우 ListView나 WebView 중 어느 것을 스크롤하도록 만들어야 할까요? 두 위젯 모두 스크롤 가능하도록 하려는 경우, WebView 위젯은 사용자가 WebView를 드래그할 때 스크롤하지만 그렇지 않을 때는 ListView를 스크롤하도록 드래그 동작을 '포착'할 수 있습니다. gestureRecognizers 매개변수를 사용하여 WebView 위젯으로 전달할 동작을 지정할 수 있습니다. 이 매개변수는 포착하려는 모든 GestureRecognizers로 구성된 Set를 받습니다. Factory 객체에 괜히 겁먹지 마세요. 기본적으로 이 객체는 단지 미화된 빌더 메서드일 뿐입니다. 세로 방향의 스크롤 이벤트를 포착하려면 다음과 같이 작성할 수 있습니다.
WebView(
 initialUrl: someUrl,
 gestureRecognizers: Set()
   ..add(Factory<VerticalDragGestureRecognizer>(
     () => VerticalDragGestureRecognizer())),
)
또는 다음과 같이 다른 방식으로 작성할 수도 있습니다.
var verticalGestures = Factory<VerticalDragGestureRecognizer>(
 () => VerticalDragGestureRecognizer());
var gestureSet = Set.from([verticalGestures]);
return WebView(
 initialUrl: someUrl,
 gestureRecognizers: gestureSet,
);
Boring Flutter Development Show를 시청하시는 분 중에 우리가 Kraken News를 개발하는 모습을 보신 분이 계실지 모르겠습니다. 즉, Hacker News Reader 앱 말입니다.
YouTube 쇼에서 개발해온 Hacker News 앱의 최신 버전


앱의 컨텍스트에서 동작 포착을 보여드리기 위해, 필자는 웹페이지 중 일부를 '미리보기'로 보여주도록 Hacker News 앱을 수정했습니다. 이를 통해 사용자는 연결된 페이지를 세로 방향으로 스크롤하면서 더 자세히 읽어보기 위해 별도의 페이지를 열 것인지 결정할 수 있습니다.
링크의 WebView 미리보기 기능이 있는 Hacker News Reader 앱. WebView는 세로 방향의 드래그 동작을 포착하여 미리보기를 스크롤할 수 있도록 합니다.


이 Hacker News Reader 앱의 코드는 이 GitHub 저장소에서 찾으실 수 있습니다. (아마 여기서는 _buildItem에 대한 코드를 보여줄 것임)
하지만 관심을 두지 않는 동작을 포착할 뿐인 위젯 내부에 WebView가 있는 경우에는 아무런 동작 감지기도 필요하지 않습니다. 예를 들어 PageController는 가로 방향의 드래그 동작에만 응답하고 WebView는 세로 방향으로 스크롤할 수만 있도록 하고 싶다면, 코드를 다음과 같이 작성할 수 있을 것입니다.
PageView(children: [
 WebView(initialUrl: urlOne),
 WebView(initialUrl: urlTwo),
 WebView(initialUrl: urlThree),
]));
PageView의 WebView. PageView는 가로 방향의 스와이프 동작을 제어하므로 개발자가 따로 아무런 작업을 하지 않아도 WebView는 세로 방향으로 스크롤할 수 있습니다.


키 매개변수가 필요할 수도 있는 WebView
Flutter 코드베이스의 모든 위젯 생성자에서 어디서나 선택적으로 사용되는 키 매개변수를 보신 적이 있을 것입니다. 앱에서 제거되거나 추가되거나 다시 정렬되는 같은 유형의 여러 상태 저장 위젯이 있는 경우에 키가 필요합니다. 아시다시피, WebView는 상태 저장 위젯입니다(현재 페이지와 브라우저 방문 기록을 포함한 상태). 따라서 앱에 WebView가 여러 개 있으면 키 매개변수를 추가해야 할 수도 있습니다.
이런 상황의 예가 실제로 Hacker News 앱에 있습니다! 다음은 탭을 전환하는데 WebView에 키가 없을 경우 어떻게 되는지 보여줍니다.

상태 저장 앱에서 키를 사용하지 않을 경우 일어나는 일을 보여줍니다. 'New Stories' 탭으로 변경할 때 잘못된 웹 미리보기 페이지가 표시됩니다.

여기서 알 수 있듯이, 탭을 전환할 때 'Interview with Alan Kay' 타일이 확장되지만 WebView는 여전히 Virgin Galactic에 관한 BBC 페이지를 보여줍니다! 이 페이지는 맨 위에 있는 컬렉션 위젯(이 경우에는 ExpansionTile)에 키를 배치하여 고정된 것입니다.




휴! 키를 사용해 Reader 앱의 각 항목에 대해 다른 WebView와 그에 상응하는 올바른 웹사이트를 표시하는 방법으로 문제가 해결됩니다.


어째서 키로 이 문제가 풀리는지에 관해 아주 간략하게 설명하자면, Flutter는 표시할 스토리 목록을 전환할 때 각 스토리 세트가 ExpansionTile 항목을 포함한 ListView로 만들어지는 것으로 보기 때문이라는 것입니다. Flutter는 위젯 유형과 키를 검사하는 화면을 불필요하게 다시 그리지 않도록 하기 위한 빠른 비교 알고리즘을 가지고 있습니다. 키가 없으면 각 목록의 위젯 유형이 동일하므로 상태 비추적 항목(예: 링크 제목)은 전부 업데이트되지만, 상태 저장 컴포넌트(예: ExpansionTile과 웹사이트 URL의 확장된 상태)는 다시 그려지지 못합니다. 키를 추가하면 이 문제가 해결됩니다. 더 자세한 설명은 키에 관한 다음 동영상을 참조하세요.


마찬가지로, Hero 위젯의 컨텍스트에서 WebView를 사용하는 경우 두 WebView가 실제로는 같은 것이라는 사실을 Flutter가 알고서는 두 번째 WebView를 다시 렌더링하지 않도록 전역 키를 사용하고 싶으실 것입니다.

명심하셔야 할 나머지 몇 가지 사항:
WebView 플러그인은 현재 Developer Preview 단계에 있으며, 그동안 우리가 완성도를 높이기 위한 추가 작업을 마칠 것입니다. 즉, iOS에서 WebView 플러그인을 실행하고 싶으면 ios/Runner/Info.plist에서 <dict> 내부에 다음 행도 추가해야 한다는 뜻입니다.
<key>io.flutter.embedded_views_preview</key><string>yes</string>


현재로서는 Android 키보드와 관련되어 알려진 문제도 있는데, Flutter 팀에서 수정 작업 중입니다.
Flutter 팀의 위 플러그인이 지닌 기능을 전부 가지고 있지는 않지만, 또 다른 커뮤니티 기반 WebView 플러그인이 있습니다. 이 플러그인은 기본 뷰에 웹페이지를 간단히 표시하며 Flutter 위젯 트리의 나머지 부분과 통합되지 않습니다. 따라서 그 버전을 사용하여 임의의 다른 Flutter 위젯으로 WebView를 작성할 수는 없습니다. 이 글에서 설명한 webview_flutter plugin을 사용하면 이 문제를 피할 수 있습니다.

이것으로 오늘 글은 마치겠습니다! 이제 개발자 여러분의 Flutter 앱에 WebView를 추가해 보세요. 그래서 크라켄에게도 사랑을 나눠주세요.

<블로그 원문은 이곳에서 확인하실 수 있습니다>

금융기관은 금융상품이나 그 파생상품의 규모, 변동성, 가치 또는 다른 매개변수를 예측하고 포지션을 관리하고 리스크를 더욱 효과적으로 완화하고 싶은 자연스러운 욕구가 있습니다. 또한 머신러닝 기법을 적용하는 것이 실용적인 수많은 다양한 비즈니스 문제와 그에 따른 대규모의 데이터세트를 가지고 있기도 합니다.
하지만 일반적으로 금융기관에서 ML을 사용하기 시작하려면 먼저 ML 전문성을 보유한 데이터 사이언티스트 인재를 고용해야 하는데, 이런 역량을 지닌 인재에 대한 영입 경쟁이 치열합니다. 많은 경우, 조직에서는 전체 데이터 사이언스 실무를 자체적으로 해결하는 어려운 과제와 비용을 떠맡아야 합니다. 올해 여름, 우리는 확장 가능한 데이터 웨어하우스와 분석 플랫폼을 기반으로 하는 머신러닝 확장 프로그램 세트인 BigQuery ML을 발표했습니다. BigQuery ML은 익숙한 SQL 인터페이스를 통해 ML을 노출함으로써 ML을 효과적으로 대중화해 주는데, 그 덕분에 금융기관에서도 생산성 향상에 더욱 박차를 가하고 기존 인재 풀 활용을 극대화할 수 있습니다.
우리는 지난 여름 Google Cloud Next London에 대비한 것과 마찬가지로 금융 서비스 커뮤니티를 위한 BigQuery ML의 잠재력을 선보이는 데모를 빌드하기로 했습니다. 이 블로그 게시물에서는 우리가 시스템을 디자인하고, 시계열 데이터를 선택하고, 6개월 분량의 과거 데이터를 분석하는 아키텍처를 빌드하고, '무작위 추측' 벤치마크를 능가하도록 모델을 신속히 훈련할 뿐 아니라, 거의 실시간으로 예측하면서 이 모든 일을 해낸 방법을 하나씩 소개하겠습니다.

파생상품 거래소 소개
Google Cloud 솔루션 아키텍트와 고객 엔지니어로 구성된 팀이 대화식 게임 형식으로 파생상품 거래소를 빌드했는데, 이 게임에서는 순전히 운에 맡기거나 BigQuery ML에서 실행되는 모델에서 얻은 예측 결과를 이용해 어떤 옵션 계약이 내가격으로 만기에 도달할지 결정할 수 있습니다. 우리는 금융기관의 가치를 옵션 계약의 '기준'으로 사용하는 대신 특정 기간 내에 특정 해시태그에 대한 Twitter 게시물(트윗)의 볼륨을 기준으로 사용했습니다. Google Cloud에 머신러닝 모델을 배포하여 얼마나 용이하게 파생상품의 규모, 변동성 또는 가치를 예측할 수 있을지 보여주는 것이 우리의 목표였습니다.
The Exchange demo.png
Google Next ‘18 London에서 보여준 거래소 데모

우리의 기본 목표는 기존의 복잡한 트레이딩 예측 프로세스를 다양한 산업 부문의 사용자가 이해할 수 있는 간단한 도해로 변환하는 것이었습니다. 따라서 우리는 다음과 같이 하기로 했습니다.
  1. 우리 고객들이 일상적으로 사용하는 것과 똑같은 Google Cloud 제품을 사용한다.
  2. 모든 사람들에게 익숙한 시계열을 제시한다. 이 경우에는 10분의 기간에서 관찰되는 해시태그 트윗의 수를 파생상품 계약의 '기준'으로 삼는다.
  3. 재미있고 교육적이며 포괄적인 환경을 빌드한다.

계약 조건을 설계할 때는 기후 파생상품에서 지정한 행사 수준과 비슷한 방식으로 이 Twitter 시계열 데이터를 사용했습니다.
아키텍처 결정 사항
Solution architecture diagram.png
솔루션 아키텍처 다이어그램: 소셜 미디어 옵션 시장

우리는 거래소를 소매 거래 장소로 상상했는데, 이곳에서는 시장 참가자가 모바일 핸드셋을 사용해 다양한 소셜 미디어 1인 명의(대부분의 사람이 해시태그로 생각하는 이름)로 유럽 바이너리 범위의 콜 옵션 계약을 구매합니다. 계약은 10분마다 발행되며 10분 후에 만료됩니다. 만료 시, 앞선 기간 동안 누적된 #해시태그 멘션 개수를 사용하여 어떤 참가자가 내가격 계약을 보유하고 있었는지 결정하고 그에 따라 참가자들의 잔고가 업데이트됩니다. 프리미엄은 계약의 미결제 약정에 대해 수금되고 계약이 내가격 조건에 부합하면 환급됩니다. 모든 계약은 1:1로 지급이 이루어집니다.

우리는 데모 구현을 위해 다음과 같은 Google Cloud 제품을 선택했습니다.
Compute Engine이 작업 서버 역할을 했습니다.
이 구현은 계약 발생, 만료 및 결제를 위한 주기적 작업을 실행합니다. 이 디자인에서는 트윗을 BigQuery로 지속적으로 내부 데이터화하기 위한 데몬으로 실행할 싱글톤 프로세스도 필요합니다. 우리는 이러한 계산 작업을 Compute Engine의 임시 가상 머신으로 통합하기로 했습니다. 작업 서버의 작업은 예약을 위해 크론 작업을 사용하여 node.js 및 셸 스크립트로 작성되고 배포 유연성을 위해 삽입된 VM 시작 스크립트를 사용하여 인스턴스 템플릿으로 구성되었습니다. 작업 서버는 시스템 상의 어떤 트레이더와도 상호 작용하지 않지만, '시장 운영 데이터베이스'에 참가자 및 계약 상태를 둘 다 게재합니다.
다음과 같이 Cloud Firestore가 우리의 시장 운영 데이터베이스 역할을 했습니다.
Cloud Firestore는 우리가 시장 세션에 관한 정보를 저장할 때 사용하는 문서 지향 데이터베이스입니다. 트윗 개수와 UI로 표시되는 미결제 약정 데이터에 대한 자연스러운 목적지 역할을 하고 프런트 엔드와 빈틈없이 통합할 수 있게 합니다.

Firebase와 App Engine은 다음과 같이 우리의 모바일웹 애플리케이션을 제공했습니다.
우리는 모바일 및 웹 애플리케이션의 인터페이스 둘 다에 Firebase SDK를 사용하여 프런트 엔드를 위해 간소화된 코드베이스를 유지할 수 있었습니다. (리더보드 및 시황과 같은) 일부 UI 컴포넌트는 (계약에서 참가자의 약정이 내가격으로 만료될 때와 같이) 원본 데이터의 변화를 반영하기 위해 지속적인 업데이트가 필요합니다. Firebase SDK는 개발자를 위해 간결한 추상화를 제공하고 프런트 엔드 컴포넌트가 Cloud Firestore 문서에 바인딩되도록 하므로, 원본 데이터가 변경될 때마다 자동으로 업데이트할 수 있습니다.
우리는 프런트 엔드 애플리케이션을 호스팅하기 위해 App Engine을 선택함으로써 서버 관리나 구성 배포에 크게 신경쓰지 않고 UI 개발에 집중할 수 있었습니다. 이는 팀이 매력적인 프런트 엔드를 빠르게 생산하는 데 도움이 되었습니다.

Cloud Functions는 다음과 같이 백엔드 API 서비스를 실행했습니다.
UI는 Cloud Firestore에 거래를 저장해야 하는데, Cloud Functions가 서버리스 방식으로 이 작업을 용이하게 해줍니다. 이 서버리스 백엔드가 의미하는 바는, 서버 구성이나 스키마 정의보다는 개발 로직에 집중할 수 있으므로 개발 반복 길이를 대폭 줄일 수 있다는 점입니다.

BigQuery와 BigQuery ML트윗을 저장하고 분석했습니다.
BigQuery는 매우 많은 갖가지 문제를 해결해 주므로 BigQuery가 이 프로젝트 중 얼마나 많은 부분을 지원하는지 잊기 쉬울 수 있습니다. 먼저 BigQuery는 최소한의 통합 노력으로 Twitter 데이터를 대규모로 경제적으로 스트리밍하는 볼륨을 안정적으로 내부 데이터화하고 저장합니다. 트윗을 내부 데이터화하기 위한 데몬 프로세스 코드는 83행의 자바스크립트로 구성되는데, 그중 BigQuery에 관련된 코드는 19행에 불과합니다.
다음으로, BigQuery에서는 표준 SQL 구문을 사용하여 내부 데이터화한 데이터에서 특징과 라벨을 추출할 수 있습니다. 가장 중요한 점은, BigQuery ML로 데이터 자체에 ML 기능을 적용하여 데이터에서 추출한 특징을 바탕으로 모델을 훈련하여 궁극적으로는 표준 SQL로 모델을 쿼리하여 런타임에서 예측을 노출할 수 있다는 점입니다.
BigQuery ML은 금융 서비스 커뮤니티가 일상적으로 직면하는 두 가지 중요한 문제를 해결하는 데 도움이 될 수 있습니다. 첫째, BigQuery ML은 데이터에 예측 모델링 기능을 적용하여 외부 예측 모델로 민감한 데이터를 이전하는 것과 관련된 비용, 시간 및 규제 리스크를 줄여줍니다. 둘째, BigQuery ML은 일반적인 SQL 구문을 사용하여 이런 모델을 개발할 수 있게 해주므로 데이터 분석가가 예측을 수행하고 통계적 통찰력을 개발할 수 있게 해줍니다. Next ‘18 London에서 거래소의 한 참석자는 특정 분야의 데이터에는 깊은 통찰력과 정통한 지식을 가지고 있지만 통계에는 약할 수도 있는 데이터 분석가와, 머신러닝에는 전문성이 있지만 특정 문제 영역에는 익숙하지 못할 수도 있는 데이터 사이언티스트 사이의 중요한 격차를 이 도구가 메워준다는 점을 관찰했습니다. 우리는 BigQuery ML이 이러한 두 가지 상이한 역할을 하나로 혼합함으로써 금융 서비스에서 중요한 인재 부족 문제의 해결에 도움이 된다고 믿습니다.

데이터 구조화 및 모델링
우리의 모델 훈련 접근 방식은 다음과 같습니다.
  1. 첫째, 원시 데이터를 가능한 가장 간단한 양식으로 유지합니다. 즉, 특정 해시태그를 포함한 트윗에 대해 Twitter Enterprise API 피드를 필터링하고(사전 정의된 하위 집합에서 끌어옴), 특정 해시태그뿐 아니라 Twitter 피드에서 해당 해시태그가 관찰된 트윗의 타임스탬프로도 구성된 2열의 시계열을 유지합니다.
  2. 둘째, 기본 시계열 테이블 위에 자리하면서 원시 Twitter 데이터로부터 특징을 추출하는 뷰를 SQL에서 정의합니다. 우리는 모델이 그 다음 10분의 기간 내에 특정 해시태그에 대해 트윗 발생 수를 예측할 수 있도록 하는 특징을 선택했습니다. 구체적인 사항은 다음과 같습니다.

  • #해시태그
#핀테크는 #블록체인이나 #브렉시트와는 전혀 다른 행태로 나타날 수 있으므로 모델이 이 점을 특징으로 인식하고 있어야 합니다.
  • 요일
일요일의 트윗 행태는 목요일의 트윗 행태와는 다를 것입니다.
  • 하루 중 특정 기간
우리는 24시간으로 이루어진 하루를 144개의 10분 단위 세그먼트로 나누어 모델이 24시간 주기의 다양한 부분 간에 발생하는 추세의 차이점에 대해 알려줄 수 있도록 했습니다.
  • 지난 1시간의 평균 트윗 수
이 값은 기본 시계열 데이터를 기반으로 하는 뷰로 계산됩니다.
  • 지난 1시간의 평균 트윗 속도
미래의 트윗 수를 정확히 예측하려면 해당 해시태그가 이전 1시간 동안 얼마나 활발하게 쓰였는지, 그리고 그러한 활동이 완만한 추이로 이루어졌는지(예: 지난 6차례의 10분 기간에서 각각 일정하게 100회의 트윗 발생) 아니면 갑자기 이루어졌는지(예: 5차례의 10분 기간에서는 트윗이 하나도 없다가 한 차례의 10분 기간에서 600개의 트윗이 갑자기 발생) 여부를 모델이 알아야 합니다.
  • 트윗 카운트 범위
이것은 우리의 라벨로, 모델이 예측할 마지막 출력값입니다. 작업 서버에서 실행되는 계약 발행 프로세스는 각각의 해시태그와 10분의 기간에 대한 행사 범위(범위 1: 0~100, 범위 2: 101~250 등)가 있는 옵션 계약을 발행하기 위한 로직을 포함합니다. 우리는 대규모의 과거 Twitter 데이터세트를 선택하고 똑같은 로직을 사용하여 각각의 예에 내가격이었을 범위를 표시하는 라벨로 스탬핑했습니다. 주식에 대해 발행되는 개별주식 옵션 체인은 특정 주식의 주가 기록으로 알려지는 것과 마찬가지로, 우리 거래소의 옵션 체인은 기본 해시태그의 볼륨 기록으로 알려집니다.
이 SQL 뷰에서 모델을 훈련합니다. BigQuery ML은 모델 훈련을 놀랍도록 접근하기 쉬운 연습으로 만들어 줍니다. 데이터 웨어하우스 내에 머무르는 동안, 우리는 SQL 문을 사용하여 원본 데이터가 들어 있고 특정 열을 라벨로 사용하는 특정 뷰에서 훈련한 모델을 만들고 싶다고 선언합니다.
마지막으로, 프로덕션 환경에 훈련한 모델을 배포합니다. 다시 SQL을 사용하여 임의의 테이블을 쿼리하는 것과 마찬가지로 특정 입력 매개변수를 기반으로 간단히 모델을 쿼리합니다.

옵션 계약 거래
매력적인 환경을 만들기 위해, 우리는 참석자(거래 집단)가 계약과 참가자 성과를 추적할 수 있도록 여러 가지 대형 '시장 데이터' 화면을 배치함으로써 어느 정도는 공개 호가 시장 분위기를 내고 싶었습니다. 데모 참가자들은 거래소에서 Pixel 2 핸드셋을 들고 간단한 UI를 사용하여 주문을 냈는데, 여기서 세 가지 해시태그 중 일부나 전부에 크레딧을 할당할 수 있었습니다. 참가자는 주문을 낼 때 자체적인 예측에 의존하거나 현재 시장에서 거래 중인 계약의 목록 중에서 특정한 옵션 포트폴리오에 대한 BigQuery ML 모델의 예측을 사용하는 방법 중에서 선택했습니다. 참가자는 특정 계약에 대한 거래가 체결된 후에는 다른 '트레이더'와 실시간으로 거래의 성과를 모니터링한 다음 (10분마다) 만기에 거래 시간이 종료될 때 각각의 예측이 얼마나 정확했는지 확인했습니다.

ML 훈련 프로세스
트윗 볼륨에 대한 유용한 예측 결과를 손쉽게 생성하기 위해, 우리는 세 부분으로 이루어진 프로세스를 사용합니다. 첫째, 트윗 시계열 데이터를 BigQuery 테이블에 저장합니다. 둘째, 모델 훈련에 필요한 특징과 라벨을 추출하기 위해 이 테이블 위에 뷰가 층을 이루며 놓이도록 계층을 만듭니다. 마지막으로, BigQuery ML을 사용하여 모델을 훈련하고 모델에서 예측 결과를 얻습니다.


Store Tweet time series data.png

카운트할 해시태그의 정식 목록은 'hashtags'라는 이름의 BigQuery 테이블 내에 저장됩니다. 이 목록은 'tweets' 테이블과 조인되어 각 기간에 대한 집계 결과를 결정합니다.

예시 1: 'hashtags' 테이블의 스키마 정의

 "schema": {
   "fields": [
     {
       "type": "STRING",
       "name": "hashtag",
       "mode": "REQUIRED"
     }
   ]
 }

1. 트윗 시계열 데이터 저장 

트윗 리스너는 아래의 예시 2에 나열된 스키마를 보유하는 'tweets'라는 이름의 BigQuery 테이블에 태그, 타임스탬프 및 기타 메타데이터를 작성합니다.

예시 2: 'tweets' 테이블의 스키마 정의

 "schema": {
   "fields": [
     {
       "type": "STRING",
       "name": "tweet_id"
     },
     {
       "type": "STRING",
       "name": "hashtag",
       "mode": "REQUIRED"
     },
     {
       "type": "TIMESTAMP",
       "name": "twitter_timestamp",
       "mode": "REQUIRED"
     },
     {
       "type": "TIMESTAMP",
       "name": "system_timestamp"
     },
     {
       "type": "STRING",
       "name": "tweet_text"
     },
     {
       "type": "FLOAT",
       "name": "user_latitude"
     },
     {
       "type": "FLOAT",
       "name": "user_longitude"
     },
     {
       "type": "STRING",
       "name": "user_language"
     }
   ]
 }




2. 계층화된 뷰를 통해 특징 추출

최하위 수준 뷰는 하루 중의 기간별로 각 해시태그의 일치하는 항목 수를 계산합니다. 중간 수준 뷰는 위 섹션('데이터 구조화 및 모델링')에서 모니터링되는 특징을 추출합니다. 그런 다음 최상위 수준 뷰가 시계열 데이터에서 라벨(즉, '내가격이었을' 행사 범위)을 추출합니다.

a. 최하위 수준 뷰 
최하위 수준 뷰는 예시 3에서 SQL에 의해 정의됩니다. 뷰 정의는 해시태그를 기준으로 트윗 기록을 10분 버킷으로(24시간의 일일 기준으로 이러한 버킷이 144개 있음) 집계하는 로직을 포함합니다.
예시 3: 최하위 수준 뷰 정의


 (
 WITH
   ht_wndw AS (
   SELECT
     tw.hashtag,
     DATE( twitter_timestamp ) date,
     FORMAT_TIMESTAMP( "%E4Y", twitter_timestamp ) year,
     FORMAT_TIMESTAMP("%U",twitter_timestamp ) week,
     CAST(CAST(FORMAT_TIMESTAMP("%w",twitter_timestamp ) AS INT64)+1 AS STRING) day,
     --Use MOD() to find out how many seconds have passed since midnight. Then, convert “number
     --of seconds” to “number of 10-minute windows”
     FORMAT("%03d",CAST (TRUNC (MOD( UNIX_SECONDS(twitter_timestamp), (6*60*10*24) ) / (10*60) )+1 AS INT64) ) wndw,
     twitter_timestamp ts
   FROM
     derivatives.hashtag.hashtags
   JOIN
     derivatives.hashtag.tweets tw
   USING
     (hashtag) )
 SELECT
   CONCAT(hashtag,'-',year,week,day,wndw) AS row_id,
   CONCAT(year,week,day,wndw) AS wndw_id,
   COUNT(*) num_tweets,
   hashtag,
   year,
   week,
   day,
   wndw,
   date
 FROM
   ht_wndw
 GROUP BY
   hashtag,
   year,
   week,
   day,
   wndw,
   date
 ORDER BY
   wndw_id DESC )


b. 중간 수준 뷰

일부 특징(예: 해시태그, 요일 또는 하루 중 특정 기간)은 간단히 선택할 수 있는 반면, 다른 특징(예: 지난 1시간 동안의 평균 트윗 수 및 속도)은 좀 더 복잡합니다. 예시 4의 SQL은 이처럼 더 복잡한 특징의 선택을 설명한 것입니다.

예시 4: 특징 추가를 위한 중간 뷰 정의
 (
 WITH
   wndw_plus_prior_deltas AS (
   WITH
     wndw_plus_prior AS (
     SELECT
       wh.row_id,
       wh.wndw_id,
       wh.hashtag,
       wh.year,
       wh.week,
       wh.day,
       wh.date,
       wh.wndw,
       wh.num_tweets,
       IFNULL(SAFE.LN(wh.num_tweets), 0) as log_num_tweets,
       LAG(num_tweets) OVER(hashtag_ten_minute_window) prior_num_tweets,
       IFNULL(SAFE.LN(LAG(num_tweets) OVER(hashtag_ten_minute_window)),
         0) AS log_prior_num_tweets
     FROM
       derivatives.hashtag.zerofill_windowly_hashtag wh
     WINDOW
       hashtag_ten_minute_window AS (
       PARTITION BY
         hashtag
       ORDER BY
         YEAR,
         week,
         DAY,
         wndw ASC) )
   SELECT
     row_id,
     wndw_id,
     hashtag,
     YEAR,
     week,
     DAY,
     date,
     wndw,
     num_tweets,
     log_num_tweets,
     prior_num_tweets,
     log_prior_num_tweets,
     (num_tweets-prior_num_tweets) num_tweets_delta,
     (log_num_tweets-log_prior_num_tweets) log_num_tweets_delta
   FROM
     wndw_plus_prior
   WHERE
     1=1
   ORDER BY
     row_id,
     wndw_id)
 SELECT
   row_id,
   wndw_id,
   hashtag,
   YEAR,
   week,
   DAY,
   date,
   wndw,
   num_tweets,
   log_num_tweets,
   prior_num_tweets,
   log_prior_num_tweets,
   num_tweets_delta,
   log_num_tweets_delta,
   AVG(log_num_tweets_delta) OVER (hashtag_prior_hour_window) avg_log_num_tweets_delta,
   AVG(log_prior_num_tweets) OVER (hashtag_prior_hour_window) avg_log_prior_num_tweets
 FROM
   wndw_plus_prior_deltas
 WHERE
   1=1
 WINDOW
   hashtag_prior_hour_window AS (
   PARTITION BY
     hashtag
   ORDER BY
     YEAR,
     week,
     DAY,
     wndw ROWS BETWEEN 6 PRECEDING
     AND 1 PRECEDING)
 ORDER BY
   row_id DESC,
   wndw_id DESC)

c. 최상위 수준 뷰

이전 뷰에서 필요한 특징을 모두 선택했으므로, 이제는 라벨을 선택할 차례입니다. 라벨은 주어진 과거 해시태그와 10분의 기간에 대해 내가격이었을 행사 범위여야 합니다. 애플리케이션의 'Contract Issuance' 일괄 작업은 10분의 기간마다 행사 범위를 생성하고 'Expiration and Settlement' 작업은 어떤 계약(계약 범위)이 내가격 조건에 부합했는지 판별합니다. 모델 훈련을 위해 과거의 예시에 라벨을 지정할 때는 이와 정확히 똑같은 애플리케이션 로직을 적용하는 것이 매우 중요합니다.

예시 5: 최상위 수준 뷰
 WITH
 add_log_fs AS (
 SELECT
   ft.row_id,
   ft.wndw_id,
   ft.hashtag,
   ft.year,
   ft.week,
   ft.day,
   ft.date,
   ft.wndw,
   ft.num_tweets,
   ft.log_num_tweets,
   ft.prior_num_tweets,
   ft.log_prior_num_tweets,
   ft.avg_log_prior_num_tweets,
   ft.num_tweets_delta,
   ft.log_num_tweets_delta,
   Ft.avg_log_num_tweets_delta,
   --Case statements determine the ITM contract range (1-7) of a historical hashtag/window’s count, had the
   --game been operating at the time of the historical example
   CASE
     WHEN (ft.num_tweets = 0 OR ft.num_tweets < (av.avg - (av.avg * 0.3))) THEN 'One'
...
     WHEN ft.num_tweets > (av.avg + (av.avg * 0.3)) THEN 'Seven'
     ELSE 'No Cat'
   END AS series,
   av.avg avg_num_tweets_for_wndw_day,
   IFNULL(SAFE.LN(av.avg),
     0) AS log_avg_num_tweets_for_wndw_day
 FROM
   derivatives.hashtag.zerofill_windowly_hashtag_feats ft
 JOIN
   derivatives.hashtag.avg_counts av
 ON
   ft.date = av.as_of_date
   AND ft.day = av.day
   AND ft.wndw = av.wndw
   AND ft.hashtag = av.hashtag )
SELECT
 *
FROM
 add_log_fs
WHERE
 1=1
ORDER BY
 wndw_id DESC,
 row_id


3. 모델 훈련 및 모델에서 예측 결과 얻기
선택한 특징과 라벨을 포함한 뷰를 만들었으면 BigQuery ML 모델 생성문에서 이 뷰를 참조합니다.

예시 6: 모델 생성
 CREATE OR REPLACE MODEL derivatives.hashtag.count_predictor_logreg
OPTIONS
 ( model_type='logistic_reg',
   input_label_cols=['series']) AS
SELECT
 wh.series,
 wh.hashtag,
 wh.day,
 wh.wndw,
 wh.avg_log_num_tweets_delta,
 wh.avg_log_prior_num_tweets
FROM
 derivatives.hashtag.zerofill_windowly_hashtag_labels wh


그런 다음, 계약 발행 시점에 모델에 대해 어떤 계약이 내가격이 될지에 관한 예측을 불러오기 위한 쿼리를 실행합니다.

예시 7: 모드에서 예측 선택(SELECT... FROM)
 SELECT
 *
FROM
 ML.PREDICT (MODEL derivatives.hashtag.count_predictor_logreg,
   (
   SELECT
     wh.hashtag,
     wh.day,
     wh.wndw,
     wh.avg_log_num_tweets_delta,
     wh.avg_log_prior_num_tweets
   FROM
     derivatives.hashtag.zerofill_windowly_hashtag_labels wh
   WHERE
     1=1
     AND wh.wndw='044'
     AND wh.hashtag='brexit'
     AND wh.date='2019-01-01') )

개선 사항
이 거래소는 비교적 짧은 리드 시간으로 빌드되었으므로, 일정에 맞춰 선보여야 하는 현실을 고려하여 아키텍처와 전술적 측면에서 여러 가지로 단순화를 추구했습니다. 앞으로 이 거래소의 반복 과정을 통해 다음과 같은 여러 가지 향상된 기능을 구현할 생각입니다.

Cloud Pub/Sub는 구체화된 데이터 파이프라인 아키텍처를 가능하게 해주는 요소로, 거래소의 솔루션 아키텍처 내에 있는 여러 가지 영역을 개선하기 위한 것입니다. 예를 들어 Cloud Pub/Sub는 필수 컴포넌트가 일괄 작업 지향적이 아니라 이벤트 중심이 되도록 허용함으로써 보고된 트윗 카운트의 지연 시간을 줄여줄 것입니다.

현재 아키텍처는 옵션 계약의 발행과 만료를 위해 Compute Engine 인스턴스에서 실행되는 Linux '크론'에 의존하는데, 이는 솔루션의 순수 관리 부담을 늘립니다. 팀에서는 (버전 1 아키텍처 배포 후) 작년 11월에 출시된 Cloud Scheduler를 사용하여 인프라 오버헤드는 줄이면서도 기능은 그대로 유지한 채로 제공할 수 있을 것입니다.

Pub/Sub 메시지를 BigQuery에 유지하는 것처럼, 데이터를 한 곳에서 다른 곳으로 단순히 이동하는 역할을 하는 코드가 솔루션에 불필요하게 많이 포함되는 일이 종종 있습니다. 개발팀에서는 Cloud Dataflow 템플릿을 사용하여 애플리케이션에서 이처럼 별다른 차이를 만들어내지 못하는 코드 행을 줄이고 수많은 공통 사용 사례를 위한 특정 파이프라인을 간단하게 구성하고 관리할 수 있습니다. 
  • 내부 데이터화한 트윗의 저장된 속성 확장

트윗의 지리적 출처와 내부 데이터화한 트윗의 실제 텍스트를 저장하면 향후 계약을 정의하기 위한 더욱 풍부한 기초를 제공할 수도 있습니다. 예를 들어 특정 해시태그에 대한 트윗 콘텐츠에 관해 감정 분석을 수행하여 어떤 주제에 관한 전반적인 감정과 관련된 바이너리 계약을 발행할 수 있습니다.
  • 일괄 작업과 모델 실행 중에서 중복 코드를 없애기 위한 BigQuery 사용자 정의 함수(UDF) 고려

10분이라는 간격으로 시간을 재치 있게 다루는 기능과 같은 특정 기능은 아키텍처의 여러 주요 요소에서 요구되는 기능이며, 팀이 SQL과 자바스크립트로 모두 중복 알고리즘을 배포하는 결과를 낳았습니다. 팀에서는 BigQuery UDF를 사용하여 일단 자바스크립트로 알고리즘을 작성하고, 자바스크립트 일괄 프로세스뿐 아니라 BigQuery ML 모델에서도 같은 코드 자산을 활용할 수 있습니다.

exchange dashboard.png트레이딩 세션 중 거래소 대시보드의 스크린샷

BigQuery ML에 대해 더 자세히 배워보고 싶으면 Google의 관련 문서를 참조하거나, 더 광범위한 자료를 보고 싶으면 금융 서비스 산업을 위한 우리의 솔루션을 살펴보거나 이 대화식 BigQuery ML 둘러보기 동영상을 시청하시기 바랍니다. 혹시 샌프란시스코에서 열리는 Google Next ‘19에 참석할 기회가 있다면 직접 거래소를 체험해볼 수도 있습니다.