In [1]:
%matplotlib inline
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import pandas_datareader.data as web
In [2]:
class Tester(object):
    def __init__(self, df):
        self.I,_=df.index.values,[setattr(self,c[0],df[c].values)for c in df.columns]
    def run(S):
        P,T,V,r,(ob,os,cb,cs)=0,0,0,[],[(getattr(S,a))for a in['ob','os','cb','cs']]
        for i in range(len(S.I)-1):
            if(P==1and cb[i])or(P==-1and cs[i]):P=r.append([P,T,V,S.I[i+1],S.O[i+1]])
            if not P:P,T,V=(1if ob[i]else-1if os[i]else None),S.I[i+1],S.O[i+1]
        return DataFrame(r+([[P,T,V,S.I[-1],S.O[-1]]]if P else[]),None,'P ot op ct cp'.split())

↓ ob,os,cb,csはそれぞれopenbuy,opensell,closebuy,closesell的な意味で(^ω^;)

In [3]:
class MA(Tester):
    def __init__(self,df, n1=3, n2=10):
        super(MA,self).__init__(df)
        maf,mas = (lambda n:[df['Close'].rolling(i).mean().values for i in n])([n1,n2])
        self.ob, self.os = maf>mas, maf<mas
        self.cb, self.cs = self.os, self.ob

df = web.get_data_yahoo('JPY=X', start='20000101')
%time res = MA(df).run()
Series(((res['cp']-res['op'])*res['P']).values, index=pd.to_datetime(res['ct'],unit='ns')
).cumsum().plot(figsize=(15,3))
Wall time: 4 ms
Out[3]:
<matplotlib.axes._subplots.AxesSubplot at 0x9f4b550>