<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Help !]]></title><description><![CDATA[<p dir="auto">Hi!</p>
<p dir="auto">I'm trying to use the optimizer on this strategy that I found in the official documentation, can anyone help me?</p>
<pre><code>## modified startegy

import xarray as xr
import numpy as np

import qnt.backtester as qnbt
import qnt.data as qndata
import qnt.ta as qnta

import qnt.data as qndata
import qnt.ta as qnta
import qnt.output as qnout
import qnt.stats as qns
import qnt.log as qnlog
import qnt.optimizer as qnop
import qnt.backtester as qnbt

import xarray as xr




def load_data(period):
    futures= qndata.futures.load_data(tail=period, assets=["F_DX"]).isel(asset=0)
    crypto=  qndata.cryptofutures.load_data(tail=period)
    return {"futures": futures, "crypto": crypto}, futures.time.values



def window(data, max_date: np.datetime64, lookback_period: int):
    min_date= max_date - np.timedelta64(lookback_period, "D")
    return {
        "futures": data["futures"].sel(time=slice(min_date, max_date)),
        "crypto":  data["crypto"].sel(time=slice(min_date, max_date)),
    }

data = qndata.cryptofutures.load_data(min_date='2014-01-01')

futures= qndata.futures.load_data(tail=365, assets=["F_DX"]).isel(asset=0)
crypto=  qndata.cryptofutures.load_data(tail=365)

data = {"futures": futures, "crypto": crypto}, futures.time.values

def strategy(data,param1=20,param2=20):
    close_futures= data["futures"].sel(field="close")
    close_crypto=  data["crypto"].sel(field="close")
    sma20 = qnta.sma(close_futures, param1)#.isel(time=-1)
    sma20_crypto = qnta.sma(close_crypto, param2)#.isel(time=-1)
    return xr.where(sma20 &lt; sma20_crypto, 1, -1)





result = qnop.optimize_strategy(
    data,
    strategy,
    qnop.full_range_args_generator(
        param1=range(5, 1500, 5), # min, max, step
        param2=range(5, 1000, 5)   # min, max, step
    ),
    workers=1 # you can set more workers on your PC
)

qnop.build_plot(result)

print("---")
print("Best iteration:")
display(result['best_iteration'])

</code></pre>
]]></description><link>http://quantiacs.com/community/topic/77/help</link><generator>RSS for Node</generator><lastBuildDate>Fri, 15 May 2026 04:23:08 GMT</lastBuildDate><atom:link href="http://quantiacs.com/community/topic/77.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 May 2021 08:49:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Help ! on Tue, 25 May 2021 17:51:53 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="http://quantiacs.com/community/uid/15">@magenta-grimer</a> There are 2 things you might want to change:</p>
<p dir="auto">1: the lookback_period is 365 but you want a 400-day SMA. This will only produce NaNs, so the boolean array <em>sma20 &lt; sma20_crypto</em> will be False everywhere resulting in -1 weights. 2*365 as lookback does the trick for these settings.</p>
<p dir="auto">2: Bitcoin is trading 24/7, futures aren't. Better use crypto.time.values instead of futures.time.values for the output of load_data.</p>
<p dir="auto">There might be something else that I didn't catch but the resulting sharpe is at least close to what would be expected (1.109 with 5 and 385)</p>
]]></description><link>http://quantiacs.com/community/post/327</link><guid isPermaLink="true">http://quantiacs.com/community/post/327</guid><dc:creator><![CDATA[antinomy]]></dc:creator><pubDate>Tue, 25 May 2021 17:51:53 GMT</pubDate></item><item><title><![CDATA[Reply to Help ! on Tue, 25 May 2021 16:04:04 GMT]]></title><description><![CDATA[<p dir="auto">After a lot of time I get this:</p>
<p dir="auto"><img src="/community/assets/uploads/files/1621958489031-quantiacs1.jpg" alt="quantiacs1.JPG" class="img-responsive img-markdown" /></p>
<p dir="auto">then I run the backtest with the parameters I've found....and I get a totally different result!</p>
<p dir="auto">How's that?</p>
<p dir="auto">first block to find params:</p>
<pre><code>import xarray as xr
import numpy as np

import qnt.backtester as qnbt
import qnt.data as qndata
import qnt.ta as qnta

import qnt.data as qndata
import qnt.ta as qnta
import qnt.output as qnout
import qnt.stats as qns
import qnt.log as qnlog
import qnt.optimizer as qnop
import qnt.backtester as qnbt

import xarray as xr


def align_data_by_time(data, data_for_align):
    data_for_outer = xr.align(data.time, data_for_align, join='outer')[1]
    ff = data_for_outer.ffill(dim='time')
    r = ff.sel(time=data.time)
    return r


min_date = '2014-01-01'
cryptofutures = qndata.cryptofutures.load_data(min_date=min_date)

futures = align_data_by_time(
    data=cryptofutures,
    data_for_align=qndata.futures.load_data(min_date=min_date, assets=["F_DX"]))

data = {"futures": futures, "cryptofutures": cryptofutures}


