QuantXのアルゴリズム審査、落ちた件について

#自己紹介
この度Smart Tradeでインターンすることになったゴンです。 

ゴンについて、知りたい方はこちら。
ブログ読んでねー

https://www.investor-gon.com/


ツイッターはこちら
https://twitter.com/gon_gon_tarou


初めての記事はこちら(QuantXを初めてみて)
https://qiita.com/investor-gon/items/2b1952ae5c2c88334c74


#初めてインターン生で申請し、初めて審査落ちしました。


結論からいうと、

<b>「センチメントデータなんてねーよ。帰れクソザコ。」

って感じでひと蹴りされました。

<br>
<br>

開発きっかけは、
<b>センチメントデータ</b>とか珍しいし、そんなの個人投資家はわざわざみない。
（みてツイッターくらい）

<br>

だから、そのアルゴリズムの開発をすれば、いい感じのアルゴできんじゃねって考えからセンチメントデータをもとに取引するアルゴリズム、作ってみました！！

#ちなみに販売までの流れはこんな感じ
詳しくはこちら
https://factory.quantx.io/guide/c2c

###販売準備
1. Liveに設定
（●注意  動作確認のため10営業日、公開状態のまま待つと販売申請ができるようになります。)

2. 販売者情報の登録

3. 売上金受領の準備(Stripe Connect)
ちょっとめんどかった。

###販売申請
大事なとこだけピックアップ。

●手数料は、販売額の30%
（つまり、販売価格の70%が販売者の売上となります）

●フォーワードテスト期間を含め最低1ヶ月程度を要します。



###販売開始

●購入希望者からの問い合わせ応答
●売上の支払い時期には、注意

#目標はこんな感じ
<br>
日経平均寄与率上位10位の銘柄(2018年12月25日)を用いて、センチメントデータを用いたアルゴリズムを作る！！！

<br>
移動平均線が上抜けしたら、買い、下抜けしたら売りというアルゴリズム作りました。


#まず完成コードはこちら（コピペ、どうぞ）
```algorithm.py
# 日経225 センチメントデータ 

  #ライブラリーの設定
import pandas as pd
import talib as ta
import numpy as np

def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      target="jp.stock.daily",
      channels={          # 利用チャンネル
        "jp.stock": {
          "symbols": [
            "jp.stock.9983", #ファーストリテイリング
            "jp.stock.9984", #ソフトバンク
            "jp.stock.6954", #ファナック
            "jp.stock.9433", #KDDI
            "jp.stock.8028", #ファミリーマート
            "jp.stock.8035", #東京エレクトロン
            "jp.stock.4543", #テルモ
            "jp.stock.6367", #ダイキン
            "jp.stock.6971", #京セラ
            "jp.stock.9735", #セコム
          ],
          "columns": [
            #"open_price_adj",    # 始値(株式分割調整後)
            #"high_price_adj",    # 高値(株式分割調整後)
            #"low_price_adj",     # 安値(株式分割調整後)
            "close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
            "volume_adj",         # 出来高
            "txn_volume",         # 売買代金
            "ns_sentiment",      # ニュースとSNSのネガポジデータだよ。
                                  # 1〜-1で1に近いほどポジティブな発言が多いよ。
          ]
        }
      }
    )

    def _my_Sentiment(data):
        ns_sentiment = data["ns_sentiment"].fillna(method="ffill")
        # ctx.logger.debug(ns_sentiment)

        ns_sentiment_m75 = ns_sentiment.rolling(window=75, center=False).mean()
        ns_sentiment_m25 = ns_sentiment.rolling(window=25, center=False).mean()
        #ネガポジの25日と５日移動平均出してるよ

        buy_sig = ns_sentiment_m25 > ns_sentiment_m75
        sell_sig = ns_sentiment_m25 < ns_sentiment_m75
       
        return {
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
            "ns_sentiment_m25": ns_sentiment_m25,
            "ns_sentiment_m75": ns_sentiment_m75
        }

    # シグナル登録
    ctx.regist_signal("my_Sentiment", _my_Sentiment)

def handle_signals(ctx, date, current):

 # 買いシグナル
    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.2, comment="SIGNAL BUY")
        pass

 # 売りシグナル
    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="SIGNAL SELL")
        pass



```
#結果はこちら

![スクリーンショット 2019-02-22 14.57.02.png](https://qiita-image-store.s3.amazonaws.com/0/332034/05d426d0-5f51-961a-ee1f-fdec98d7baab.png)

![スクリーンショット 2019-02-22 15.06.25.png](https://qiita-image-store.s3.amazonaws.com/0/332034/853adbfd-23ad-85dc-cca7-aa9e0a1cc88f.png)
![スクリーンショット 2019-02-22 15.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/332034/48b7f032-a4e1-8024-01d3-ff872265f592.png)

![スクリーンショット 2019-02-22 16.04.50.png](https://qiita-image-store.s3.amazonaws.com/0/332034/c39d638a-947d-7ee1-b9ff-a480a0fac66b.png)


<br>


ドローダウンめっちゃ低いし、いい感じじゃね。

リスク許容度が高い人には、うけそうなアルゴだし、とりあえず販売申請してみるか。

ぽっちとな、って感じで販売申請しました。


その結果
、
、
、
、
、
、
、
![スクリーンショット 2019-02-22 14.56.36.png](https://qiita-image-store.s3.amazonaws.com/0/332034/42101fad-99f2-5e09-682e-07b91568c4e8.png)
(審査中になっている。おおお)


、
、
、


###〜審査落ち〜



残念な結果となりました。



以下はコメントです。

>まず、 「ns_sentiment」 を使っていますが、 「maron-0.0.1b」 では使えないデータで、 「ns_sentiment」 の 「column」 はすべて 「NaN」 になります。で、いろいろMAとか計算しているんですが、最終的な判断部分で、 「dropna()」 してフィルタリングした結果を使っています。
「dropna()」 はNaNのデータを取り除くという意味ですが、元々のデータがboolean(True/False)なので、なにも取り除かれなくて、すべてのデータが利用されます。
つまり、常にシグナルが発生しているような挙動になっています。なので、おそらく開発者の意図通りには動いていない状態です。ということなので、審査落ちという結果ではあるんですが、インターンとして初めて販売申請あげてくれて感謝です！


つまり、「　センチメントデータなどないよ〜　」　でした。


そんなの知らないよ〜泣って感じです。


#反省点
反省点をあげるとこんな感じです。。


###pythonのコードの理解不足
dropの意味だとかちゃんと知っていれば、防げたかもしれないですね。

ただ、バックテストが動いてしまったので、ついちゃんと動いたのかと、安心してしまいました。



###ドキュメントの解読不足

https://determined-feynman-fb5a05.netlify.com/ja/


これを読めばわかるのですが、実際めんどうですよね〜
まるっと、やってくれるプラットフォームをユーザーは期待しています。

###取引手法の出来に関して

今回手法についてのリターンなどには、言及はありませんでした。
めちゃドローダウンは低いので、そこそこ、だと思います。



<br>
<br>
<br>
<br>


それでは今回はこの辺で。

ちゃお〜