#Quantopian で Future の残存期間を調べる

## 天然ガスが気になる

先週から天然ガス先物が気になっているしんせいたろうです．こんにちわ．

[＜中国＞天然ガス輸入急増 「青空作戦」で価格は半年で２倍(毎日新聞)](https://news.finance.yahoo.co.jp/detail/20180215-00000086-mai-bus_all)や，[北海道の開発含む 中国「氷上のシルクロード」東京ですでに説明会(フィスコ)](https://news.finance.yahoo.co.jp/detail/20180216-00933008-fisf-bus_all)を読んで天然ガスとかLNGが気になって気になって，夜しか眠れません．

とりあえず，手始めに天然ガスの先物を調べてみようと思い，Quantopianで先物のデータを取得するところを学んだので，メモ程度ですがシェアします．

## Quantopianのチュートリアル

本家のチュートリアルはココにあります．
[Quantopian Tutorials](https://www.quantopian.com/tutorials/futures-getting-started "Quantopian Tutorials")


## 天然ガスのcontinuous future を取得

天然ガス以外の先物symbol名は[available futures](https://www.quantopian.com/help#available-futures)をご参照下さい．下記のコードのroot_symbolを変更すればどれでも取れると思います．

```python
from quantopian.research.experimental import continuous_future, history
import pandas as pd

root_symbol = 'NG' #Natural Gas
future0 = continuous_future(root_symbol)
future1 = continuous_future(root_symbol, offset=1,) # offset を指定しない場合は期近．offset=1 で次の限月．

futures = history([future0,future1], fields='price', frequency="daily",
                  start="2015-1-1", end="2016-1-1")

# コラム名にfuture objectが入るので，扱いやすくするためにシンボル名とオフセット番号に書き換えます
futures.columns = futures.columns.map(lambda x: x.root_symbol + str(x.offset))

```
![Screenshot from 2018-02-19 14-58-39.png](https://qiita-image-store.s3.amazonaws.com/0/14019/63c93fe4-272e-ee51-16c0-49646b473f10.png)

## 残存期間を取得

**2018/02/24 Updated**　間違ってました！書き直しましたごめんなさい。

参照 : [python - Right way to reverse pandas.DataFrame? - Stack Overflow](https://stackoverflow.com/questions/20444087/right-way-to-reverse-pandas-dataframe/20444256#20444256 "python - Right way to reverse pandas.DataFrame? - Stack Overflow")


```python
from quantopian.research.experimental import continuous_future, history
import numpy as np

root_symbol = 'NG'
future0 = continuous_future(root_symbol)
future1 = continuous_future(root_symbol, offset=1, )

futures = history([future0,future1], fields=['price', 'contract'],frequency="daily",
                  start="2017-1-1", end="2018-2-1")

futures.minor_axis = futures.minor_axis.map(lambda x: x.root_symbol + str(x.offset))


def nan_or_1(x):
    if x:
        return np.nan
    else: 
        return 1
    
def remaining_days(s_rolldate):
    v = s_rolldate.apply(nan_or_1).iloc[::-1] ## iloc[::-1] は index を reverse する一番簡単な方法
    n = np.isnan(v)
    a = ~n
    c = np.cumsum(a)
    d = np.diff(np.concatenate(([0.], c[n])))
    v[n] = -d
    return np.cumsum(v).iloc[::-1]

contract = futures['contract']
contract["rolldate?"] = contract["NG0"] != contract["NG0"].shift(-1)
contract["remaining_days"] = remaining_days(contract["rolldate?"] )

contract
```
![Screenshot from 2018-02-24 17-37-27.png](https://qiita-image-store.s3.amazonaws.com/0/14019/54657ecb-030c-5769-5c35-890d0732ea0d.png)




## 次回のQuantopian勉強会

次回勉強会は[Tokyo Quantopian User Group Vol.03 ペアトレを学ぼう](https://quantopian-tokyo.connpass.com/event/79618/ )です．先物に関しては何もしませんが，Quantopianやペアトレーディングに興味がある方はぜひお越し下さい(^^)




<!-- 
以前のコードも残しておきます


残存期間の取得方法はチュートリアルに載っていなかったので書いてみました．

上記の```fields='price'``` で，```'contract'``` を渡すとコントラクト情報が得られます．もちろん ```fields=['price','contract']``` で一度に取得することもできます．その時はPanelが返ってきます．

```python
futures = history([future0,future1], fields='contract', frequency="daily",
                  start="2015-1-1", end="2016-1-1")
futures.columns = futures.columns.map(lambda x: x.root_symbol + str(x.offset))
```

![Screenshot from 2018-02-19 15-04-23.png](https://qiita-image-store.s3.amazonaws.com/0/14019/8b5512a3-958c-9e08-ce1c-7d1b401789c9.png)

コントラクトオブジェクト属性の```expiration_date```を使って満期日を取得し残存期間を算出します．

```python
def get_expiration_date(contract):
    return contract.expiration_date

futures["expiration_date"] = futures["NG0"].apply(get_expiration_date)
futures["date"] = futures.index # このコラムは計算用なので，↓の引き算したとは消した方が良いと思う．
futures["remaining_duration"] = (futures["expiration_date"] - futures["date"]).dt.days
```

![Screenshot from 2018-02-19 15-36-58.png](https://qiita-image-store.s3.amazonaws.com/0/14019/2dd9a2b7-a014-f2c9-c0f0-25a269c880d6.png)

でけた．
 -->