algo_trading_book/PythonCodesAndData/andrewlo_2007_2012.py
2025-06-05 08:48:33 +02:00

53 lines
2.1 KiB
Python

# Example 4.3: Linear Long-Short Model on 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
# Stocks
cl_=pd.read_csv('inputDataOHLCDaily_20120424_cl.csv')
stocks=pd.read_csv('inputDataOHLCDaily_20120424_stocks.csv')
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)
cl_=cl_.loc[(cl_.index >= pd.datetime(2007,1, 3).date()) & (cl_.index <= pd.datetime(2011,12,30).date()),:]
op=pd.read_csv('inputDataOHLCDaily_20120424_op.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)
op=op.loc[(op.index >= pd.datetime(2007,1, 3).date()) & (op.index <= pd.datetime(2011,12,30).date()),:]
ret=cl_.pct_change() # daily returns
marketRet=np.mean(ret, axis=1) # equal weighted market index return
weights=-(np.array(ret)-np.reshape(marketRet.values, (ret.shape[0], 1)))
weights=weights/pd.DataFrame(np.abs(weights)).sum(axis=1).values.reshape((weights.shape[0], 1))
weights=pd.DataFrame(weights, columns=stocks.values[0], index=np.array(ret.index))
dailyret=(weights.shift()*ret).sum(axis=1) # Capital is always one
((1+dailyret).cumprod()-1).plot()
print('APR=%f Sharpe=%f' % (np.prod(1+dailyret)**(252/len(dailyret))-1, np.sqrt(252)*np.mean(dailyret)/np.std(dailyret)))
# APR=13.7%, Sharpe=1.3
ret=(op-cl_.shift())/cl_.shift() # daily returns
marketRet=np.mean(ret, axis=1) # equal weighted market index return
weights=-(np.array(ret)-np.reshape(marketRet.values, (ret.shape[0], 1)))
weights=weights/pd.DataFrame(np.abs(weights)).sum(axis=1).values.reshape((weights.shape[0], 1))
weights=pd.DataFrame(weights, columns=stocks.values[0], index=np.array(ret.index))
dailyret=(weights*(cl_-op)/op).sum(axis=1) # Capital is always one
((1+dailyret).cumprod()-1).plot()
print('APR=%f Sharpe=%f' % (np.prod(1+dailyret)**(252/len(dailyret))-1, np.sqrt(252)*np.mean(dailyret)/np.std(dailyret)))