odenのメモ帳

いっつも解決したことを書き留めなくて,後々後悔するので,それを防ごうプロジェクト

シストレ構築で役立つ(かもしれない)様々な"レシオ" & 同人誌電子版販売のお知らせ

シストレで戦略を評価する際,様々な指標がある.日本ではプロフィットファクター(PF)が検索するとよく引っかかるが,他にはどのようなのがあるのだろうと調べてたら色々あったのでまとめた.
適当に読んで適当に解釈しているのであまりあてにしないで.

主に英語版Wikipedia(https://en.wikipedia.org/wiki/Category:Financial_ratios)から抜粋.
それにしても,日本語版はせいぜいシャープレシオだけですが,色々あるんですねえ...

Calmar ratio

Sterling ratioを修正したもので,平均リターンを山から谷までの最大ドローダウンで割った値.直近36ヶ月で計算し,月次ベースにしたもの.

Omega ratio

次式で定義される.閾値のリターンを越える割合的な考えか.r閾値となるリターン,F(x)はリターンの累積分布関数.
{
\Omega = \frac{\int_{r}^{\infty}(1 - F(x)) dx}{\int_{-\infty}^{r}  F(x) dx}
}

\Omega = 1ならば,平均リターンがrとなることを意味する.

具体的な計算はこちらがわかりやすい
investexcel.net

Upside potential ratio

次式で定義される.
{
U = \frac{\sum_{r}^{\infty} (R_r - R_{min})P_r}{ \sqrt{\sum_{-\infty}^{r} (R_r - R_{min})^2 P_r}}
}

なんかよく分からないんですけど,具体的な計算方法はこちら?
investexcel.net


シャープレシオでは,すべての変動がリスクとして判断されてしまうが,上ブレの変動はむしろ好ましくリスクとして判断すべきではない.そこで,このシャープレシオの欠点を修復するためにUpside potential ratioやSortino ratioはリターンがマイナスな場合のみの変動を計算している.

同人誌電子版販売のお知らせ

進化計算と機械学習の本1を書きました.自分は,進化計算の1つである遺伝的プログラミングでFXに挑戦するという章を担当しています.お求めはこちらから.
rosenblock.booth.pm

bibtex導入 ハマったこと

卒論で参考文献をまとめる際にbibtexを導入するもちょっとハマったのでメモ.環境はUbuntu14.04

.bibファイルを用意する

論文のサイトなどにExportなんたらという所にだいたいbibTexが表示/ダウンロードできるところがあるのでそこから取得して.bibファイルに書き込む.(画像はACM Digital Library)
f:id:oden-dengaku:20170118223220p:plain
.bibファイルに複数の文献を書き込める.

コンパイルを行う

jbibtexをplatexで挟んでplatexを複数やる必要がある.自分は面倒なので.shにしている.過去記事で作ったシェルを拡張した.
oden-dengaku.hatenablog.jp

#!/bin/sh

ret=${1%.*}
if test $ret != "";then
	platex ${ret}
	jbibtex ${ret}
	platex ${ret}
	platex ${ret}
	dvipdfmx $ret
	evince ${ret}.pdf
else
		echo "ファイルを入力してください"
fi
これでOKと思ったら…?

何故か表示されない.どうやらbibファイルを置く場所を教えてあげないといけないらしい..bashrcに以下を追加.

export BSTINPUTS=$BSTINPUTS:/your/bib/folder//

最後に//とやると全ファイルを探索してくれるらしい?

OpenAI Gymをubuntuにインストールした時発生したエラーの対処法メモ

OpenAI Gymをここに従ってインストールしている際,

pip install -e .

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe2 in position 72: ordinal not in range(128)

のエラーが発生.調べると以下のサイトがヒット
www.elecafe.info
stackoverflow.com

$ sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

を実行したら正常にインストールされるようになった.
.bashrc への追加をすると文字コードがめちゃくちゃになるので取り外した.

自作トレード支援ツールの機能紹介

そういえばまだ詳しくしてない気がしたので

ツールは3つのタブ

  • 個別銘柄
  • 銘柄詳細
  • 銘柄一覧

に分かれている.

個別銘柄

f:id:oden-dengaku:20160513222031p:plain
銘柄コードを入力すると,その銘柄についての基本的なテクニカル指標が計算され,必要に応じて売買サインを発する.
各パネルの右上ボタンを押すと,そのテクニカル指標についてのチャートが別個表示される.

対応しているテクニカル指標は

また,別個トレンドを確認するための指標を幾つか用意している.

銘柄詳細

f:id:oden-dengaku:20160513222838p:plain
個別銘柄で指定した銘柄のさらなる情報.というか,手当たり次第に指標を追加しただけ.
主に

先物市場のテクニカル分析 (ニューファイナンシャルシリーズ)

先物市場のテクニカル分析 (ニューファイナンシャルシリーズ)

〈相場に勝つ〉ローソク足チャートの読み方

〈相場に勝つ〉ローソク足チャートの読み方

に掲載されたものを使用.

銘柄一覧

f:id:oden-dengaku:20160513223152p:plain
左上の更新ボタンを押すと,(ほぼ)全銘柄のデータを集め,計算し,表示する.以前は1時間くらいかかっていてダメダメだったが,DBを使うようにしてから10分かからず全銘柄が表示されるようになった.
上の方にあるフィルタはもうちょっといいやり方があると思うので,改良を試みる予定.

C#- .NET上のChartコンポーネントに線を引きたい

はじめに

株価チャートとかで(部分的に)線を引きたい時にどうすればいいのか手こずったので忘れないうちに記しておく.

方法

Chart全体に線を引きたいならば

chart1.Series["candle"].ChartType = SeriesChartType.Line;

とかやって折れ線グラフを生成すればよいが,株価チャートでトレンドラインを引くときなど,気軽に2点を選択して直線を引きたい場合どうすればいいか結構時間がかかったのでまとめる.

LineAnnotationを利用した.プロパティにはX,Y,Width,Heightしかないが,WidthとHeightをうまく計算すると意図した位置に線を引くことができる.AllowSelecting,AllowMovingプロパティをtrueにすれば選択,移動もできる.他にリサイズも可能.
f:id:oden-dengaku:20160301225143p:plain

コード

このコードは,チャート上で2回クリックするとその2点間を結ぶ直線を生成する.LineAnnotation(線注釈)を選択してもカウントされてしまうので注意.

        Point point = new Point();
        private void chart1_MouseDown(object sender, MouseEventArgs e)
        {

            if (point.X == 0 && point.Y == 0)
            {
                //始点
                point.X = (int)chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
                point.Y = (int)chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
            }
            else
            {
                //終点
                Point temp = new Point();
                temp.X = (int)chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
                temp.Y = (int)chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);

                //線を生成
                LineAnnotation ano = new LineAnnotation();
                ano.AxisX = chart1.ChartAreas[0].AxisX;
                ano.AxisY = chart1.ChartAreas[0].AxisY;
                ano.IsSizeAlwaysRelative = false;
                ano.AllowSelecting = true;
                ano.AllowMoving = true;

                ano.X = point.X;
                ano.Y = point.Y;

                ano.Height = temp.Y - point.Y;
                ano.Width = temp.X - point.X;

                chart1.Annotations.Add(ano);
                point = new Point();
            }
        }

