In [1]:
from IPython.display import display
import xarray as xr
import qnt.data as qndata
import qnt.output as qnout
import qnt.ta as qnta
import qnt.stats as qns
def get_SPX(market_data):
index_name = 'SPX'
index_data = qndata.index.load_data(assets=[index_name], min_date='2005-01-01', forward_order=True)
spx_data = index_data.sel(asset=index_name)
spx_data = xr.align(spx_data, market_data.isel(field=0), join='right')[0]
return spx_data
def get_strategy_1(data, spx, params):
def get_trix(prices, index, periods):
result = prices.copy(True)
t = qnta.trix(index, periods)
for a in prices.asset.values:
result.loc[{"asset": a}] = t
return result
trix = get_trix(data.sel(field='close'), spx, 40)
strategy_1 = trix.shift(time=params[0]) < trix.shift(time=params[1])
strategy_2 = trix.shift(time=params[2]) > trix.shift(time=params[3])
weights = strategy_1 * strategy_2 * data.sel(field="is_liquid")
return weights.fillna(0)
def get_strategy_2(data, spx, params):
def get_rsi(prices, index, periods):
result = prices.copy(True)
r = qnta.rsi(index, periods)
for a in prices.asset.values:
result.loc[{"asset": a}] = r
return result
rsi = get_rsi(data.sel(field='close'), spx, 40)
strategy_1 = rsi.shift(time=params[0]) < rsi.shift(time=params[1])
strategy_2 = rsi.shift(time=params[2]) > rsi.shift(time=params[3])
weights = strategy_1 * strategy_2 * data.sel(field="is_liquid")
return weights.fillna(0)
def get_strategy_3(data, spx, params):
def get_roc(prices, index, periods):
result = prices.copy(True)
r = qnta.roc(index, periods)
for a in prices.asset.values:
result.loc[{"asset": a}] = r
return result
roc = get_roc(data.sel(field='close'), spx, 15)
strategy_1 = roc.shift(time=params[0]) < roc.shift(time=params[1])
strategy_2 = roc.shift(time=params[2]) > roc.shift(time=params[3])
weights = strategy_1 * strategy_2 * data.sel(field="is_liquid")
return weights.fillna(0)
data = qndata.stocks.load_ndx_data(min_date="2005-01-01")
spx = get_SPX(data)
weights_1_1 = get_strategy_1(data, spx, [142, 54, 132, 63]) # 1.0330127484868614 Sharpe Ratio
weights_1_2 = get_strategy_1(data, spx, [166, 75, 46, 24]) # 0.9591131817092265 Sharpe Ratio
weights_2 = get_strategy_2(data, spx, [159, 78, 77, 167]) # 0.8568070000760702 Sharpe Ratio
weights_3 = get_strategy_3(data, spx, [10, 27, 29, 41]) # 0.835419 Sharpe Ratio
weights_all = weights_1_1 + weights_1_2 + weights_2 + weights_3
weights = qnout.clean(output=weights_all, data=data, kind="stocks_nasdaq100")
def print_statistic(data, weights_all):
import plotly.graph_objs as go
import qnt.stats as qnstats
stats = qnstats.calc_stat(data, weights_all)
display(stats.to_pandas().tail(5))
equity_curve = stats.loc[:, "equity"]
fig = go.Figure(data=[
go.Scatter(
x=equity_curve.time.to_pandas(),
y=equity_curve,
hovertext="Equity curve",
)
])
fig.update_yaxes(fixedrange=False)
fig.show()
print_statistic(data, weights)