2013年11月1日金曜日

第2モジュールスタート!

さて、先々週から第2モジュールが始まりました!

第2モジュールは、以下のラインナップです。

Time Series Analysis for Business and Finance
前モジュールでやった回帰分析の授業の続きという位置づけですが、まずARプロセス、MAプロセス、ARMA, ARIMA, SARIMAといった時系列のモデルを勉強します。今後、ARCH、GARCHなんかもやるみたいです。今のところ、主には理論をやっていますが、今後はRとSASを使って分析をやっていくようです。

Machine Learning
一番思ってたのと違うのが、この授業・・・・。かなり理論寄りです。マシンラーニングは、Rとかで動かすっていうだけだと結構楽しい代物ですが、それなりに数学もやると、そこそこヘビーです。しかも、実際に動かすのは、PythonのScikit-learnです。私はR使いなので、Rでやるほうが楽だったのですが、仕方ない・・・。

Distributed Databases
こちらは、SQLから、NoSQLへの発展編です。最初2回は、MySQLのおさらいと少し応用編をやり、次回からはMongoDBを使おうという流れです。MySQLは前期のData Acquisitionの復習に始まり、変数の使い方、Stored procedure, stored functionといった内容をやりました。先生が愉快な方なので、楽しいです。

Practicum 1 
強制的に企業とのコラボプロジェクトにアサインされます。会社の希望は出せますが、人を選ぶのは会社側らしく(事前にレジュメを提出します)、必ずしも希望の会社にアサインされるかはわかりません。会社によっては面接したりします。だいたい1週間に2回くらい出社するように言われているクラスメートが多いようです。詳細は書けないのですが、コラボ先企業は、シリコンバレーのベンチャーはもちろん、金融、小売、交通、自治体など多岐に渡ります。

2013年10月7日月曜日

Kaggle Hackathon!! ハッカソン!

先日、サンフランシスコのマイクロソフトで行われたKaggle Hackathonに、クラスメートと参戦してきました。

結果は8位。上出来です!

Kaggle Hackathonとは、24時間レースで、機械学習の精度を競い合うコンペです。

今回のテーマは、あるソーシャルネットワークのサイトのView数、コメント数、投票数を予測するというもので、そのサイトは、ある地域住民が地域の不満や改善してほしい点を投稿し、他のユーザーが、コメントしたり投票したりします。

そして、投票数が多いものに関しては解決が図られるというものです。たとえば、「道に落書きがあり、汚いから、なんとかして!」みたいな投稿に対して、投票されます。

うちのチームは人数あ多かったので、24時間の間でもいろいろな手が打てたのも好成績の要因だったと思います。私は、投稿のタイトルをテキストマイニングして、新たなダミー変数を作るということをしてました。表記ゆれ、スペルミスを正規表現で修正していくような感じですね。

残念ながら、作った変数はあまり予測力向上に役立ちませんでした。



オンサイトのコンペで良いのは、優勝者と話ができることです。優勝した方と話したら、テキストデータは最初に分析しないと決めていたといってました。データをざっと見て、あまり相関してなさそうだと見たということです。

さすが、洞察がするどい!自分は、そういう感覚がまだあまり備わっていないなぁと感じてしましました。データをざっと眺めて、最初にplay aroundしたときに、予測する変数と説明変数の間にどんな関係がありそうかを見出すというのが肝心だということです。

できることが増えると、やってみたい分析をやってしまうという陥りやすい罠にはまってしまうということを学習しました。

他のKaggleコンペにも参戦しているので、今回の教訓を活かします!でも、チームで8位とれたので、よしとしましょう!

2013年9月20日金曜日

(Pythonメモ)Google Financeのニュースヘッドラインを取得するPythonコード

株価とニュースの関係を分析してみたいなぁと思って、Google Finance (US)を取り込むコードを書いた。

getHeadkineという関数に、対象となる会社のticker、その会社の属するmarket(NASDAQなど)、検索対象となる開始日と終了日をstartとendというパラメータで指定すると、keyが日付、valueがヘッドラインの辞書を返す。

from __future__ import unicode_literals
import urllib2
import urllib
import re
from datetime import datetime,timedelta
import nltk

def getHeadline(ticker,market,start,end):
    query = urllib2.quote(ticker+':'+market)
    base = 'https://www.google.com/finance/company_news?q='
    url = base + query + '&startdate='+ start +'&enddate=' + end + '&start=0&num=10000'
    print url
    html = urllib.urlopen(url).read()
    raw = nltk.clean_html(html)
    raw = unicode(raw,errors='ignore')
    data = raw.split('\n')
    data =  data[60:-1]
    while u' ' in data: data.remove(u' ')

    monthDict = {'Jan':'01','Feb':'02','Mar':'03','Apr':'04','May':'05','Jun':'06','Jul':'07','Aug':'08','Sep':'09','Oct':'10','Nov':'11','Dec':'12'}

    news={}

    for i in range(0,len(data),1):

        t = re.match(r'[\s\w0-9/\.,:;\(\)]+\-\s([0-9\w\s]+)\sago\s*',data[i])
        o = re.match(r'[\s\w0-9/\.,:;\(\)]+\-\s(\w+)\s([0-9]+),\s(201[0-3])\s*',data[i])
        if t:
            hours =  int(t.group(1).split(' ')[0])
            delta = timedelta(hours=hours)
            gmt = timedelta(hours=7)
            d = datetime.today() - delta + gmt
            year = str(d.year)

            if d.month <10:
                month = '0'+str(d.month)
            else:
                month = str(d.month)
            if d.day < 10:
                day = '0'+str(d.day)
            else:
                day = str(d.day)

            key = year+'_'+month+'_'+day

            if key in news.keys():
                news[key].append(data[i-1])
            else:
                news[key]=[]
                news[key].append(data[i-1])

        if o:
            #Month
            m = o.group(1)
            month = monthDict[m]
            day = o.group(2)
            year = o.group(3)

            key = year+'_'+month+'_'+day

            if key in news.keys():
                news[key].append(data[i-1])
            else:
                news[key]=[]
                news[key].append(data[i-1])

    return news

#Example : getHeadline
#Output is a dictionary like this: { date : [headline1, headline2,.....], date:[headline3],......}
#the keys (time) is not ordered.Also, time is GMT (I checked the publish time in RSS xml).
#The function requires 'ticker', 'market name', 'start date'(YYYY-MM-DD) and 'end date' (YYYY-MM-DD)
print getHeadline('AAPL','NASDAQ','2012-09-01','2013-09-15')