def strategy(data, param1=20, param2=20): #5 param1 , 385 param 2 best fit
    close_futures = data["futures"].sel(field="close").drop('asset')
    close_crypto = data["cryptofutures"].sel(field="close")
    sma20 = qnta.sma(close_futures, param1)
    sma20_crypto = qnta.sma(close_crypto, param2)
    a = xr.where(sma20 &lt; sma20_crypto, 1, -1)
    return a


def stats_function(data, output):
    start_date = qns.get_default_is_start_date_for_type('cryptofutures')
    stat = qns.calc_stat(data['cryptofutures'], output.sel(time=slice(start_date, None)))
    return stat.isel(time=-1).to_pandas().to_dict()


result = qnop.optimize_strategy(
    data,
    strategy,
    qnop.full_range_args_generator(
        param1=range(5, 1500, 10),  # min, max, step
        param2=range(5, 1500, 10)  # min, max, step
    ),
    workers=1,  # you can set more workers on your PC
    stats_function=stats_function,
)

qnop.build_plot(result)

print("---")
print("Best iteration:")
print(result['best_iteration'])
</code></pre>
<p dir="auto">then this cell:</p>
<pre><code>import xarray as xr
import numpy as np

import qnt.backtester as qnbt
import qnt.data as qndata
import qnt.ta as qnta



def load_data(period):
    futures= qndata.futures.load_data(tail=period, assets=["F_DX"]).isel(asset=0)
    crypto=  qndata.cryptofutures.load_data(tail=period)
    return {"futures": futures, "crypto": crypto}, futures.time.values



def window(data, max_date: np.datetime64, lookback_period: int):
    min_date= max_date - np.timedelta64(lookback_period, "D")
    return {
        "futures": data["futures"].sel(time=slice(min_date, max_date)),
        "crypto":  data["crypto"].sel(time=slice(min_date, max_date)),
    }



def strategy(data):
    close_futures= data["futures"].sel(field="close")
    close_crypto=  data["crypto"].sel(field="close")
    sma20 = qnta.sma(close_futures, 400).isel(time=-1)
    sma20_crypto = qnta.sma(close_crypto, 400).isel(time=-1)
    return xr.where(sma20 &lt; sma20_crypto, 1, -1)



qnbt.backtest(
    competition_type= "cryptofutures",
    load_data= load_data,
    lookback_period= 365,
    start_date= "2014-01-01",
    strategy= strategy,
    window= window
)
</code></pre>
<p dir="auto">And I get a negative Sharpe!!! I tried with param1 5 and param2 385, too. Same bad results!<br />
The optimizer says that for these values I should get Sharpe &gt;1 !!!</p>
]]></description><link>http://quantiacs.com/community/post/324</link><guid isPermaLink="true">http://quantiacs.com/community/post/324</guid><dc:creator><![CDATA[magenta.grimer]]></dc:creator><pubDate>Tue, 25 May 2021 16:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to Help ! on Tue, 25 May 2021 10:08:52 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="http://quantiacs.com/community/uid/15">@magenta-grimer</a></p>
<p dir="auto">Hello. Try this</p>
<pre><code>import xarray as xr
import numpy as np

import qnt.backtester as qnbt
import qnt.data as qndata
import qnt.ta as qnta

import qnt.data as qndata
import qnt.ta as qnta
import qnt.output as qnout
import qnt.stats as qns
import qnt.log as qnlog
import qnt.optimizer as qnop
import qnt.backtester as qnbt

import xarray as xr


def align_data_by_time(data, data_for_align):
    data_for_outer = xr.align(data.time, data_for_align, join='outer')[1]
    ff = data_for_outer.ffill(dim='time')
    r = ff.sel(time=data.time)
    return r


min_date = '2014-01-01'
cryptofutures = qndata.cryptofutures.load_data(min_date=min_date)

futures = align_data_by_time(
    data=cryptofutures,
    data_for_align=qndata.futures.load_data(min_date=min_date, assets=["F_DX"]))

data = {"futures": futures, "cryptofutures": cryptofutures}


def strategy(data, param1=20, param2=20):
    close_futures = data["futures"].sel(field="close").drop('asset')
    close_crypto = data["cryptofutures"].sel(field="close")
    sma20 = qnta.sma(close_futures, param1)
    sma20_crypto = qnta.sma(close_crypto, param2)
    a = xr.where(sma20 &lt; sma20_crypto, 1, -1)
    return a


def stats_function(data, output):
    start_date = qns.get_default_is_start_date_for_type('cryptofutures')
    stat = qns.calc_stat(data['cryptofutures'], output.sel(time=slice(start_date, None)))
    return stat.isel(time=-1).to_pandas().to_dict()


result = qnop.optimize_strategy(
    data,
    strategy,
    qnop.full_range_args_generator(
        param1=range(5, 150, 15),  # min, max, step
        param2=range(5, 100, 15)  # min, max, step
    ),
    workers=1,  # you can set more workers on your PC
    stats_function=stats_function,
)

qnop.build_plot(result)

print("---")
print("Best iteration:")
print(result['best_iteration'])
</code></pre>
]]></description><link>http://quantiacs.com/community/post/321</link><guid isPermaLink="true">http://quantiacs.com/community/post/321</guid><dc:creator><![CDATA[Vyacheslav_B]]></dc:creator><pubDate>Tue, 25 May 2021 10:08:52 GMT</pubDate></item></channel></rss>