#自己紹介
この度Smart Tradeでインターンすることになったゴンです。
ゴンについて、知りたい方はこちら。
ブログ読んでねー
ツイッターはこちら
https://twitter.com/gon_gon_tarou
初めての記事はこちら(QuantXを初めてみて)
https://qiita.com/investor-gon/items/2b1952ae5c2c88334c74
#初めてインターン生で申請し、初めて審査落ちしました。
結論からいうと、
「センチメントデータなんてねーよ。帰れクソザコ。」
って感じでひと蹴りされました。
開発きっかけは、
センチメントデータとか珍しいし、そんなの個人投資家はわざわざみない。
(みてツイッターくらい)
だから、そのアルゴリズムの開発をすれば、いい感じのアルゴできんじゃねって考えからセンチメントデータをもとに取引するアルゴリズム、作ってみました!!
#ちなみに販売までの流れはこんな感じ
詳しくはこちら
https://factory.quantx.io/guide/c2c
###販売準備
-
Liveに設定
(●注意 動作確認のため10営業日、公開状態のまま待つと販売申請ができるようになります。) -
販売者情報の登録
-
売上金受領の準備(Stripe Connect)
ちょっとめんどかった。
###販売申請
大事なとこだけピックアップ。
●手数料は、販売額の30%
(つまり、販売価格の70%が販売者の売上となります)
●フォーワードテスト期間を含め最低1ヶ月程度を要します。
###販売開始
●購入希望者からの問い合わせ応答
●売上の支払い時期には、注意
#目標はこんな感じ
日経平均寄与率上位10位の銘柄(2018年12月25日)を用いて、センチメントデータを用いたアルゴリズムを作る!!!
移動平均線が上抜けしたら、買い、下抜けしたら売りというアルゴリズム作りました。
#まず完成コードはこちら(コピペ、どうぞ)
# 日経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日と5日移動平均出してるよ
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
#結果はこちら
ドローダウンめっちゃ低いし、いい感じじゃね。
リスク許容度が高い人には、うけそうなアルゴだし、とりあえず販売申請してみるか。
ぽっちとな、って感じで販売申請しました。
その結果
、
、
、
、
、
、
、
(審査中になっている。おおお)
、
、
、
###〜審査落ち〜
残念な結果となりました。
以下はコメントです。
まず、 「ns_sentiment」 を使っていますが、 「maron-0.0.1b」 では使えないデータで、 「ns_sentiment」 の 「column」 はすべて 「NaN」 になります。で、いろいろMAとか計算しているんですが、最終的な判断部分で、 「dropna()」 してフィルタリングした結果を使っています。
「dropna()」 はNaNのデータを取り除くという意味ですが、元々のデータがboolean(True/False)なので、なにも取り除かれなくて、すべてのデータが利用されます。
つまり、常にシグナルが発生しているような挙動になっています。なので、おそらく開発者の意図通りには動いていない状態です。ということなので、審査落ちという結果ではあるんですが、インターンとして初めて販売申請あげてくれて感謝です!
つまり、「 センチメントデータなどないよ〜 」 でした。
そんなの知らないよ〜泣って感じです。
#反省点
反省点をあげるとこんな感じです。。
###pythonのコードの理解不足
dropの意味だとかちゃんと知っていれば、防げたかもしれないですね。
ただ、バックテストが動いてしまったので、ついちゃんと動いたのかと、安心してしまいました。
###ドキュメントの解読不足
これを読めばわかるのですが、実際めんどうですよね〜
まるっと、やってくれるプラットフォームをユーザーは期待しています。
###取引手法の出来に関して
今回手法についてのリターンなどには、言及はありませんでした。
めちゃドローダウンは低いので、そこそこ、だと思います。
それでは今回はこの辺で。
ちゃお〜