Quantopian Tutorial2 Lesson3,4 ファクターと結合

[前回](https://qiita.com/isaotinen/items/460645528f68a528ae98)の続き。

###Factors
ファクターは資産からの関数。パイプラインでもっとも使用される用語であり、数値計算結果を表す。因数にはデータだけでなく日数の長さも入力する。
パイプラインのもっとも単純な要素は組み込み要素であり、あらかじめ一般的な計算を実行するために構築されている。最初の例では10日間の入力データの平均値を計算する`SimpleMovingAverage`を使用する。最初に組み込み要素の`SimpleMovingAverage`と価格データセットの`UsequityPricing`をインポートする。

```py3
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import SimpleMovingAverage
```

###Factorの作成
次に、`make_pipeline`関数を使って`SimpleMovingAverage`ファクタをインスタンス化する。`inputs`と呼ばれる`BoundColumn`オブジェクトにリストするオブジェクトと、移動平均計算で受け取るデータの日数を示す`window_length`の二つを引数として設定する。（`BoundColumn`については後述。どのような種類のデータをファクタに渡すかを示すオブジェクト）
次の行は有価証券の１０日間の終値の平均を計算するためのファクタを作成する。

```py3
 mean_close_10 = SimpleMovingAverage（
 　　inputs = [USEquityPricing.close]、
　　 window_length = 10
 ） 
```

実際には計算を実行しないことに注意する。ファクターを作成することは関数を定義することである。計算するにはパイプラインに追加する必要がある。

###パイプラインにファクターを追加する
元の空のpipelineを更新して新しい移動平均ファクターを計算してみる。ファクターのインスタンスを`make_pipeline`に移し、`columns`に渡す。

```py3
def make_pipeline():
    
    mean_close_10 = SimpleMovingAverage(
　　　　inputs=[USEquityPricing.close], 
　　　　window_length=10
　　)
    
    return Pipeline(
        columns={
            '10_day_mean_close': mean_close_10
        }
    )
```

パイプラインを実行し、最初の数行を表示すると以下の通り。

```py3
result = run_pipeline(make_pipeline(), '2015-05-05', '2015-05-05')
result.head()
```

![pipeline1_l3_screenshot1-251d1ed4fe0e803c2734a2950260449aee6ddccb21526fb44e687f0306b61b16.png](https://qiita-image-store.s3.amazonaws.com/0/200508/617c1ce5-3e90-b479-90b8-2cefc15720a9.png)

`Pipeline.add`メソッドを使って、既存のパイプラインインスタンスにファクターを追加することもできる。

```py3
>>> my_pipe = Pipeline()
>>> f1 = SomeFactor(...)
>>> my_pipe.add(f1)
```

###Latest
もっとも一般的に使用されている組み込みファクターは`Latest`であり、与えられたデータ列の最新の値を取得する。他の要素とは異なる形でインスタンス化されるほど一般的。最善の策は`.latest`属性を取得すること。`make_pipeline`をアップデートして終値をパイプラインに追加してみる。

```py3
def make_pipeline():

    mean_close_10 = SimpleMovingAverage(
        inputs=[USEquityPricing.close],
        window_length=10
    )
    latest_close = USEquityPricing.close.latest

    return Pipeline(
        columns={
            '10_day_mean_close': mean_close_10,
            'latest_close_price': latest_close
        }
    )
result = run_pipeline(make_pipeline(), '2015-05-05', '2015-05-05')
result.head()
```

![pipeline1_l3_screenshot2-61cda1fd4a2fd63ca66089b30bc76eb5a268df821c04064d23f9b02bd3585866.png](https://qiita-image-store.s3.amazonaws.com/0/200508/138999f0-e8a4-d80d-6d5f-d8ea9b9daa60.png)

###デフォルトinputs
一部のファクターにはデフォルトでinputs設定されていて変更してはいけない。例えばVWAP組み込み係数（出来高加重平均）は常に`USEquityPricing.close``USEquityPricing.volume`から計算する。`inputs`を指定せずに呼び出すことができる。

```py3
from quantopian.pipeline.factors import VWAP
vwap = VWAP(window_length=10)
```

###要素の結合
ファクターは組み込みの数学演算子を使って他のファクターとスカラー値の結合が容易に可能である。

```py3
>>> f1 = SomeFactor(...)
>>> f2 = SomeOtherFactor(...)
>>> average = (f1 + f2) / 2.0
```

ここでは１０日間の平均価格係数と３０日間の平均価格係数を組み合わせて`percent_difference`係数を計算するパイプラインを作る。

```py3
mean_close_10 = SimpleMovingAverage(
    inputs=[USEquityPricing.close],
    window_length=10
)
mean_close_30 = SimpleMovingAverage(
    inputs=[USEquityPricing.close],
    window_length=30
)
percent_difference = (mean_close_10 - mean_close_30) / mean_close_30
```

`percent_difference`はファクターであり、パイプラインにコラムとして加えることができる。

```py3
def make_pipeline():

    mean_close_10 = SimpleMovingAverage(
        inputs=[USEquityPricing.close],
        window_length=10
    )
    mean_close_30 = SimpleMovingAverage(
        inputs=[USEquityPricing.close],
        window_length=30
    )

    percent_difference = (mean_close_10 - mean_close_30) / mean_close_30

    return Pipeline(
        columns={
            'percent_difference': percent_difference
        }
    )
result = run_pipeline(make_pipeline(), '2015-05-05', '2015-05-05')
result.head()
```

![pipeline1_l4_screenshot1-aca918e81ba76b53075da9697cfe8e47b95a770b7223fc6fc6b102983c590e4f.png](https://qiita-image-store.s3.amazonaws.com/0/200508/1a927a6f-b00a-478d-b218-6ae0bfccdd8c.png)


###所感
これはもうMACDの原型を作ったようなものである。RSIなどは組み込み関数として用意されているし、Overviewを見てみると主要なテクニカル分析はサンプルコードが置いてあるので、テクニカル分析をバックテストするのも容易にできそうな印象を受ける。