IntelliJ でFlutter 開発できるようにする

IntelliJ でFlutter開発できる環境をセットアップするまで。

環境

1. Flutter のセットアップ

Flutter SDKをインストール

こちらの手順に従っておけば大丈夫

macOS install | Flutter

FlutterをインストールするとDart SDK も自動的についてくる

アプリを作成する

とりあえず公式のサンプル通りに作ってみる。

macOS install | Flutter

2. IntelliJ をセットアップする

Preference > Language & Frameworks > Flutter

Flutter SDK path: にFlutter をインストールしたディレクトリのpathを設定する f:id:teriyaki398:20211027221628p:plain

Preference > Language & Frameworks > Dart

上記のpath + /bin/cache/dart-sdkDart SDKのpath。Dart SDK path: の項目に入力する

/{directory path}/flutter/bin/cache/dart-sdk

f:id:teriyaki398:20211027222133p:plain

Run > Edit Configurations... を設定する

+ボタンからFlutter を選択し、適当な名前とDart entrypoint を設定する。

公式のサンプルに従っている場合、/{directory path}/my_app/lib/main.dart でいいはず。

f:id:teriyaki398:20211027222433p:plain

f:id:teriyaki398:20211027222424p:plain

3. 実行してみる

ここまでセットアップすると、ビルド時の項目にSimulatorの項目も追加されているはず。あとは先ほど設定した実行プロファイルを選択して走らせてみよう。

f:id:teriyaki398:20211027222904p:plain

コードを編集したのち保存するか、⚡️アイコンを押すとHot Reload ができる。

Unity: スクリプトから生成したオブジェクトにEventTriggerをアタッチする

Unityで生成されたオブジェクトにEventTriggerをアタッチする方法をメモとして残しておく。

やりたいこと

  1. スクリプトからGameObjectを生成する
  2. 生成されたオブジェクトをクリックしたときにイベントを発生させたい。

オブジェクトを生成する

とりあえず立方体オブジェクトを生成してみる。

1. 空のGameObject (BoxGenerator) をシーンに生成

f:id:teriyaki398:20210212231006p:plain

2. コンポーネントに以下のスクリプトを貼り付ける

今回はクラス名をBoxGeneratorとした。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoxGenerator : MonoBehaviour
{
    public GameObject box;

    // Start is called before the first frame update
    void Start()
    {
        Instantiate(box, new Vector3(0, 0, 0), Quaternion.identity);
    }

    // Update is called once per frame
    void Update()
    {}
}

3. スクリプトのboxにPrefabを参照させる

生成したいオブジェクトを選択する。 f:id:teriyaki398:20210212231017p:plain

シーンを実行すると、ちゃんと生成された。

次はこのオブジェクトにEventTriggerを付与してみる。 f:id:teriyaki398:20210212231507p:plain

EventTriggerを加える

1. EventSystemを生成する

UI>Event Systemからシーンに追加する

これが存在しないと正しくイベントを処理できないので注意!

f:id:teriyaki398:20210212233759p:plain:w300

2. CameraにPhysics Raycasterコンポーネントを追加する

これによりCameraを通じて、ポインタの位置から直線上にあるオブジェクトを判別できるようになる。

f:id:teriyaki398:20210212232336p:plain:w300

3. 生成するPrefabにColliderを設定する

以下の二点を確認する。 - 何らかのColliderが存在している - Is Triggerが有効になっている これらを付与することによって、先ほど設定したPhysics Raycasterの判別対象になる。

f:id:teriyaki398:20210212232048p:plain

4. 発生させるイベントのスクリプトを用意する

今回はクリックした場合に何かを起こすスクリプトを付与したいので、以下のような物を用意する。

今回はクラス名をTestEventTriggerとした。

using UnityEngine;
using UnityEngine.EventSystems;

public class TestEventTrigger : EventTrigger
{
    public override void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Box is clicked");
    }
}

注意点としては、 - using UnityEngine.EventSystemsを参照していること - EventTriggerを継承したクラスであること - 起こしたいイベントに対応するメソッドをoverrideすること

他の利用可能なメソッドについてはこちら

docs.unity3d.com

5. 生成したオブジェクトにアタッチする

