お客様感謝Day2020開催しました

こんにちは。マネックス・ラボの渡瀬です。

マネックス証券株式会社では、2020年2月16日(土)に、マネックス証券に口座をお持ちの方を対象にした会場型セミナー「お客様感謝Day2020」を開催しました。

お客様感謝Dayはお申込みいただいたお客様の中から抽選で当選した方をご招待しています。
残念ながら落選してしまった方や、遠方にお住いの方には、当日にイベントの内容をリアルタイムで動画配信をしております。

また、今年は新型肺炎対策ということもあり、オンラインでのご視聴も今まで以上にご案内し、オンラインでの視聴数は過去最高でした。

  

当日は11:30の開場とともに、多くのお客様がご来場されました。
開場前からお待ちいただいた方もいらっしゃいました。
ありがとうございます!お待たせして申し訳ありません。

イベントは第1部~4部まであり、大盛況でした。

f:id:monex_engineer:20200221145559j:plain

大盛況のメイン会場

第1部、2部のスペシャルセッション

  • 「日本企業が"グローバル" "ローカル"で勝つために大切なこと」
  • 「激動の世界経済と今、日本投資家が得られる投資機会」

こんなことをテーマに、マネックス証券松本と株式会社経営共創基盤 代表取締役CEO
冨山和彦氏、カタリスト投資顧問 シニア・グローバル・アドバイザー イェスパー・コールと熱く語っていただきました。

f:id:monex_engineer:20200221150844j:plain

第2部の松本とイェスパーのスペシャルセッション

第3部は元オリンピック代表が語る

今年はオリンピックイヤーですね、ということで、「スポーツ業界が与える日本への効果と今後の展望について」をテーマに、元日本代表の方をお呼びして、トークショーを開催しました。
オリンピック代表に内定した時、実はその裏で...等などオリンピックにまつわるお話をしていただきました。

 

第4部のパネルディスカッション

第4部は当社の人気ストラテジスト、アナリスト、コンサルタントたちによるパネルディスカッションが繰り広げられました。 

f:id:monex_engineer:20200221145640j:plain

白熱するパネルディスカッション

メイン会場以外こんな感じ

メイン会場の他には協賛企業や当社商品ご案内ブースもありました。

f:id:monex_engineer:20200221161155j:plain

各ブースをめぐるお客様


サービスのビラをお渡ししたり、商品のご案内をしたり。

投信・NISA・iDeCoのブースでは、iDeCoの仕組みについて知りたい、とおっしゃる方が多かったです。

f:id:monex_engineer:20200221150535j:plain

投資信託・NISA・iDeCoのブース



約5時間と長丁場のイベントでしたが、熱気は伝わりましたでしょうか。
ご来場いただいた皆様、ありがとうございました。

 

渡瀬 桂システム開発マネックス・ラボ

マネックス流プロジェクトの終わり方!

こんにちは、企画設計グループのKSです。

■ご存じでしたか?

突然ですが、昨年7月から国内上場株式の決済期間が短縮されたのはご存知でしょうか?
それまでは約定日から起算して4営業日目が決済日(受渡日)でしたが、短縮により3営業日目が決済日(受渡日)となるように株式決済制度が改変されました。

これ「単に1日短くなるだけでしょ!」と思われるかもしれませんが、株式の取引を行うお客様(特に株主優待等の権利を取りたいお客様)に影響があるのはもちろんで、証券決済に関わる業務をより効率よくするために業務フローの見直し等が必要だったり、効率化するための自動化が必要だったりと、そこそこ大変でした。

そしてシステム対応を担当した私としては、決済日(受渡日)という至極全般に関わる"アイテム"なだけに、影響確認あるいは無影響であることの確認が株式システム全体に必要となるため、膨大なテストを実施しなければなりませんでした。
あんな苦労やこんな苦労、とまぁ思い起こせばたくさん(愚痴を含めてw)ありましたが、それでもなんとか無事に本番移行作業も終え、プロジェクトの最後は笑って締めくくりたいもの!
そうです!私の最後の仕事は、“ウチアゲ”
お酒が弱い人にも楽しんでもらおうと、今回は屋内BBQです。
(当社の打ち上げは、お酒を強要しません。)
苦難を共有した仲間との打ち上げパーティーは格別、
そんな達成感、一体感を再確認させてくれたメンバーはこちら↓

f:id:monex_engineer:20200212162804j:plain

(この場を借りて、プロジェクトメンバーの皆さん! ほんとうにありがとーーーーー!!)
さぁて、次のプロジェクトの打ち上げは・・・一緒に企画してくれるメンバー募集中。
(注:もちろん本来の仕事もしっかり遂行してるので、そこは誤解なく)

BigQueryからJSON形式で取得したデータをS3にPutするLambdaをSAMで構築する

こんにちは、証券企画室エンジニアの田代です。
先日、私たちが開発しているferciと言うスマホアプリに、コミュニティ機能に続いて株取引機能が追加されました。
最短4タップで株取引ができます。是非使ってみてください。