C#でのHTML取得方法を比較した

C#でWebページの内容を取得する方法はいくつかあるが,どれが速いのかよく分からなかったのでテキトーに調べてみた.計測とか調べ方はチョー適当なので参考程度に.

今回確かめたC#でWebページの内容を取得するクラスは

  • WebClientクラス
  • WebRequestクラス
  • HttpClientクラス

である.

というかC#でHTMLを取得するいい方法を誰かおしえてください.

計測結果

クラス 時間(秒)
WebClient 3.279
WebRequest 4.741
HTTPClient 4.081

今回,あるURLのHTMLを50回取ってくるという操作の10回平均を計測した.

今回計測した所WebClientが一番速いという結果になったが,HTTPClientクラスは非同期対応とか各クラスで特徴あるので使い分けましょうということで.
なお下記コードでProxyをnullにしているのは,そうした方が速いらしいからである.

追記

using使ってないクソダサコードだけど許して

コード

using System;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Net.Http;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            // 時間計測用のタイマー
            var timer = new System.Diagnostics.Stopwatch();
            timer.Start();
            for (int k = 0; k < 10; k++)
            {
                for (int i = 0; i < 50; i++)
                {
                    string URL = "hogehoge";

                    ///ここを適宜変更
                    string temp = getHTML(URL);
                    ///
                }
            }
            
            timer.Stop();
            Console.WriteLine("{0:0.000}秒", timer.Elapsed.TotalSeconds/10);
            Console.Read();
        }



        static string getHTML(string url)
        {
            WebRequest wr = WebRequest.Create(url);
            wr.Timeout = 10000;
            HttpWebRequest pcHttpRec = (HttpWebRequest)wr;
            pcHttpRec.Proxy = null;

            Encoding enc = Encoding.GetEncoding("UTF-8");
            string result = "";
            using (Stream st = wr.GetResponse().GetResponseStream())
            using (StreamReader sr = new StreamReader(st, enc))
            {
                result = sr.ReadToEnd();
            }
            return result;
        }

        static string getHTML2(string url)
        {
            Uri webUrl = new Uri(url);
            Task<string> webTask = GetWebPageAsync(webUrl);
            webTask.Wait();
            string result = webTask.Result;
            return result;
        }

        static string getHTML3(string url)
        {
            WebClient wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            wc.Proxy = null;
            Stream st = wc.OpenRead(url);

            Encoding enc = Encoding.GetEncoding("UTF-8");
            StreamReader sr = new StreamReader(st, enc);
            string html = sr.ReadToEnd();
            sr.Close();

            st.Close();
            return html;

        }

        static async Task<string> GetWebPageAsync(Uri uri)
        {
            // HttpClientHandlerにProxy情報を設定する
            HttpClientHandler ch = new HttpClientHandler();
            ch.Proxy = null;
            using (HttpClient client = new HttpClient(ch))
            {
                // タイムアウトをセット(オプション)
                client.Timeout = TimeSpan.FromSeconds(10.0);
                return await client.GetStringAsync(uri);
            }
        }
    }
}

ubuntuが爆発したのでlubuntuを導入

ubuntuからpython3を消したところ,誤って別のも消えてしまい,タスクバーとか色々バーが出てこなくなってしまった.戻すのは面倒だし,重要なデータは一応バックアップできたので,lubuntuに変えてみるかということで実際に変えた.

で,lubuntuにした際に初めにいじったやつを書いておく

日本語入力の設定(mozc)

デフォルトのはポなのでまず変えるやつ.

sudo apt-get install fcitx fcitx-mozc fcitx-libs-qt5 fcitx-frontend-qt5

これしたらログイン・ログアウト

ディレクトリ名を英語に

デフォルトだと「Document」が「ドキュメント」になっちゃってるので英語にする

LANG=C xdg-user-dirs-gtk-update

zshのインストール

別にbashでもいいんだけど,慣れちゃったので

sudo apt-get install zsh
which zsh
chsh

でwhichのときに出てきたパスを入力. 色はまだ良くわかってないので設定してない

vim,gvimのインストール

はい

sudo apt-get install vim-gtk

lubuntuをちょっと使った感想としては,起動とかスリープからの回復はやっぱりubuntuより早くなってる気がした.