%matplotlib inline
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import pandas_datareader.data as web
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())
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))