はじめに

昨今機械学習やデータ分析が大変身近なものになり、それに伴って様々なBIツールやSaaSが登場しました。
そう言った中で、技術的な理由、何らかの経緯や事情によりデータの在りかが複数のプラットフォーム上に分散してしまい、集約する必要が出てくるケースもあるのではないでしょうか。
そこで今回は、Googleが提供するBI SaaSであるBigQuery上のデータをS3上に保管するLambda関数を、SAMで構築する方法をご紹介したいと思います。

AWS SAMについて簡単に

AWS SAM(Serverless Application Model)とは、CloudFormationのテンプレートを拡張したYAML(またはJSON)ファイルに基づいて、 Lambdaをビルド、CFnスタックとしてデプロイすることができるフレームワークです。
当記事ではテンプレートの記述内容を取り上げますので、 インストールやCLIの操作方法については公式のGitHubなどをご覧頂ければと思います。
github.com

やりたいこと

f:id:monex_engineer:20200115170111p:plain BigQueryからデータを取得する方法としてExtract JobやStorage APIを使うといったいくつかのオプションが存在しますが、 今回はシンプルにPythonでクエリを実行して1つのテキストファイルとして保存する方法を取りたいと思います。
この方法は手間はかかりませんが、ファイルサイズがLambdaの/tmp領域の上限である512MBまでになる、といった制約があることに注意してください。

実装とテンプレート

f:id:monex_engineer:20200115170137p:plain

# coding: utf-8

import boto3
from google.cloud import bigquery


bq = bigquery.Client()
s3 = boto3.resource('s3')


def lambda_handler(event, context):
  project = event['gcp_project'] # GCPのプロジェクト名
  dataset = event['bq_dataset'] # BigQueryの対象データセット名
  table = event['bq_table'] # BigQueryの対象テーブル名
  bucket_name = event['bucket_bame'] # 保管先のS3バケット名

  # Build and execute a query string
  query = 'SELECT TO_JSON_STRING(t) FROM (SELECT * FROM `{}.{}.{}`) AS t'.format(project, dataset, table) # *1
  res = bq.query(query).result()

  # Write results to a temporary file
  tmp_file = '/tmp/foo.txt'
  with open(tmp_file, mode='w', encoding='utf-8') as f:
    for row in res:
      f.write(row[0] + '\n')

  # Upload a file to a S3 bucket
  bucket = s3.Bucket(bucket_name)
  s3_object = 'raw/' + dataset + '/' + table + '.txt' # *2
  bucket.upload_file(
    tmp_file,
    s3_object,
    ExtraArgs={
      'ContentType': 'text/plain',
      'ACL': 'bucket-owner-full-control' # *3
    }
  )
  print('Upload completed: ' + bucket_name + '/' + s3_object)

  return {
    'statusCode': 200,
    }

*1 クエリ文字列を構築します。BigQueryの入れ子構造のデータに対応するため、TO_JSON_STRING()関数を使ってJSON形式で取得します。
*2 保管先のS3のプレフィックスとファイル名を指定します。日付毎にフォルダを切りたい場合は追加で指定してください。
*3 ファイルのACLを指定します。サンプルではバケットの所有者にフルアクセスを付与していますが、望ましくない場合は適宜指定してください。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample template
Resources:
  SampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.7
      Environment:
        Variables:
          GOOGLE_APPLICATION_CREDENTIALS: './gcp-credential.json'
      Events:
        SampleEvent1:
          Type: Schedule
          Properties:
            Schedule: cron(0 0 ? * * *)
            Name: SampleEvent1
            Description: A sample cron event
            Input: '{"gcp_project: "foo", "bq_dataset": "bar", "bq_table": "hoge", "bucket_name": "fuga"}'
            Enabled: True

line 12: PythonGCPモジュールは環境変数GOOGLE_APPLICATION_CREDENTIALSを参照して接続用の認証情報を取得するので、認証情報を記載したファイルのパスをここで指定します。
サンプルではlambda_function.pyと同じ階層にgcp-credential.jsonが置かれている想定です。
line 17: Lambdaの起動条件としてCloudWatch EventsのcronスケジュールをUTCで指定します。
line 20: Lambdaに渡す引数をJSON形式で指定します。

boto3
google-cloud-bigquery

まとめ

上記のテンプレートを使用してビルド、デプロイすると、BigQueryのデータをS3にPutするLambda関数とCloudWatch Eventsを、Pythonの依存関係を解決しながらまとめて構築することができます。
これで、BigQuery上に存在していたデータをAWSのAthenaやGlueなどから扱えるようになりました。
実際の運用時には数GB以上のデータを扱いたい、イベントドリブンでリアルタイム処理がしたい、などの要件が出てくると思いますし、 そういったケースでは今回ご紹介した仕組みでは対応しきれなくなりますが、スモールスタートでとりあえずやってみたいといった際の参考にして頂ければと思います。

田代 侑大証券企画室 エンジニア