2017/11/12 [長年日記]
書籍 を見ながら MT4 EAのバックテストをしようとして、 書籍に出てくるようなグラフ(結果)にならないなぁと超長い間悩んでいたけど、 ようやく理解できた。
原因は、自分のトレードは少額から始めるつもりとして 初期証拠金を USD 1万通貨としていたためだった。 一方で EAのパラメータ入力の取引単位を 1Lots(=1万通貨) としていたため、 1回目のトレードで損が出るとそこで所持金が 1万通貨を割って必要証拠金が足らない状態(=退場)になっていた。(>_<)
ここから学んだことは、複数回の負けトレードにも耐えるためには、
- 取引単位の数倍の初期証拠金を持つ。自分の所持金を増やす
または
- 初期証拠金に対して、取引単位を小さくする。1000通貨といった取引単位の小さなFX業者を選ぶ。
ことなんだと実感した。
ようやく 書籍 に出てくるバックテスト結果を眺めて実感し、自分で検証できそうだ\(^o^)/
よく本なんかで出てくる「取引単位は所持金の 2%以下」にもつながるんだろうなぁ。
2017/11/20 [長年日記]
「今、世の中の動きがどういう方向に進んでいるのかを知りたい」という欲求から、 自分が親しんでいる 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)
2017/11/21 [長年日記]
_ [Python]もういっちょ別の形態要素解析で wordcloud してみる
前回は Janome を使ったけど、MeCab を使う場合も試してみた。
見つけたサイト に従い、 「炎上案件に突如ディレクターとして投入されたときにやってみたこと 」を題材にして wordcloud を作ってみようとしたら、そのまま実行するとエラー (+_+)
- BeautifulSoup(res.text) で warning
- 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 で指定せず、形態素を門前払いにする処理の場合
- 修正したコード
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 を工夫するか、個別ニュースに限定するしかないんだろうなぁ
参考にさせていただいたサイト: