スキップしてメイン コンテンツに移動

[Python]ポートフォリオの達人ランキング取得プログラム

今日は、投資ブログで公開している三菱UFJ投信主催の「投資にチャレンジ!!ポートフォリオの達人」から毎日更新される運用成績を取得するプログラムを作りました。これまで毎日コンテストの個人ページからコピー&ペーストして作成していた記事の成績部分をプログラムを実行するだけで作成できます。

■投資ブログの記事
この記事の作成を効率化します。
http://mockuninvestment.blogspot.jp/2013/06/201367.html

■コマンド実行方法
取得したい参加者の個人ページのURLをプログラムに渡してあげるだけ。

python muam_contest.py http://contest.muam.jp/app/ranking/detail?dsp=eac8d83669d6cca1

■出力内容
コマンド入力後、Enterを押して実行すると以下のフォーマットが出力されます。

2013/6/7更新 ポートフォリオの達人ランキング

==========
ランキング(6/7更新):198位
評価額:100,357円
リターン:0.47%
リスク:10.63%
リターン ÷ リスク:0.04(0.04435225290)
==========
http://contest.muam.jp/app/ranking/detail?dsp=eac8d83669d6cca1

あとはブログに張り付けるだけです。投稿用のアドレスにメール送信するプログラムと組み合わせれば、完全自動化できてしまいますね。

■ソース
#!/usr/local/bin/python
#coding: utf-8

from bs4 import BeautifulSoup
import urllib2,re,unicodedata,sys

template=u"""2013/%(date)s更新 ポートフォリオの達人ランキング

==========
ランキング(%(date)s更新):%(rank)s
評価額:%(amount)s
リターン:%(ret)s
リスク:%(risk)s
リターン ÷ リスク:%(riskreturnratio)s
==========
%(url)s"""

def PostCreater(url):
    param={}
    param['url']=url
    bs=BeautifulSoup(urllib2.urlopen(param['url']).read())
    bsdate=bs.find('h2',{'class':'ranking'})
    bsother=bs.find('table',{'class':'ranking'}).find_all(['th','td'])

    param['date']=re.sub(u'月','/',unicodedata.normalize('NFKC',bsdate.text.encode('sjis')[10:16].decode('sjis')))
    param['rank']=bsother[1].text
    if param['rank']=='':
        # 1~3位までは、順位が文字列ではなく画像なので、画像のalt属性から順位を取得します。
        param['rank']=bs.find('th',{'rowspan':'2','class':'rank'}).find('img')['alt']
    param['amount']=bsother[15].text
    param['ret']=bsother[11].text
    param['risk']=bsother[13].text
    param['riskreturnratio']=bsother[9].text

    print template % param

if __name__=='__main__':
    '''
    コマンドラインで以下のように実行する
    "python muam_contest.py http://contest.muam.jp/app/ranking/detail?dsp=eac8d83669d6cca1"
    '''
    PostCreater(sys.argv[1])

コメント

このブログの人気の投稿

[Python]redis-pyでRedis Pub/Sub実装

前から面白そうと思っていたRedisのPub/Sub機能。 redis-pyでどう実装すれば使えるか確認してみた。 ■Pub/Subについて http://ja.wikipedia.org/wiki/出版-購読型モデル ■pub.py from redis import StrictRedis def publish(channel,msg): """ redis-pyにはPUBLISHするためのメソッドがないので、 Redisのコマンドをそのまま実行する為のクラスを使う。 """ sr=StrictRedis() """ 第1引数にRedisのコマンド、第2引数以降は そのコマンドの引数をそのままセット """ sr.execute_command("PUBLISH",channel,msg) if __name__=="__main__": # チャネル"hoge"に"Hello"というメッセージを出版(Publish) publish("hoge","Hello") ■sub.py from redis import Redis def listen(channel): r=Redis() ps=r.pubsub() ps.subscribe(channel) while True: for i in ps.listen(): print i["data"] if __name__=="__main__": # チャネル"hoge"を購読(Subscribe) listen("hoge") ■実行方法・実行結果 (ターミナル1-準備) [user@localhost ~]# python sub.py 1 # => チャネ

[OS]VirtualBoxでCentOS6.5(x86_64)がKernel panicを起こした

完全に対処療法。 恥ずかしながら自分では原因がわかっていない。 忘れないようにメモしておく。 いろいろ設定したあと、何度目かの再起動のタイミングでKernel panicが発生して起動しないという事象が発生。 こちらの方法でなんとか起動させて。 [CentOS] SELinux 無効化後のカーネルパニック http://kuni255.blogspot.jp/2013/04/centos-selinux.html こちらの通り、/boot/grub/grub.confに設定を追加。 Kernel panic – not syncing: Attempted to kill init! http://h2np.net/mynotebook/post/130 設定変更後、以下の操作をそれぞれ10回ほど試した限りでは再発していません。  (1)halt+起動 (2)reboot 追記:と思ったらまた発生した。なんかもう解決できる気がしない。

[Python]日経225構成銘柄の一覧を取得するプログラム

今日書いたのはこれ。 日経225の構成銘柄が変更になるといちいち変更が面倒なので作りました。 コメントに書いてある機能しかありませんが、簡単でよし。 ご参考になれば。 #!/usr/local/bin/python # -*- coding:utf-8 -*- from BeautifulSoup import BeautifulSoup import urllib2,re class Nikkei225Profile(object): def __init__(self): ''' 日経新聞のサイトから日経225の構成銘柄の証券コードと証券名称を取得 ''' self.url = 'http://www3.nikkei.co.jp/nkave/about/225_list.cfm' self.profile = dict() soup = BeautifulSoup(urllib2.urlopen(self.url)) tablesoup = soup.find("table") rows = tablesoup.findAll('tr',{'bgcolor':'#FFF5DE'}) rows += tablesoup.findAll('tr',{'bgcolor':'#F0E7D1'}) for row in rows: row_list = [cell.find(text=True) for cell in row.findAll('td')] self.profile[row_list[0]] = row_list[1] def getprofile(self,googlestyle=False): ''' 日経225の証券コードと証券名称をdict()で返す