リスクにかけろ

株と金融とプログラミング

pythonでNon-BMP文字を削除する

Seleniumを使っていると、SeleniumがNon-BMPは使えないよってエラーを吐くのでその対策

解決策はこちら

Remove characters outside of the BMP (emoji's) in Python 3 - Stack Overflow

data = "this variable contains some emoji'sツ😂"

data = ''.join(c for c in data if c <= '\uFFFF')

pythonのNon-BMPに関しては以下に詳しい記述があります。

Python 3.x - python3, 表現できないユニコードを一部無視して処理したい(90318)|teratail

抽象論は役に立たない。

株のトレードにも、人間関係にも、抽象論は役に立たない。
具体的な行動に結びついてこそ価値がある。
損切りは大切だ。という話は、どういう相場と戦略で、X%の損切り幅を設定することでY%利益率が向上する。
という具合に具体的でなければ何の意味もない。
人間関係でも同じように、挨拶は大切だとか、とりあえず相手のことを否定しておけというテクニックは役に立たない。
αさんはβというコミュニケーションを好み、γというコミュニケーションを嫌うというデータが大切である。
奥さんとの喧嘩を減らすためには、奥さんの気持ちを本から学ぶより、奥さんとの会話や喧嘩の原因をエクセルでデータを取るほうがずっと解決に繋がる。
他人の言葉にしても同じで、具体的なアドバイスはとりあえず言うとおりにやってみて成否のデータを取る価値があるが、「頑張れ」「やる気を出せ」のような抽象的な言葉では何の役にも立たない。
具体的な事例は一般化しづらく汎用性に欠けるが、そこで聞こえの良い抽象的な一般論に逃げるのでは意味が無い。
具体的なデータを蓄積し、分析し、PDCAを回すための方法論を学ぶべきである。
この文章もまた具体性に欠けるというトートロジー

相場を語ることと相場で稼ぐこと

相場を語ることはそう難しくない。本とニュースを読んで、それっぽいことを言っていればいい。

自分で新しい知見を見つける必要がない。

反対に、相場で稼ぐことは非常に難しい。世間に知れ渡っていない知見を見つけないといけない。

そして確率上の優位性に自分の資産をベットする必要がある。

所詮は確率の問題なので、当然損もする。

100%儲かる事案なんてのはたいてい、効率化されていて大きな儲けにはつながらないものだ。(証券会社のMSCBみたいなのは置いておいて)

過去に起こった出来事に対してあれこれ講釈垂れることは簡単だけど、過去から未来を予測するというのは骨が折れる仕事だ。

語ることと稼ぐことの大きな隔たりは、相場に身をおいた人ほど実感していると思う。そして、関係ない人にとってはその2つに差を見出すことは難しい。

相場師というのは、稼いだ金額でしか判断されないシビアな世界だ。

稼いでいなければ、日経新聞を読んでいるだけのおっさんと同程度にしか見られないのだから。

言い換えると、世間の無関心さが僕達の稼ぎの種になっているとも言える。

日の当たらない場所ほど地面の栄養は豊富なのだ。

カーブフィッティングとテストとシストレ

 システムトレーディングの常識だと、過剰なパラメーターのフィッティングは将来に渡ってリターンを上げることが難しいとされている。しかし、それを実際に行っている人たちもいる。ジム・シモンズのルネッサンステクノロジーやジャフリーウッドリフのQIMはそのようなアプローチを採用していると思われる。

 僕は、この方法でも適切なテストを経て信頼性が確保されているのであれば、充分に通用するのではないかと思っている。問題はバックテストとフロントテスト、そしてシステムが通用しなくなった場合の判断。正直言って、この三点をパスするのであればどのようなシステムでも運用可能だと思っているし、明確なロジックに基づいていてもパスできないのであれば運用するのは難しいと思っている。

 ということでまだまだ勉強中です。最近はベッティングシステムについて色々と考えているところ。

 ついでに言うと、QIMの直近のリターンは芳しくない。というか完全に終わっている。

QIM | CTA Performance

 

リスク管理とマネーマネジメントのお話(未解決)

ザラ場中に更新。

僕の戦略のマネーマネジメントはまだ解決していない。

マネーマネジメントに関するざっくりとした分類で言うと

・資産に対して定率で賭ける(オプティマルfとかケリー基準とか)

・資産に対して定額で賭ける

という二つがまず挙げられる訳だけど、期待値が長期的にプラスであれば、前者の定率賭けが正しいということになる。

これは資産が増えれば増えるほど、複利を使って大きくなるから。これは自明。

参考書としてはこれがいいかも。

www.amazon.co.jp

シャノンの悪魔で有名なクロード・シャノンだったり、「続マーケットの魔術師」や「ディーラーをやっつけろ」で有名なエド・ソープが出てくる。

 この本にはケリー基準が出てくるので、そのままケリー基準を使ったり、ケリーを発展させた(と言われている)オプティマルfを使えば良いじゃないか。と思うかもしれない。

しかし、それらは幾何平均の最大リターンを目指すものであって、物凄く大きなロットを張る場面が出てくる。裏を返せばDDについて考えられていない。大抵の人は50%ものDDに耐えられないと思う。

更に言うと、同じ戦略が未来永劫続く訳ではないので、戦略の期待値が変化した場合に大きな損失を被る可能性が高まる。

何に注目するか

 ケリーやオプティマルfは幾何平均を最大化することに着目している。僕はそれだけでは不十分で、DDに対応したものでなくてはならないと思っている。さらに戦略毎の資金配分も考慮したい。

参考になりそうな指標を以下にあげる。

・最大DD

・平均リターン(算術平均と幾何平均)

・リターン中央値

・勝率

標準偏差

リスクベースで考えるのなら、資金に対する最大リスク許容率を決めて、最大DDを使って逆算すれば1トレード辺りの投入資金が求められる。

期待値を考慮しなくていいのだろうか。僕はこれに対する答えを持ち合わせていない。

以下のような戦略があった場合、あなたならどのようにベットするだろうか。

 

資産1億円

戦略A

最大DD 40%

平均リターン 3%

勝率 50%

標準偏差 10%

 

戦略B

最大DD 20%

平均リターン 1%

勝率50%

標準偏差 2%

 

リターンの最大化を考えるならAに大きく賭けるべきだし、リスクを考えるならBになる。

 

その他諸々

僕は損切りラインって考え方を使っていない。定率ストップと言い換えてもいいけれど。

定率ストップを使わないという事は、損失が限定できないという事で、これがさらにマネーマネジメントを難しくしている。今のところ最大損失から逆算して、ロット数を減らすことでS高やS安になっても耐えられるようにしている。

 あと、現実には流動性も考慮する必要がある。というか、かなり重要。新興の流動性の低い銘柄を手掛けるなら、最大の制約は流動性になる。理論的なマネーマネジメントを基準に、流動性に応じて枚数を減らすというやり方をしている。

 

頭の中のごちゃごちゃをそのまま書いたので、文章もぐちゃぐちゃである。

今日も生き残ろう。

 

 

pythonとtwitterのAPIを使ってタイムラインを取得

qiita.com
このまんまです。
OAuth認証のkeyを取得するだけ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from requests_oauthlib import OAuth1Session
import json

CK = 'XXXXXXXXXXXXXXXXXXXXXX'                             # Consumer Key
CS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'         # Consumer Secret
AT = 'XXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # Access Token
AS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'         # Accesss Token Secert

# タイムライン取得用のURL
url = "https://api.twitter.com/1.1/statuses/home_timeline.json"

# とくにパラメータは無い
params = {}

# OAuth で GET
twitter = OAuth1Session(CK, CS, AT, AS)
req = twitter.get(url, params = params)

if req.status_code == 200:
    # レスポンスはJSON形式なので parse する
    timeline = json.loads(req.text)
    # 各ツイートの本文を表示
    for tweet in timeline:
        print(tweet["text"])

else:
    # エラーの場合
    print ("Error: %d" % req.status_code)

僕はプログラミング初心者なので、他の人の勉強法をパクらせてもらってます。
今のところ参考にしてるのは以下の記事。d.hatena.ne.jp
d.hatena.ne.jp