先ほど作ったBoxGeneratorを改造する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoxGenerator : MonoBehaviour
{
    public GameObject box;

    // Start is called before the first frame update
    void Start()
    {
        GameObject boxObj = Instantiate(box, new Vector3(0, 0, 0), Quaternion.identity);
        boxObj.AddComponent<TestEventTrigger>();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
  • Instantiateの結果を変数に格納する
  • AddComponentメソッドから、先ほど作成したTestEventTriggerを加える

シーンを実行し、オブジェクトをクリックするとちゃんとConsoleにログが吐かれた。

f:id:teriyaki398:20210212234000p:plain

初心者でもプログラミングの力を使えば株式投資で儲けられるのか

TL;DR

  1. Pythonを用いて株価の分析をしてみよう
  2. 移動平均線ゴールデンクロスという分析手法をターゲットにした
  3. 過去データ元に本当に有用なのかシミュレーションしてみたら、盲信は危険だということが分かった

目的

つい最近まで株に関する知識はゼロだったのだが、最近興味が出てきたので色々と勉強をしている。

その結果、テクニカル分析という投資判断手法が存在することが分かった。簡単にいうと、チャートの傾向などを元に投資判断を分析するテクニックである。

テクニカル分析の記事などを読むと、「ここがこうなったら買いのサインで、こうなったら売りのサインですよ」という比較的分かりやすい指標がいくつも記されており、何とも簡単に儲かりそうに見えてしまう。。

今回はその中の1つである移動平均線ゴールデンクロスという分析手法に着目し、その分析手法がマジで役立つのかどうかを実験して確かめてみる。

移動平均線のクロス

皆さんも理解してることとは思うが、株価が低い時に買っておき、高い時に売ることができれば差額で儲けることができる。 まず最初に抑えておきたいのが、株価の変動にはトレンドというものが存在していて、何日も上昇し続けたり、反対に何日も下降し続けたりする。

じゃあそのトレンドを把握するためにはどうすればいいの?ということで、よく登場する分析指標の1つに移動平均線(SMA)というものがある。

仕組みはとても簡単で、決められた日数で平均価格を算出し、それを結んだ線のことである。

f:id:teriyaki398:20210125163737p:plain:w450

上のグラフは2019年のERY株価の変動を表している。25日、75日、120日の3本の移動平均線がプロットしてある。

例えば25日移動平均線の場合、各地点から過去25日間の平均値をプロットし続けている、といった具合。

決められた日数で平滑化することによって、株価の変動(トレンド )を捉えるのに役立つ。例えば120日移動平均線が上向きに推移している期間は、「株価が上昇傾向にある」ということができる。

ゴールデンクロスデッドクロス

ゴールデンクロスの発想は、株価が上昇トレンドへと変換したタイミングで買い、ひとしきり上がって、下降トレンドへ転換したときに売ることができれば、儲かるんじゃないの?ということである。

長期日数の移動平均線と短期日数の移動平均線を比較すると、当然ながら長期日数の方が直近の大きな株価の変動を受けにくい。

ゴールデンクロス

短期トレンドが長期トレンドを下から上に突き抜けたタイミング。株価のトレンドがここ最近で上昇トレンドに転換したことを表す。

デッドクロス

短期トレンドが長期トレンドを上から下に突き抜けたタイミング。株価のトレンドがここ最近で下降トレンドに転換したことを表す。

f:id:teriyaki398:20210125165613p:plain:w450

先程の株価について、例えば短期のトレンドを75日、長期のトレンドを120日としたとき、黄色と黒の矢印で示したタイミングがゴールデンクロスデッドクロスという訳である。

では、このクロスに全幅の信頼を置き、機械的に判断して売買したら、本当に儲かっているのだろうか・・・?

実験

楽天証券で取り扱っている米国株 3626銘柄 (2021年1月 時点)を対象に、2018年から現在までの株価に対して、ゴールデンクロスデッドクロスを全て見つける。

そして、買いタイミングでの株価と売りタイミングでの株価の倍率を計算した。以下のような具合である。

買い時点100円、売り時点 120円のとき、倍率は1.2倍

データソースには、pandas-datareaderを使った。(使い方は色々な方がまとめてくれているので、そちらをご参考ください)

Pythonのpandas-datareaderで株価を取得してみる① - Qiita

どの日数で移動平均線をとるかだが、私が使った教科書では「25日を短期、75日を長期」とせよとあったのでひとまずそれを参考にした。

結果

合計取引回数 15160件

1倍未満になった取引 10590件 (約70%)

損失になっている割合が過半数を超えてしまった。

ここで少し結果を眺めてみよう。青い三角は買いタイミングで、赤い三角は売りタイミングを表している。

f:id:teriyaki398:20210125190629p:plain:w450

これは成功しているパターン。目論見通り下降トレンドへ転換するタイミングで売り、上昇トレンドに転換するタイミングでしっかりと乗れていることがわかる。

f:id:teriyaki398:20210125190544p:plain:w450

そして、こちらが失敗しているパターン。このように、長い年月で見た時に下降トレンドとなっているような銘柄ではいい成果が出ていないようだ。

まとめ

テクニカル分析を行う際は、単一の指標を盲信するのではなく別の要素を絡めて判断するべき。

なので、長期トレンドの傾きを考慮したり、クロスする勢いなども合わせて考えると良い成果になりそうな予感はしている。

そして何より、株価チャートだけで判断するのではなく、企業自体の事業・業務内容などを元に絞り込んだ方が良さそうに思う。