2025-06-05 08:48:33 +02:00

62 lines
2.0 KiB
Python

# Example 4.1: Buy-on-Gap Model on SPX Stocks
import numpy as np
import pandas as pd
#import matplotlib.pyplot as plt
#import statsmodels.formula.api as sm
#import statsmodels.tsa.stattools as ts
#import statsmodels.tsa.vector_ar.vecm as vm
op=pd.read_csv('inputDataOHLCDaily_20120424_op.csv')
cl=pd.read_csv('inputDataOHLCDaily_20120424_cl.csv')
stocks=pd.read_csv('inputDataOHLCDaily_20120424_stocks.csv')
op['Var1']=pd.to_datetime(op['Var1'], format='%Y%m%d').dt.date # remove HH:MM:SS
op.columns=np.insert(stocks.values, 0, 'Date')
op.set_index('Date', inplace=True)
cl['Var1']=pd.to_datetime(cl['Var1'], format='%Y%m%d').dt.date # remove HH:MM:SS
cl.columns=np.insert(stocks.values, 0, 'Date')
cl.set_index('Date', inplace=True)
earnann=pd.read_csv('earnannFile.csv')
earnann['Date']=pd.to_datetime(earnann['Date'], format='%Y%m%d').dt.date # remove HH:MM:SS
earnann.set_index('Date', inplace=True)
np.testing.assert_array_equal(stocks.iloc[0,:], earnann.columns)
df=pd.merge(op, cl, how='inner', left_index=True, right_index=True, suffixes=('_op', '_cl'))
df=pd.merge(earnann, df, how='inner', left_index=True, right_index=True)
earnann=df.iloc[:, 0:(earnann.shape[1])].astype(bool)
op=df.iloc[:, (earnann.shape[1]):((earnann.shape[1])+op.shape[1])]
cl=df.iloc[:, ((earnann.shape[1])+op.shape[1]):]
op.columns=stocks.iloc[0,:]
cl.columns=stocks.iloc[0,:]
lookback=90
retC2O=(op-cl.shift())/cl.shift()
stdC2O=retC2O.rolling(lookback).std()
positions=np.zeros(cl.shape)
longs= (retC2O >= 0.5*stdC2O) & earnann
shorts= (retC2O <= -0.5*stdC2O) & earnann
positions[longs]=1
positions[shorts]=-1
ret=np.sum(positions*(cl-op)/op, axis=1)/30
cumret=(np.cumprod(1+ret)-1)
cumret.plot()
print('APR=%f Sharpe=%f' % (np.prod(1+ret)**(252/len(ret))-1, np.sqrt(252)*np.mean(ret)/np.std(ret)))
from calculateMaxDD import calculateMaxDD
maxDD, maxDDD, i=calculateMaxDD(cumret.fillna(0))
print('Max DD=%f Max DDD in days=%i' % (maxDD, maxDDD))
#APR=0.068126 Sharpe=1.494743
#Max DD=-0.026052 Max DDD in days=109