トップ 最新 追記

kaztomo日記


2017/11/12 [長年日記]

_ [FX]長い間解らなかったことがようやく

書籍 を見ながら MT4 EAのバックテストをしようとして、 書籍に出てくるようなグラフ(結果)にならないなぁと超長い間悩んでいたけど、 ようやく理解できた。

原因は、自分のトレードは少額から始めるつもりとして 初期証拠金を USD 1万通貨としていたためだった。 一方で EAのパラメータ入力の取引単位を 1Lots(=1万通貨) としていたため、 1回目のトレードで損が出るとそこで所持金が 1万通貨を割って必要証拠金が足らない状態(=退場)になっていた。(>_<)

ここから学んだことは、複数回の負けトレードにも耐えるためには、

  • 取引単位の数倍の初期証拠金を持つ。自分の所持金を増やす

または

  • 初期証拠金に対して、取引単位を小さくする。1000通貨といった取引単位の小さなFX業者を選ぶ。

ことなんだと実感した。

ようやく 書籍 に出てくるバックテスト結果を眺めて実感し、自分で検証できそうだ\(^o^)/

よく本なんかで出てくる「取引単位は所持金の 2%以下」にもつながるんだろうなぁ。


2017/11/20 [長年日記]

_ [Python]Twitterデータを可視化してみたい

「今、世の中の動きがどういう方向に進んでいるのかを知りたい」という欲求から、 自分が親しんでいる Twitter を使いつつ、出来れば Python 使って俺の欲求を実現出来ないものかと ググってみた。

そうすると、時々目の当たりにする「単語の出現率によって文字の大きさを変えて表示する」ヤツが 見つかった。wordcloud って言うそうだ。

見つけたサイト を元に、自分も早速試してみた。(^o^)/

自分の環境[ FreeBSD-10.3R + Python2.7 ] には存在していない janome と wordcloud を pip でインストール。

pip install janome
pip install wordcloud
#ついでに、Python3.5 向けにもインストール
pip3 install janome
pip3 install wordcloud

サイト のコードを jupyter notebook にコピペしつつ自分の環境にあわせて下記コードを編集。

# ログファイルから、一文ずつ texts 配列に格納
with open('twitter.log', 'r') as f:
    reader = csv.reader(f, delimiter='\t')
    texts = []
    for _row in reader:
        if len(_row) == 0:
            continue
        text = re.sub("http.*", "", _row[0].decode('utf-8'))
        #print text
        texts.append(text)

# counter 関数を使って一文ずつ格納されたtexts配列から名詞を抽出し、
# 「単語、出現数」ペアとなる辞書型変数と、「単語だけ」変数を取得する。
words_count, words = counter(texts)

# 取得した「単語だけ」配列を使い、1行に変換する。
text = ' '.join(words)

# word cloud で描画
fpath = u'/usr/local/share/fonts/TTF/kochi-gothic-subst.ttf'
wordcloud = WordCloud(background_color="white", font_path=fpath, width=900, height=500).generate(text)

@cnet_japan 2017/11


2017/11/21 [長年日記]

_ [Python]もういっちょ別の形態要素解析で wordcloud してみる

前回は Janome を使ったけど、MeCab を使う場合も試してみた。

見つけたサイト に従い、 「炎上案件に突如ディレクターとして投入されたときにやってみたこと 」を題材にして wordcloud を作ってみようとしたら、そのまま実行するとエラー (+_+)

  1. BeautifulSoup(res.text) で warning
  2. WordCloud 関数内で TypeError: descriptor 'lower' requires a 'str' object but received a 'unicode' なるエラー

1 については、 第2引数として "lxml" を追加すれがOK。

2 については、strでなければ処理できないのに、unicode を指定していることが問題の様子。

でとりあえず、stop_words配列の文字列から u を削除して str化してみたら、エラーは無くなった (^o^)/ でも、 サイトに上がっている例 と、見た目が違う (>_<)

画像の説明

よくよく見ると、stopwords 指定している文字列が認識できていないみたい (>_<)

更にググってみたところ、 今回のエラーに遭遇している人 は他にもいたようで、 俺と同じ回避(解決)策を取ったけど、実行結果が載ってないから stopwords 問題がどうなっているかは不明 orz


参考にさせていただいたサイト:


2017/11/23 [長年日記]

_ [Python]wordcloud で stopwords 問題の回避

おとといの日記 の通り、 wordcloud 関数の stopwords パラメータは、unicode じゃなくて str にする必要がある ことは分かったけど、decodeしてみたり、ひょっとしたら文字コードが絡むのかと試してみたり したけど、結局のところは strにしても stopwords として認識してくれなかった (+_+)

更に、色々とググったところ、 別の方法で stopwords を処理しているサイト を発見 (^o^)/

元のコードに同様の処理を追加して、無事 stopwords 処理(もどき)が出来上がった。\(^o^)/

  • stopwords を unicode から str にしただけ(おとといの日記)。stopwordsしたい "こと"、"する"といった文字が残っている

画像の説明

  • stopwords で指定せず、形態素を門前払いにする処理の場合

stopwords不具合回避

  • 修正したコード
def mecab_analysis(text):
    t = mc.Tagger('-Ochasen -d /usr/local/lib/mecab/dic/ipadic/')
    enc_text = text.encode('utf-8')
    node = t.parseToNode(enc_text)

    stop_words = [ "てる", "いる", "なる", "れる", "する", "ある", "こと", \
    "これ", "さん", "して", \
    "くれる", "やる", "くださる", "そう", "せる", "した",  "思う",  \
    "それ", "ここ", "ちゃん", "くん", "", \
    "て","に","を","は","の", "が", "と", "た", "し", "で", \
    "ない", "も", "な", "い", "か", "ので", "よう", ""]

    output = []
    while(node):
        if node.surface != "":  # ヘッダとフッタを除外
            word_type = node.feature.split(",")[0]
            if word_type in ["形容詞", "動詞","名詞", "副詞"] and node.surface not in stop_words:
                output.append(node.surface)
        node = node.next
        if node is None:
            break
    return output

参考にさせていただいたサイト:


2017/11/25 [長年日記]

_ [FreeBSD][Python]mecab-ipadic-NEologd をインストール

ipadicを使って得られた形態素解析結果にしっくりこないんで、 色々とググってみたら、mecab-ipadic-NEologd という辞書がなんとなく良さ気に感じられた。

調べていくと FreeBSD の Portsにあるじゃん?!

portsnap fetch; portsnap update しても見つからない。bugzillaよく見てみると、まだマージされてない (+_+)

仕方がないんで直接インストールすることに(^^;

git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -a
...(snip)...
途中でインストールするか?と聞かれるので yes と入力

簡単だ (^o^)/


参考にさせていただいたサイト:


2017/11/29 [長年日記]

_ [Python]URLを入力したら wordcloud を作成&表示する CGIを作ってみた

wordcloud が作れる環境が出来たんで、 jupyter notebook 上で色々と URLを変えてみて wordcloud を表示して楽しんではみたものの、 毎回チマチマと URL文字列を修正して ctrl+ret するのが面倒になってきた (+_+)

そこで URLを入力したら wordcloud を作成&表示する CGIを作ってみたらいい感じに (^o^)/

FreeBSD-10.3R
Python2.7 + requests-2.8.4 + BeautifulSoup4-4.5.1
+ mecab-python-0.996post2
+ matplotlib-1.5.3post0 + wordcloud-1.3.1
mecab-ipadic-neologd を使用
  • URL入力

画像の説明

  • wordcloud 表示結果

画像の説明

コードはいつものごとくエッセンスのみで (^^;

from wordcloud import WordCloud
from bs4 import BeautifulSoup, NavigableString, Declaration, Comment
import requests
import MeCab as mc

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

html_body = u"""
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head>
<body>
%s
<br>
<img src="%s">
</body>
</html>"""

# wordcloud.html で入力された URL を取得する
form = cgi.FieldStorage()
url_str = form.getvalue('urls', '')

# URL で指定されたサイトのテキストからワードリスト(utf-8)を作成する
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
res = requests.get(url_str, timeout=10, headers = headers)

# エンコーディングが正しく取得できていないようなので制御を追加
res.encoding = res.apparent_encoding

# BeautifulSoupでタグを除去してテキストだけ抜き出す
soup = BeautifulSoup(res.content, "lxml")
text = '\n'.join(getNavigableStrings(soup))

# 形態素解析
wordlist = mecab_analysis(text)

# unicode化した文字列をスペース区切りで連結し、WordCloud を作成
_str = " ".join(wordlist).decode('utf-8')
create_wordcloud(_str, img_file)

print (html_body % (url_str, img_file)).encode('utf-8')

最後に、Google News を wordcloud してみたけど全くニュース感がない (>_<)

画像の説明

stopwords を工夫するか、個別ニュースに限定するしかないんだろうなぁ


参考にさせていただいたサイト: