From 23c18626100e3b4689c8d2fb50311ca4e50eadb4 Mon Sep 17 00:00:00 2001 From: David Brazda Date: Thu, 26 Jun 2025 10:14:25 +0200 Subject: [PATCH] commit po pul roce --- features_targets.md | 243 +++++++++++++++++++++++++++++++++ image-1.png | Bin 0 -> 84548 bytes ml-snippets.md | 317 ++++++++++++++++++++++++++++++++++++++++++++ vbt-snippets.md | 36 ++++- 4 files changed, 594 insertions(+), 2 deletions(-) create mode 100644 features_targets.md create mode 100644 image-1.png create mode 100644 ml-snippets.md diff --git a/features_targets.md b/features_targets.md new file mode 100644 index 0000000..48a73e6 --- /dev/null +++ b/features_targets.md @@ -0,0 +1,243 @@ + + +# Things to try + +TODO: +* lepsi labeling +* continue here https://claude.ai/chat/b3ee78b6-9662-4f25-95f0-ecac4a78a41b +* try model with other symbols +* rey different retraining options (even hourly) + +Features: +- add datetime features (useful for rush hour model) +- add MT features as columns +- use convolutional networks to create features (https://www.youtube.com/watch?v=6wK4q8QvsV4) +Enhance model: +* multi target see xgb doc +* use SL with target price, with validy for few seconds +* how handle imbalanced datase https://xgboost.readthedocs.io/en/stable/tutorials/param_tuning.html + + +Target: +- maybe add manual labeling + +# Features + +```python + + def prepare_features(self, df: pd.DataFrame) -> tuple[pd.DataFrame, list]: + """Prepare enhanced features from input df with focus on predictive potential""" + features = pd.DataFrame(index=df.index) + + # Original ohlcv added to features + features['close'] = df['close'] + features['volume'] = df['volume'] + features['trades_count'] = df['trades'] + features['buy_volume'] = df['buyvolume'] + features['sell_volume'] = df['sellvolume'] + features['high'] = df['high'] + features['low'] = df['low'] + # features['log_return'] = np.log(features['close'] / features['close'].shift(1)) + # features['returns_1'] = features['close'].pct_change() + # features['returns_5'] = features['close'].pct_change(5) + # features['returns_20'] = features['close'].pct_change(20) + + def get_fib_windows(): + """ + #TODO based on real time (originally for 1s bars) + + Generate Fibonacci sequence windows up to ~1 hour (3600 seconds) + Returns sequence: 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584 + """ + fib_windows = [3, 5] + while fib_windows[-1] < 3600/60: + next_fib = fib_windows[-1] + fib_windows[-2] + if next_fib > 3600/60: + break + fib_windows.append(next_fib) + return fib_windows + + fib_windows = get_fib_windows() + + # Base price and returns + features['log_return'] = np.log(features['close'] / features['close'].shift(1)) + features['price_velocity'] = (features['close'] - features['close'].shift(1)) / 1.0 # per second + features['price_acceleration'] = features['price_velocity'] - features['price_velocity'].shift(1) + + # Fibonacci-based features + for window in fib_windows: + # Price features + features[f'log_return_{window}s'] = np.log(features['close'] / features['close'].shift(window)) + features[f'volatility_{window}s'] = features['log_return'].rolling(window).std() + features[f'range_{window}s'] = (features['high'].rolling(window).max() - + features['low'].rolling(window).min()) / features['close'] + + # Volume features + features[f'volume_momentum_{window}s'] = ( + features['volume'].rolling(window).mean() / + features['volume'].rolling(window * 2).mean() + ) + + features[f'buy_volume_momentum_{window}s'] = ( + features['buy_volume'].rolling(window).mean() / + features['buy_volume'].rolling(window * 2).mean() + ) + + features[f'sell_volume_momentum_{window}s'] = ( + features['sell_volume'].rolling(window).mean() / + features['sell_volume'].rolling(window * 2).mean() + ) + + # Trade features + features[f'trade_intensity_{window}s'] = ( + features['trades_count'].rolling(window).mean() / + features['trades_count'].rolling(window * 2).mean() + ) + + features[f'avg_trade_size_{window}s'] = ( + features['volume'].rolling(window).sum() / + features['trades_count'].rolling(window).sum() + ) + + # Order flow features + features[f'cum_volume_delta_{window}s'] = ( + features['buy_volume'] - features['sell_volume'] + ).rolling(window).sum() + + features[f'volume_pressure_{window}s'] = ( + features['buy_volume'].rolling(window).sum() / + features['sell_volume'].rolling(window).sum() + ) + + # Price efficiency + features[f'price_efficiency_{window}s'] = ( + np.abs(features['close'] - features['close'].shift(window)) / + (features['high'].rolling(window).max() - features['low'].rolling(window).min()) + ) + + # Moving averages and their crosses + features[f'sma_{window}s'] = features['close'].rolling(window).mean() + if window > 5: # Create MA crosses with shorter timeframe + features[f'ma_cross_5_{window}s'] = ( + features['close'].rolling(5).mean() - + features['close'].rolling(window).mean() + ) + + # MA-based features + ma_lengths = [5, 10, 20, 50] + for length in ma_lengths: + # Regular MAs + features[f'ma_{length}'] = features['close'].rolling(length).mean() + + # MA slopes (rate of change) + features[f'ma_{length}_slope'] = features[f'ma_{length}'].pct_change(3) + + # Price distance from MA + features[f'price_ma_{length}_dist'] = (features['close'] - features[f'ma_{length}']) / features[f'ma_{length}'] + + # MA crossovers + if length > 5: + features[f'ma_5_{length}_cross'] = (features['ma_5'] - features[f'ma_{length}']) / features[f'ma_{length}'] + + # MA convergence/divergence + features['ma_convergence'] = ((features['ma_5'] - features['ma_20']).abs() / + features['ma_20'].rolling(10).mean()) + + # Volatility features using MAs + features['ma_volatility'] = features['ma_5'].rolling(10).std() / features['ma_20'] + + # MA momentum + features['ma_momentum'] = (features['ma_5'] / features['ma_5'].shift(5) - 1) * 100 + + + # Cleanup and feature selection + features = features.replace([np.inf, -np.inf], np.nan) + + lookback = 1000 + if len(features) > lookback: + rolling_corr = features.iloc[-lookback:].corr().abs() + upper = rolling_corr.where(np.triu(np.ones(rolling_corr.shape), k=1).astype(bool)) + to_drop = [column for column in upper.columns if any(upper[column] > 0.95)] + print(f"Column highly correlated - maybe drop? {to_drop} ") + #features = features.drop(columns=to_drop) + + feature_columns = list(features.columns) + print(f"Features shape before dropna: {features.shape}") + + return features.dropna(), feature_columns +``` + + + +# Targets +## Unbalanced classes + +```python +from xgboost import XGBClassifier + +# Compute scale_pos_weight +n_0 = sum(y_train == 0) +n_1 = sum(y_train == 1) +scale_pos_weight = n_0 / n_1 + +model = XGBClassifier(scale_pos_weight=scale_pos_weight, ...) +``` + + +```python + def create_target_regressor(self, df: pd.DataFrame) -> pd.Series: + """ + https://claude.ai/chat/8e7fe81c-ddbe-4e64-9af0-2bc4764fc5f0 + + Creates enhanced target variable using adaptive returns based on market conditions. + Key improvements: + 1. Multi-timeframe momentum approach + 2. Volume-volatility regime adaptation + 3. Trend-following vs mean-reversion regime detection + 4. Noise reduction through sophisticated filtering + + Parameters: + ----------- + df : pd.DataFrame + Features df containing required columns: 'close', 'volume', volatility features + + Returns: + -------- + pd.Series + Enhanced target variable with cross-day targets removed + """ + + future_bars= self.config.forward_bars + + future_ma_fast = df['close'].shift(-future_bars).rolling(5).mean() + + # Calculate forward returns (original approach) + forward_returns = df['close'].shift(-future_bars) / df['close'] - 1 + + target = forward_returns + + # 6. Advanced noise reduction + # Use exponential moving standard deviation for dynamic thresholds + target_std = target.ewm(span=50, min_periods=20).std() + + # Adaptive thresholds based on rolling standard deviation + upper_clip = 2.5 * target_std + lower_clip = -2.5 * target_std + + # Apply soft clipping using hyperbolic tangent + target = target_std * np.tanh(target / target_std) + + # Final hard clips for extreme outliers + target = target.clip(lower=lower_clip, upper=upper_clip) + + + # 7. Remove cross-day targets and intraday seasonality + target = self.remove_crossday_targets(target, df, future_bars) + + #only 10% of extreme values from both sides are kept + #target = target.where((target > target.quantile(0.9)) | (target < target.quantile(0.1)), 0) + + print("after target generation", target.index[[0, -1]]) + + return target +``` \ No newline at end of file diff --git a/image-1.png b/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a730f81e0326edc53a64089fb8d6bc1d2b69411a GIT binary patch literal 84548 zcmbSzby$>5+qWPnAtJ3Pp)^RSAkrWW(j7}FosvqU2qGnobayvPBOxHMbfYM_bhFeq z3wqzrqtE-#=W(b@?CxB1&79}2X8q)4#c{Amu`XS@gd-^-qIl^Ndhex6m!~mM!FN=K z9hSg5||jNf9CCS12n}m~jMiC+(ZmT`XOJ-)ymL6K%8K zQyyazK|~c=u&sIJb5&tE%#0Y*>Xw@o6O7B2`MLLGiWXE{{5sES_jwucp2oER#+b`Un+%F{PE__il_&gjNPSn7#; zgTK%|Uy(XaPYj22V8bZ_&Qc*@zu0Hg9aBA;w4LF&Hu-u;MUBIxPw*;->w(Pzk0Qav ztl6O*EX#e@CiFK_87(oC#tOV$<KjV->9Se_0TEY)~Uw<^v zDrHPFMKhqGT=^WJ`|>9F&<(*x{46vyRE(Q6HobiN?AFt@MMXBBeQ*#x0|5a7$KP?o z=;YQWt4oO%AWl=eH8Up#qtOuuHy;@Vlwd+?9A$J~kC&NtFg=-xDH;$sJM2xC|MHrO zW!QDSZa)aTd(C=1k7VrDVYjt=Di(aC@T^Ps)OO4;%Je6@#b^be`H{8jQKdNZ_yc_GfOCrRjS+=`ZRd}jocc~(+BIy(B<@q&PL-R|(= z_CmwnxVh+1WoLvX?Bg?dj9Ex+#&-TD)yK1=hO>!MV>wybplz{P^9t)39Rc~VIV!P$ zES)+;ywkL4RMDGDs5JPL6N>j(7^yxwdMU~A?T$VVE{DRR;}zJ0k9I1b?=Sj7aFv-qzCxeqlzdi--HZMXg%`kKsqHhT zdz>eX8HZmS$qH3by*!P?qDuA=yYPvtSsCQci+4|Q2qB97d%G?Z^=?N}6zY;k>HMfZ z7&bH^cj?}+-H^Dyft=!>UqW)#3f&LqqVh?HY4RLboo3uBoz|zz%}0iVaV;k*>V5?A zlu3peK%LeLBDz=`CS%aeAR8$ZDnZ=KS?{n(mapEJ)5z=GBq_i0R>-n{Ro4DxAU>b@ za9(lEz>81O*?0EVL>+Pv<6TzzBL$Ec>HaiHf)l|sPm0$+@o30a@;~hP+_vh|)@{wk zBI9v%U5IyD$=_t^%+!887eRVw(O=unS=V(_G&kstf)bNj!Evw0>2u6H&2mQf{pirz z+FHle@qG2-W|k3p{mH7ASi-BhQRW5J^S%`BMHS0Q^#`;5`!gOhW;2K;#`%@33=ZkZ zHHZs?+hd1i<+;IdjmbOvNLqYe1lx;EiOv|demHP)GX!wARiAnmAOkQa5^LEC& zDK!;KmOGp!_1PT9eUwdz&LHv*6Wux$9JbyLoN2jbIJn;EC&ojcpdW6}|Ftyw2OvBl<%ev)QNqP*CzfYlL z!K!ABV?He>W~ok{Gpb*9hYizsoI@pA^u%l=^(y5@7L+L)5nXcVG@X0%yVLQJ#5L#_ ziLj5m9H|1Z-PXJ(?0CvFsbYap#B%P@&QfY9comIJ%PFWzL-G=<2$BMVW>~2+UNA-2!6`iD%&K{pFQQ@CMh-ZHI7S(0Uy$wn)cbUaw>yWPlm1-ehluP z+mArboiK$!QV#nGQX10wlf4P31ALrlg(&bgdml^zE)9v&Jpo&-&r?#jgLBG0jDtv3 zH(g3jodiqcIho6hHxr^~n6tQkX*FM}(4-~x`$!mCM2VEkD27x2>HYmH} z3Hn-u8B^hPTSIEP5Su1+GYvZBL)u(z0SeQ}46csOG+t1sNFeqwaSFFI8HA`r~E_sp~K)Eg|LxHy|;ObXWxF9)c=$&Qkn>GFiqOjl;S zV+>Y=!Qya!Y<6FCt9x>@aiZJf4EZ@# zzb(p~q;+>UbWIvWiE_vDU_PTdzO64*4#ouLQ;5pFawoab>}7M-+!BYk(4)1QUMnHp zkBB{$wiZSOU1&*%d(Ep&g9wxNdLzL)FcV=d4tP7`Ag5t(0v|_P$y>DsQg_jH{L%s} zx6YdB^jNR!Fa?k68Y2>jw zpHQb-tIWyo9DN*zebtsxfZ;L^w^PmE*0>cIjS`?DM8L8V9QKf`Q)blqxoTMrDHq#| z(LApYR%odx0g7}vk*9)Bd z?S|d6#nWxUf_dM)Pc2pCb6PcvPxINmQ--un;g;8A?YkFu4|K}P)j7%X6!oO&#$*^O z`-}92`A$1nV7>07lbS*aujfB4f0-t%3$0~^Yuu2k8m(DWW7;iX|Db|@E1CSxtmcBm zXHE04d2Ub&r6QOg_-Iw!Wm>}m&FPfsxlp4$is21>{!bFASno~?Jx-)`+pY%-De18* zQN5l65J!1iDv!I1CD5s!3jwF3}1C!Tj_rGeeha1wW8^g(9B)JjGdZh~Sgju{bV^V6b&HNS#LS4f!8&Le+f9OoTjUmNz&Qb&a#VPUT@ zS#HT6m(986qo3Qe7kfj9#` zJl|lziwR<2EmLnGC#m{%`DykYoXWhor(0xXRx)cDcYNJ`@b2bv@m#)oeXvvRb2hV< zeNjwQ+M&p@Y^p|gO|g5i^r(x1n?|bAQRl-|a~b1dm7kldStVD>NQX6J?T11+U>(j~ zHcUDJ_-X*@S2aseVWg=E-a_L!!J8U5Tu3Z5&5~M%KO{bpO7eCqHYMrSDn82zwqkUK z2;`4i?{XC0edjiTSHoLQ6o}96@(7{Mo+&IN8cc2<_|pDIjIj9(BMo$NTsnDqpP+`f zp2I~+feG3gzvhie0UnV=}KS)&AC8V03&4-$>PdK%1+Fgc00NLS0V@V64J)N4YO z!7s*gcvOSD3+jXW*3AfL(}%Wen)V!FYi5~D(e`$3LxXG?BA4;auNPWscf8g;)uE^GCiZ6G}czxfeSqxbA!>9Euv{z$nYeQs3RBifgllrApP15#?mW*C|%Jaa0c9vKo`mt72+& z)0*5(<3O7vk+0XC34+bgI8q?KKb_f+F-yK*zl9EsQL7vtc!ASRQ4DX%8*OlC3FmRW zeZp+Gnxd;2YQIo4wrIAQztsM55o@i0$v=6F-At+a+SEO@{U+Eu-r;p>DG0+*3f#xQ zdC=x=MvHrFU;DIKJ~c18WDo-MsUc6vN74319IwU0yabLngr|aOGc=~}Az57bZIpV1 zKVo@=SM}ssN>eaC@$JVJeF3;9-;~wWvs@hMCsNiosb^rA0_2kQ9zWo@B^*ZYXOvU$ z;gt^{dnv`@UxQ#j>hN2Mr-IsyVm{^GVwZaHMTA7qv@@U$zx9-sWJ+Rd_h+#vu0x)z zLyaKh1JOW+1NQ9`Fa;tnET+QCE70Yz%Ozw+B1OA^YuT|c8s*o=N zsGU@cs398fjlMbNWscLMQ7lnOHwYqE6qj<4rp0Ocb!I3lDOUJ=jkq26%8x-C@yn!e zxcs{q$7Blnm3&Q@HTp0vk0xt{5=58J4PoCMTb^0D=yN;{gT_kQm&y*8M_Hw3Sif{} zmNwN?3Wj$0yC37FTIuH|`>~iPmc{T9@|nE9e*g4UzA3}KemN%9Zf}7i5zg5c5H&8- zYIs2nyOZYTVh;~=KQN3e`|bGxB}NAe)OI*r9~Nk_i=ICt9WK@9RJ?{rR`w@8d7(HM zw5dBLI`k}=_t2BN-rW3K+E<0n>ez$Fsh@}QXX;N8=2QHtBR*PlF~J0oyJ7H757WU+ zH2KiCLrK!x<>iayuF$9=@)0(J7L0CcDe_FP{syy#V#f12p=5<^dYIx7jDzJyq{HL( zQkyMhy*5l&yerd54qjhzUz$ikN4sGI5scbh?r@Bm$?_d+;VjT)PQl&{r>H9@H_2RQ z&ToGqmcm4*;jxq+wKCCC3urRnYa`DC@(@yjCI;{7vGXetckdw%`&u2j^%^g^O)You zJFY`vh4p(Yd#ko|OlC3-<{JA8YHoZA68i%~FOWKt_gsEW@Uye_TqBG)T}eu{K0Uvhbuk7=Yv+ zQ!|3~C^WUBOoF4~!Idj=nC$=`HciiR`_WM1pY!SI>n#*N7B|IM*yStTaYMpHXFHh! zrtgWS;vEF07DH2p!zh9{ZnY#(q!Gcd9E+Am4%?!qE=Zg8e+VUmk&Ru=eHjHQ$gOtx zOoE&Nf-Xp#DwLyw8Ca5K`~U;d%{*3S-1f@9~erKd$BQ6H8U$JM&)2GMDUiMkM_ zx&ut?m`@w%7MU~#tWpb;WysSDwp6H~X{rwvd7g!7uKLQs$sZt6xaY!^!u|T*;_mWN zGBxONs9R)0#Wfq;PuNk!Io~Yxr~9)6!q6W&pX%CEbv*Z<&Y6fcO-uPyj7`EaxQ$K} zU9hXtxYzP&vGe*!#6H(@R_cyrK9g@mIgFYFQk@z*4Tp&$aHJX%7l*4!OVph-24w7Z z)x~8V;f09FLIb3S>>Y~N>I&(!%wKIbW3w*OkwJJ?i}nx95Z4w_J}e}-Sj9fJ+{x}U z=_f638A(GszhePd8$-G&1eq=asyWJ%1OzKJam&NZ2yRs>$r5Hn=dk@vw+8s>OHw>j zZRHf%Fg00zO4v0G!y7w4KGt_~wDhwH`&+eS6i2#?z-~w@LD*+wc$^9fC`%LCqHB39 z11Y>j)>9Y+NHvzEXdr@VnK<+V3WLlWDf?102w_~lv`-@sN18r76(C+dt>PvdF7zSg zS#oEJf#&)*?;IPQ&}N3@hZV<(g+jR{B?$~m*o_9>7I4IiAkolBJ6 zsO6Q6%10<)Rg?ErupQq;69vkK6ZLBwV48d}Aj^P=A2GTgSsqI@V*wGWsI|<$zLg^b z?_K@DQ0r>tOu>v;UIu$<8~Ke<9|ZBptEZdvt0@Zc4w|Wnm&gc04arXej8!Tw_l5cG z*hmF_3bz`#A#)icP<9sA8~>amm(Vw=HS}moHXzES_t&P%qt=ED;_Yb|b}A&pXkm$7 zi<_aHyGoIv4~Ns6hO3%$l5P?2={(RKbF3~;soU9Bd6sK9= zVo1v4*t|9qtU6WbHK~T%8nJm2JJIAdZsui49$GX&&WXm7j=T?x;ECDDeGrO|qlz!y zty$ClP5s^Gnd}zYBDK{foicNm_+{RBDzd!m8c~hru7nc#) z8u2^8+&hWi95G00oXDz8?XP!e4}R$Z$@jO|;M}`-gvzMDJ;U zkZk0Ny7l~TEfw!uJ#ztDKgM5DD&-}5D zrTms5NW*zs+E^=D-ed~uz+pDHadfh@;#+}tA?`Lxd)Yjxecm1<7D$SYYPiLDSM0uy zyYu4hbKTSH8WuH0S@X$gTIW5Zmmu3>>|aMXM0nqMkjZQM3U!loWVo-jRM4{1; zeR4O9te@oK=4N0oiVZSrk>aHxU&RM6^JgX{>ZxECx0tKM`s?ZnK9dpgFnD1W1JFm}i*xsM(Ehp}^tLH|x zlMvj(_q(efy;D3eU|D%`^YG(fj&|3Czu)_`okV{!b=q$ZNawFn&B|}f5B7JA2>~E(8u&Hcgp&%U^FRUK2!J4Rak2jAX$UB3F*Y)}F#j8^6YE`)xZ-D&%Q+@P;Sy{6f@nmyO}0Ura+)p9~iM|0Eh0rEa?>}lT_cWIEWwBIR2kNbl!YPWP*A1G$Y%x1I6UV~bJ5+pf>J0@}(P zxLpHBiQNT|8mRr!)}WFc4R15&jO#Y|p)w2YcU7$4lkXLP$!5}VlY{J{Kz)?g1CR)) zXFa;7TT$eE&O2*UM?m*QlJntwt*D|Ba{R$>-%_gCFyXu>I|D!=>FMsy*KIiET8K;K z7WTdFc6PE);j;3;T<2?!O0Mz~!_IIZy)HiJJwfc2O5sOeKr#%JCIZPtE~< z<7l_ggU?}ka6p!aSs(p;WFu(J`ZM$0A;Vi+wTY~&;|j1Fs2EiYjY+LCGUJQ{s0iD# zj77D=wauv1^Ia}UkpRlEo$gQWpk=P1-OOy?WIVr`gC=>ldZBm&7ks5=tZ^EqjRBRz zO`;W1Gx~lb}BLe|xR(WP)0RM?-i3!a{zo6FZIH3E9#h^|N7 zJj^6&=6IfS(=A;!blO5%;laD7$+z!v- z%O%G;)5k#)lPB8GG#=B`H#rY2?>b^#QnW@skgVBAv zrNL|^;JwN5Znh9HsnVO`Pc=)@#ivnA`x7(Eauu1pd3JnEGBh$L4Ylc*E;jB>*mGu3 z>6Dj(Ry&)WhR=I}~*K>7SAFPI(qT~02?O@ztCylH&yN5S^) z(m*?lKA=~ORi2-Pu&F>n;{pXuqVm$)NPBFxvONwBhSQI!XS}`EpD1+iLeo6_Phr+% z1@OCEz{p8Z(Qx|AceGOKfEm0y42{oa!3G{+*wi>s^&QYZVy%XHGpQE5INX|hFh(q6 zsxU4jXP*EzQICtr+}*&7vD@0Uaos=*AkynISjlGa z_gW%n+GIV-VCGIa$XE4qD?)A=NmY9d`P{euR+72?KG*Bb)4zH;4%UXgd4qZ~sL!zl z?2skr=|w*}%-gzUCLx_1pK084V}`nQcUta2Y|o$*ky&e?&+ll_Mn zrzH$xSO{Haq;baQkK)cS^tB#{wH&Lq%bedR^*~13ot6jXbocJ;n7lhoAUJrB>2 z-dEWzAYz z>~yvYA+DkR9>KY%y1)e9X=im}gqVSmR^}Un8NnPt?w&lz7OZnMK`oPr7=S;@5U@c+ z7{epXQ5t59`5J_ordiHQ+H``yu*-<0lGd;v?@t=UX|}IwM<36Uhos38?k^#br3(jg|^*-OX0a{!mFmfafQfh;8tav2l_(QxQN*uZQ>L)faDb zvTXHZ0k`HHfk*&E*&U7d+O&0|^`pc!%+C{cFHP2yZA{uYAMNyaCTl%B36gloEbC!~ z0g!@l$m8F4>6}(vaErG<*}E>a(eU@hc-}_lIpouDkSz1xXCNPaOS&```4<0}^-nwq z=!Fm9S)7EXm;d`2-~~FvJ;^ILO#9Q=-#x3Kktt&L{{!4zLiI!6(OU;)i35ZYq#_tk zj`npcEHs*(Q^kW-Wm|N{%gv*TG@GBUP5|HBJNBWxI>TkRK6EgMZ^eR?-{8}H_-|Ez z6GK5%_l81^()ZqffHUjZA*+ms`FEf+1MBap2WD?At$znL_VH#rFu+^qyJLevj}{Q{ z=m@2$uCCq$M)~MV#LklH>vSnYT0aFN)IgFt)ivYX{@ta{Th`Uu$QrCB=^!gc53iUfILD{jB@|6qcbvU0sshYquU!*IzbNCuKLe zp-T>V2x#4eb;F52YyFp=9#zMAPHR&VMyO@}8fp@{;+ zf3isbEemBy#SlPQ;=$ygqRB*CDtt%-HzQ`Rztp(*Durv2=|IK<=CzpykG>=!&=+H$ zyqpCnGW?l>&)o5L?-}?z^Ll~ITqgjE@$Tu{tGKF~3#q~U{N+CL7_k$d zDGmx+03n92TaAiGV*3j}7BKeEsVG9@ z?yn0_i)?LcFr18sGhmKqsr8Pew#&^aWg=#`864mU=Uqhhn*w<8sY~%~(kFd74kand z{y7Yr`f9^a6_Y4+rq1SP(QL^eY=IO~wIlf55cIx^z$sreo2ax_+xrQSh&6EGJHc1h zmifRo->HoTm+S^o8%mk7Dr;gycs#jps85$x5{!8OBTYf!kSN=AH5eS66!d+16zSNC|JDC*I+C6oXO*AtB-M$+}1ISe1J&q=3?0KS*L;-Y~ z;KIlb{P~I(im~;7mWK^x!F_c6b7S`sJ;XD215H}0&|(V8!OAK(#C}(l>4A(|zNSiLgWF~+iHgi4 z-2#x51CbjshaUc;70&5bsk#mB%gxTHJF(XF*>r*w0G~*;@B+-48D}f?Oo^qQW@7dp zt;{c_=-*N+xQQAwZQJWbQ=em0GWxEtZZD=zXYfOUaT>eS@i2&VArpD9xtIxjx8Ug_ za!5?YJ0`z=G3n2LO|$%6^ymr2yK+2N0|gK9M*-S*_?vP%q(rZu~CP{Lx-9|7Cav zIeRwI;YX9!z(?`Uw?#ssWG>Ehf)%YiF3w_?P@>Sn&2F9Uq>YQ0l}s?H*SJnP)PwDO ztgM(Fy8ex?a)sLz!oZ(a<|y~$V$_68dS`?R7Txx0Y}BDUzWU!bDEX=5EnV&qZCr&u zezM`B0u{L2S}sT3idj4*0^~i~1R{f{m%Ku;=!Zf_#^1v{$*R5XjujXG#*hgZH=ppb zu~Ey(;>6$k1_eEDMAGyI3ffnKzSTl3Y$|<2V;2G4abEI!Pm#SdD+#qp?`LCaNv(h@ zvL0Mp?``kJLlX|cl~ip!!o>_Zc2!kpqC%adsSJptZx*@a)sI0xwAFYyBr3v=K}Koi zqE`wY-jFxa?+pLaCH3IdEBW&_L!R)ysvzQ9bcw|W9n}mfE0=k!_tbX7J3kY^p!V;Z zV*YLc|2FZyZ7#uozxwx)je@6zzkf9Q1-$%s$$&>}mH%7V+|Ji5?_A$!)hx@}x%t(S zq3$m8FLC7Grwf{*uQi;Vf`Y07ej6moB*(FQKZC++Hd>?~!KeZVbA!cL33bHt$2dp? znk4k#-O?-R3L3JUGQWRc=GP-Xbj02&kAAcFfhEvRcmP%Q*v-{#wf?~J`T#U?kK;`c zPT2!}Cr343)7|}ay3Qq)DY{6uqSd=p@EX8;MqYxABgw)))6X#^^6q@}oLM&?W!vii zQ0af(bt)HT`=%ZEL_d?_?EZ_R)*v2$$RSZbkHc~}HJXgYEl#URki&GC|6~kOtB2`P zI+~SMQ($4wI=w#G9T^IrZy3ziQd80c7tP_kvq%CUhVB_6ieFh1q+QeN0NMcQ)5^)o zNsye`0|_WUYr67KsqED@9k6Z%HSn{PJAk!n$e?F%uH*>f2Prw- z2{Fu4Y@~Qn5rRj7fA8gf_*LPigDVlvA4^pdirzdnL@)V}qi6lWdTci|f=SJ4v`A=- zAa@SrSa%m;&q0zD1n&IS%z>IhqHW`4)D-71tij{B63ypQ(a#QIRPg?E=}PMveh>{( zDNxGn>51o&1Ia0n+*m?t8eJgZrDRW)u0c1UNXoZ&G018{l`Clr6xAgy^ zB5008m?<3X!bd7yV91tjB03fcFd!~D@4*+U;6W{y`hX1RF=#$Gr0hkE@HZLq^g94_ zm|ID=2a$o;qt=SUGguw9hOwd>{+-8vRX$H_R9xN-!QHq1Mlnde?dpum8Aww>7Qgk; z0$s}%r1Ka%Qf@aLAA zB~oU8F+QUS_ z%C4YIP>%o+X5~Sh&AH*S@W9)g%b!GsRr8&|63Z}BRUJlVe2shJ0CM5mY#~58^H$jt zfFehmExB|}M(&LDKl~H68)4Er5ucS%YLXgsxI8%Kp!lY?WqLn)ac8$go z{+zrIE`>Wl9Wn{Lho!yzHGqzDa2O%WL>&`)s(BRgef6YapehA|{2Wtp3ODG~O3rhj z(T;@}(pCzb40BCT&miU|Df61nxoJ+nM z>pi^PQ8jD53%Q%?s-MeHE9q{IC_lBPq&AgOx=1L4DdMFP=p(T)WuTAvU@eB&l0aUV zSa@G_6;C=)!BWI=<(z|72a%+eO0~Uf-KiUF{Wj4G-cWR<&$ezWXO z_&1L(f6py!pZn*qz$Y&JvOayczQhv|gD-xR*A`I8jkWgHrgB}Xv;oHDFdq)UMYLb` zR{;!e?*I!3HlF^di1nAJ$A=Ga9M`A$I5{~pJ_1h+sK{R%#bH z9#+9!fh1LYakPLjLvRZzc78a_{+3mTuh%jg!FzH~{uC{S!~F4aV`z}D^g6^gOvEBk zQ?*bh-=&H=ZZySBJm6+BL(Omr*lE=H#Q@xBVTmbspf_39y9s{Do( z(bo)20@_!v2Jo#*n1{0r$4U$bGUZ6D0^Xlg*v@rIwT${hda!;Mu#dMcl;uxcBs&+m zxCFEv_C|m@g2{Lu9}0DUdL+J2UcJ@HByjjMOz3K4ufQ4aA&ZZNjCF+}V0xVj8m2j* zGn(6 zjvSA((~jV?;&yT#kWR6xS*-x&YQ|-~4g{mi63p*3bj`NC$ z0ssxXz}%4CNvsPT%PAiL%NX!Wb)eq^Si(ewHxuMfvs7p8A0&U(;+;zubEU}~pgRLX zvI)EzaB$Y7Jov@@*H2*elwU}zRSe(uk779d*|YvzoOAL@S%@}9d^zub5AzfA8lWov zwKwjLS(%QCQCp?Zx*kWib$GokeSohjkG3~3`-5pTcJdl~|1faK@?X3evH>U#iK%$1 z7gPK}*gV6f*~rk)G(j93_$bt=YYV)c>5VMM>4>3RwUGwj>ts-?DegH6azYK{R67`{Yj-8_E>-?nvMzo9=0jglBCXjpd>P`^w z!Ws9Y)z{neOVzoIuTKvbICR^_!-G61zCzMdEypiR?SEkvxc96{U5@NEEt=ps!Yb5v zzCqhzNCnEWl31NJb*tqrfc!@^SOwnrVGQ=}P!+=z7DM4yP83 z&)k7>IM9N_v^A#E7R2<-PP^XX@@Ij(iv0kq`=&qGemi9YvI7A`Q$wfK3km*Qdwec? ziy6$$d&LRtWdPj(p9*l5v7CWCjYoWT@*OeYoR~6bF`(Kz*TOhPv{Pf3mP1p%fA)={ zUndwaEw=tNp?DvU=ugE(5JXb=a@6JU6t9a0UcdEF1Pm}u-^azQ)SwT3!o7FLp$@sW>_88ge!UP6pbFqO3S_GQ8;>M-oE`#bfoq;n z)0@e~3eI~dBE+_J3+fTe&QMO9apL)kw7^K8KXpc+$v5_0mQG==2iB!%RHBQXAB&&H z2$3)_8Uh%~rp-wGiCx0xduoC9vNr+z%N89cw|CXd1!4V^e=SXA6TrlY5Ic4oe=b_e z|DfD|Oa^1wrG3lnzRbk8;z=nO2PgGnf%mTF{=@Z((9A|2i#DIj<>96HeyNTH41hR2 zSh5qk9|VFRPYhDD<~~`e7BuP+@c)g1Kj)>DYz! zVwbD`Jz(%@b7%u5G3ZsH^xci@!GF;$NE;8N=av)ZAB?C`ST&RdrsLUcI_E3%&01=8+meUneoU1LeFg zCmyK@QhzGVpxZ|V%8ezZ!As@|K3QR+e=l<3nINl35!&9$ga4R==W@yaF$YzlU+@Sb z{+Lz3cU-Z-d9dGH-&Yc(Dt!J&sv@1J>g@E$Wp`Nxc)8<}iC_5b7v<+fRzPQxeK}pc zN5*dQaT~!fLOl`skc{UdtMnUrA;HGK^nMC-F(+`;3V9Cm!wjKP%C#<#M`-aQcwP~+ z5ozI%Y3z0L&rxPAqW(+KmG6tpbw=F2qkWxcrO10%7c6}a70}*53)x$r@c@Jo_zLbo zUONMk0gY_~Bqb+X_>+=Ljw)llo221HXLtO^hx_%mNzbqrZ^>=GWIDRBamId|N*{gI zKp=*({!JZ2{TzD)y@Fz)4&R)H`(c;vG>}a@Gh6J_{8$0eZUVsxS0Fg90^@#fW$e4n z!LXJ!5OkNoCASAt6e2)=0hoddz%_U8m!zvZ-s%DxeeF_4tiibCA@f*d_|hoI4s`|r z;i9X{-}}Fo_aNJU+}czzLnVG{k=fY=gU%9$&HSNU)xvf>zPzn$ri``)rDfIpiCjt6 z+~ytYjCJfaf2$XI6J9Xufx3dO_g8SqCjo5)&iCZYb}}S>2K~77x?6Nz3G>nZx>`9^ zFt6g~=(ZvI(77O5c9Tg0(npB(4wR19-IhzE#Xo>y6R+L=^XH|GiYE#w*TKGeiQHGa zBQ*}!fJzuI;Nkwve5%H2iYaEtgtsj@@gF_xUE7xOko?y~RG3=AjlMN5egj~~r~ zjMk@3zfj5uY z6-J^1is-pHzmVe3!VTPcj?EV52|z1<9?_1Cr-=F^m%uMi-r@EBl+(i3Pme6e%Ro40 zwufi^cri7Yos3peY0c{1#B2dwK1gxAyK#U~ORe>}2Pc|fU@1T3e@Zo%%+m8bZ^9cJfuSNoAXURDQnc|7m zvg+vQz`Wv7ZzlsJHDoHqj3t_*PV|x0?1W^#w=sVDJW`O7&p^Y%c9Y{HdTsjdJPQtL z33Zad;~lo^bt$LI8&}%St7@#>$11g{>gU5b8qTdV%~YG$O_^vy%V4A<841tz`LnY;V z0L)oT*J}6?4Vez-jUi7115*rnY_g~b~(4Te_Io%Sn$ zi5QAg-r2L9zJsauk4K}2xiYH%L5L&b@$b(9@IKf67>sG~+k+@%4gndJO!Q}OOOd2^ zep))@^;-(yvk7CE69=YN20r9on!R5R5h39sKJ`@C9LOyUT~2=9oTE`X4~P&OKu&yK z5(HZ0ZaWH7&(s{k)nPI^J4MEZmU(Swz}SH^(m4Pn(ia?KUB=Ih&QNp#q9+IE-nnG_ zuPh6&zA{?)x{8s9bq7Gsl%lIck3C?`azW0*? zORNIDq|^<-oj?2T`ug8}*IK{D*IT0B_KhifH&VJV(u+Yxp#JMRy|8EnE7IS@+gt|` zmH+w)3R?gD#t0G9D;clRZmntyHbDbV%=ZLxra;_AYTgTcy{w5H=TF4mhO?_ zlAMnoS58EGq)FbUC+3T9np&6+G?MN=MRz-`$nR2{Ksaw@AU>XQHS<| zpwq^MynR5p!rTY{#>09RB~d%b+Tg}%K5PNbSDSM4moS^YN!R#u$jI~LU?0S}Zgqh3 z7Q06$Ac-WU-LVkMrvHXM3ENgMWJLf@wU%sTd+xWJI2H;%>YS!BSkCY-U&mPUR; z#Lp0MpQp({U_*FaC0_)W;Ti_c0xJOd9T^3J0G(0Fv23@0Y# zE&;Il_duUTp8OA8Nc2GJF~b@5$47c=jAWJrv|wiRf&_Jted4ca;(&t$GQaM(t!JE3gC{%roZlD8x+8L z55z#?tW(2Wq*eh4BSE5e`h;=8`Tl$LZ=@psWR9SSHkS$l;uy|~f|Fp?Q0Gd9FMfW) z%2RL&jeS)>put|Is;u(7dP-*%u!jMpY;B0#o7!B-0-O)^8hhb;F+kgnGC1pPYU);9 zY0Hav)bk{@y{Y;U(658WmN)WQ&R}y-yP{Zw3kxSov|oLH2R^*QgWY9rt!CXF(2*W) zc;128r~CR=(zNAEe^oO%^l+_!|KT|QOBGuQufARc+VQ0zJxGPUixIRK9gv1Ku%o2!+3b_sJPgL7i5=_GBGd2Z(R3vFxE3nv$ud2nE}aakM{hG^FBIg*#xvAI-2@O^okGSxsqv5 zHL8jG*6ToJ(@_vOcD8FgR}81)-nP_T5pLo#pI=OmXyJIMB1Qcvw8umMeB{Wmp%C(r zyffLu7w?AwWz}Fpo!W8)dwv)Jgnc%PQ8q)lE7xuofwc=#D&WIh?$XNh`I-R4(Frqg z?gIVE3FzQKw;qW(*h^2D1FZn~HX~Cyo?3x+c2}`IN=UhiT;p)QA5Z~r zCt4nY5vUA=Cwu23rBjSoEH@@~t6pu+F0$=BCglF9*nPmAGXunHgUsF4sT#GY1ToGv zoAzkPD_{*XU_7}~#%3Vd6bXze%5Bum)Q|%_|CEwk^v_MK74FHQq_@rQcua0~TxAYW zf9Uaa31)+W3&hQMYxcy}3>egn=T4106E6Qjl0&(Q{arX1zo#iG&*MCI=eY!*+|rfC zVRzmd$Jn(!t^Ae|hJOrq5jB5ZwSTbk^iLb{8h)UqeJr_%f`-2v11#ks!wmsaKZ;^{ z@*2%ilJS^wO&Sl~y3Ge3s^{|Wvjiyw$Y7Jd(2A>BWNE3KwDnifwbP1WH=T9WHA8N? zPlQ>pB2kbwbqtnzKMLQIdPY`LJ4%$UnR1)8f**(>l%Ihp{qUNs6Y{MEznV~ge=i!S zHT3km-uK{|-N!uYLz2M(>T&c6nX?#o9>Vw@`Q}gbXQhJDGd^WH#aJet7Xfk)BLSKQ z6~9Rc+6{@^i;E~rKqozi74+$zYw?<$#G`!Z!eH{8uZOg;IR7knXl6GR#jRNzE2Ue& z1&~1^RnW0QjunX@lBmHVlu8kudPx5N&{=sNRyM!skJJlG%G9B zlhI19kUIhNV`oMbH!rPElYL5UQ6xp_>f5p(m31zp9tUi2YfeBWbHr_)m|0UfQ#KyZ zo$D0*$Mr{R=2Ot}T{IKEb!T9TU8l+*1q)E#z$@;~OuSR%D^^DUAU{wyCZ*qtw+!0# z^n8eY`N~aw{qye8!f?p&-cuk~!HTtRY(?v*rM8sKH51F0_Mte5I|(6qd3m5|S&x@V z?&hlIFYh0btx0fb36^Sxn}sA(&zVM%)POL07wGrkBXNw;^{2d$8Zkg4%^=-fe-U?q zCM6|-Kq_zvWVdc>lepZx_{1F~zLKH>qhfcyNH^%^c{-@%Mc6!eEU|rADTn6!iCm~i z0*JcL)VmSrOr-^k^IeUk4nb=E7vStmH1Jgd6bA5+`%RD*eP_f8q|)F(1Xfp%?r`r? z(uI0viIi&QJ(shtNasDY1wy*K5BlEv{>iF!$U(2bjGEus4AW=h(7tmSOPc`Wo$L03 zxF&phiezJ_?ap~wEQr@5A;t0)o*`jT5q2gl!|skq@soeTepd6Pz1-!;8cIVHg__+x z28PT~bcUbUQsdaWspto}RGM!cz|osbR8j$EEn=?6|8Zz!Cm{54rS1E?S2Y(pjtk56 zRlXJMb)1u=5{txCkmZ3^#;)5pwPZj-c!EU=;=ov_=0#>RSS{1V8@p=toP*x0{w2I! zLSY4;*!3z~Zsrdt1ups&s6pWkcAa>Cd*V?5>emitTK|PK={>+tI%l}%-v0rc!J#W@ zpv&nj4{-i2bpHU%Z~>HrOOVqZ261q5=Oro^S3NBChZMsFmq|j!eqnfc8_2};k)tRd4>_NkdjWkl1Ss>rgoFP^hoIam1B+3KVfn8M zx`Zl=1{5qmdd?mN#Y&~MLRPx|_ehM(WpVkKp1eMwE!0J6S z1)4~aQh$}LEyRra&h-=dg9uXWqo*t!p9~%)+bsUr4GD(BaDuNN)E!sF5J-LqUx^e# zIbHrj`52tV^Hf9LWexl#*FMU^r%AdObNLk?WE|lm;!poOR`R)iBcV?|V&wmZ>Kkq4}Dv&1gFxLNGQXqu{+~RXpay9@bDa8pwfaffKBzSMa|w(S%SS7H%%9w&h`x~aac{jG zlFB&ZFB7o4$HmSv{fQpryjn`1KEt@l^y@H(xbOatV1Z>zAm^q2Ki=Lls_N|v7nUtZ z3DQal(kY5G(wpvXkdl&;l->wZ0@Bjmjf8-NNJuG-v`9!JB_;5#O?dpD;~no9_rv|- zP~lf=%{B9x&qN0}v*d&XV%>-_S9fO%+UT}pPklK#i~E^2C0|dPTZ3=5SEO|IwX(fG zE0ZB0lAyUHo0iSWh)`{21bjng&O)JV;3d`J-q%uZ7DYB}PHo+O*!4L@t>gi}6IJ1@ zyWr_RaG@?Juc=d2x_;!)4)Lc)lMauCnVJmcj+Z*p)@43g+p-%u0H9!_*vxl0(@DW0 zIV92Ayz5^|50|3dh>A}RXydmW9IWa4F5;Rz)Rr)cTNRl!dG+8=nf6e8O|aym{6{3b zkURkNiWsRasL#PcjJDu>dAE$SrW|KLH^^!o$nHwf$A+Ag^#bGG(~TjsFBBdQ^jc-a zX9^Dq8>p)kPa^K&Pe~pK@-_>vt0WA?uv>x2Ar+Hxp8sl(hv|>@lVt?v>tSGn%nZbM zAOuL-_rs*Co-6{z3s5CY{zvmCSnqyi#<=NV0`!^;cJIDc_GGEM;>Z z{n~tPO{-_@DCd1ESt8NUIzUZ=Su$EB#!}=$6mVjHpBl%8baC>MckkcPI09lKoQIG> zl-99=?NA7pKgL1`)`O;*3-&u z+)sHNq_d|1uxd+Nl)qT3!(rP0r>Pv3e_JarF3`ZQUDN{LWod#RM;=4@H4`*F=Q>JZ z80qO#8E(iw84#vM`bL#`sS5w@dIT?;$pjinFSEW)C&vwW z%9Jw}oetC|UL~uEToh->D~S|Ay1Aoo!4lh~yoZqF6GY3iIz__+y{(uJGrd*EjFtKt zr!KX=&1ozg;N3}A9Iu}%w7?u%-%q5dE(em1c;xWhKdc|!>=&Dt=btFKa|iohD7k3k zQGA^eb*kxaOE{SR>iC8I(u~R1(oc0{0$a3^U7abwaXM4R|Jl|YU|$lY6yZM8pSdpZ zPuu^87b$c|Ql9}TOti^)$2r|y=CCT7FHxTGZc5tZTj9O`0}MQF5IpW|&tD~;ZoDxW zvE+>4^|gf{Jgh*Cb#gBa=Z@|9r1Ys;R6ac%T5P1wa%VW%5y6)FAmy7JPu6eY{x3M_YEn|1Td1{V8+($ z=wv8}uF&hDuJBB6tTqMNh?9Ty_D@3!V19Reduu2WY!<2zpT7^M6z2d;l%OMnS-a}p z-jv%1gRs-9PMM-0%|(|1>8$FG!@Wpz(FFpZEW%8&S_ai@zur)EZvKF4;w&wkc_Tc6 ziTC;R5`IUuOYLGwEB6bqtSGnGyhq#O_-Q$TR_P1?II2A?x%5 zulLlBh#TenI#%YdvQ=5?C3=8ta{{zkP6DSISdddVQQ-%&6D+Sqf!i8|TWjOh?dqwZ z>*G2e$~w!S*T^Q!@eCsKRNL*$(Z7z$MF;{gdJ)%#}%(5BA}@7Y~!soD=nh?Df&oP zOcOU61~4L(G*3?U8XEy>1tiY$*T>7v`ruV)PK&`s;NJ(ETebvXpG9i9t1_So!I0qx zDBg5m#%Yh+#8iM=(10{STK2KC1Kw(PaH3%6Ft6QoyJBDDeY~4!F!P-Zc z+38#b$kMGcl-{%F_#I~2m7dE87d9RLIICGNIs4q+QO27)pkZFB63)UZcNkFe29%!! zzkUa-F0SdXl5IZ2Pkg2%&;S6<8(vij*8uY>JvCvo# z2__8pJ%&+R)mi1K&`;ZA*~p3b=mD)zpJ+W++F#B8e&IR+(l1y;&tbkuk#XrbqAqai ze7@4L%B1c;364fKpL$obKK>NImFsX$n_yQROJacBElZ^X3Pfo2$NFzUj5_9VVsJH# z2=8Ljt4Ey2gKsR3M00La}+Yx1cs28CftL$LDje zSo`=}@>IY+ju(d{b|4x)_&XV2?z$+-8vP=Rp37Kb!>$yli@-Mrh34570LEk3CT}OM!e11(;76fHWsA=}%5V<$ZAh)>ci;4?6vT?+Vlzs=PKZL!pgKsYH zTmsq4Aab-A>*LiWv7We(e;1Um1B{yCkB&QR=W2=JmG{7tE>(5iUC=MBMt%zu|5AUY zUZIR(b?HYTJo^vWQ@XD^Qt2Qo#1FEK0HwA8O0-T+Rm^GroZ~BJki@gIFokx{aC0~X z@O+$E;U*lga|fW^2`HL;4>)Vyc-1WK5JM#YyB%_mKVL8DRc}bRMsg8$ycO2Fwn#`+OYt4g)i~(pERA?Qp z#&+GU>sF*a6QHwCWu<5epr-70xO5O&QMh`ler<+%y)-x9S?mK{Oy~XPyIxbex)hY7p*YhKlw?2 zJLW0`*k*OxB()ER?E}z z{HIc&bJa(f0j>g$$gO7pbfgbJj37z7CVbAc34goKNVm#dJkbDk`?-+APpeXa8uK_K z7D|QH_|Igwb#4HW{QtXz6|^F}JC{3f(+}XLw>*7N&b>$&8U?tip&e+zw*|x#T7cl& z2vmd^0 z9^_$C(e5JtfRzIz;bBjiftc!~=wW_Rg?FM9sGkK_4=7NNuIg8>?ucd(Og(pT<4Jej zJA(Lscj)i>zAcXLR!Z~(*_9n6n*VbuHUV5fCWXHqUN^D>srMN`)A;Rf&5LB!X3)WO z3jt#mfHLW4K~_3S8od7eR>e~Vb8HZu03>DBd<2Ju1eNFMr{&5j^}KcEhfK(T)Wplg zYtDe)v*ZnPP^PsiB|nH2oBapf;m(T!9Vn}jdOUP3XkNq_hAR{!BmgVs^*Z^r_=A8& zj|7c$Yg@wBD-A7U#SAE>bP z&d)yRP|RckySD}SvbVAmtmC=t41pOM90kZ3=j|TO6u_QL@7x^<6q?`yqR;y*u-f0f z8X6l0P}81oXN{aEsQd1(UPj@c%F)q>?~*wumB^>?I|ZULno!H(76zn2fHKVUrcDx& zQxt4W0L)y*)7i3o4Nh(FQ`kE*ZFBv}`11D7O_O6TwsY_@zK2#lQHAe^w8{4&K~#la zQVnmp3{m|=rmchBbrOaxme*RLAe!F7ZN41`H;T`;I%whWNgz+4-x+$p7~lZ_;?5P+ zLm!Z`9K-b%JqqG;M}S^wNgB_tT*WKg8DQfxQTnExf1c^yoX?Jqisq8Fr%Vna2jW7J zXcF2-3S#lSQPc2j%WCE!s=IZb(tK7dUKTN(WRoU`V>>W`BU58SsS1ZCx zJlP4NGT#p~pE<<%i)Af1Hh<>Rz&(2rDG*a6KGu#hhF4S^S7KNie<@+CT)PW;ZJYVL?Ap)t6Tt% z>077po9o9|1MK#T_e+=;M?L}tFU1PpG*xQw!D6_Oa8e3@9RZDaJe=9S&+i`$z8-k; zrc|=$g~1}%gF8;^-X5SJ*0Pb;F2JJm_THH<4CD{)S8u}$05)=A7tw)2lpt^uL4LpO z;nAo?fl`)K0;kR0eBI8=6cF~(kSYp=L<|b#l&78?b)Z z0}d0QOV!%b`~?Me2bJGH`T?{9+fFG8+;#^LpdkKaGcT|DRQ0e;zK^MpQlSADiKvq8 zj=oI&rj5O!l9Ur`k{!^D>3Lce@93GUHgIk;(<*8-9V?bcfa?{M>FIc;5iVRG;J<^~ zmjLKE(m!5S2aUTZ{vRwDK8^&jX+YAoQPr?-WIjvUaJ1E5?t zKml02ISW7=0E>nODo+{%SpKg?g7-84&L<{ec-3r_zPlAVm5lBxPM!qzygyHRd|nP7 z-|p$oLM3DzA+*ebzkFo2)QbLuYV2yM%-0-!Ojr;4Me-=odh$ z)qNRalbC21#zYw`P1VChWbblOOH{SyDvR7h$rJ)2O{8F6 z{t(Tq|1e!N{Ho>P$Jq}Ls3U%aTgH%9JuBL1a_|h3?OxQAj3GmdB@JkueG=@srC$NJ z;VK#7)#~hVxPgQz*y$29UpHl6MEJFFoEya7Mh*Nk^*X#y=Q(Z2t4oo+I6@%%{s?4p zuceR(|A%i3#tKrWS=W=j)u|dEPoaS_vuD*!?BUir1M7Q zc9mMm+NHgUE_`_5(V44!2nZ|S4tH@CUYrQ`ZqE}EzyFUney%Ryi$li?FK>LRp-=)P zJ56%D{Mx7U;o8FoB56_Mmpx&f(eRX4HK5!$%m4U(@W+2rT=%BQ4a-JeTxDa%)xpg~FeFYAFDslmc3f{jTFhKP9h?cjN;6p?2o}d2G{5H=xkX(Xd z?c7*3rH8j-ogUEQ#9{_K?x*{zSp{dkssnX#P;J)+@K(STz^qY99wII|aG?&p1@l26 zQYqR<;C$~HioH3VJB~q%qa4?aujlb$J?LTrsF1E0W`LCaz_2d)_2Y%uHK~9+OLj8h zxAQtglNkbNiUCB0R{fbB`-fj>2HS|H04WhGPfl#s=Olk)J^*YO_;3EiXbLXDKsp*Ey*Ua4FBqXsd>ho|ucCVfK#$^!$Fszb+C-=A08OahN{+N}=IRk_)iu=9YP z;={wk!fvd_Het!lz~JONPA1Orm_D4QgzWL`nf3%-3JqKFO}qo%ogZ^^&a%YWYfkpXs#GsEL6AGf8 z)(;KCzG&4fV;#9kvCk(WPRVa=%Xk)RoQc(0biGYgRgF~Jt`QbL(0gsyo-yEd!|X)6 zwol6V=j~lLN})LwV(nFoSV68ng7K<7fMWvK4Yf8fO=b!JxH>_RcRj312h24I`glt) zemuQZe5N_w5hcJ|nE9%BNEla;1|8we*Vr2?50{Y$uL*VbDnBE)&m}s4t9%2hmQQWo zru)5X5y|5rB;%%CH0I@#xpq#h6|pXJLfAK7Ka&aAPb2rmw^({${C#b?janda{2M1j z0Erj#Q*s3g$P83FJ|Us~CE;v*1sE?N0B}s}>YR$zyR)9u2nZ;Gse+Ka!TgTMl(O&Q z1OAM?booL640;Ev#r(Yyy|j9-L>a1vn&GcuWC|W^?Z{+iBBb{eqkom#7c3+sC;eV6%o5~UKuiUbQ5A(9i=lR4^h z9xLH15G?O2h=%e&41=q}JV7Q3zNH`sy3IR%@Cgj$fR8F^OQyaCE()i9G|o5e>9)9x zA7dr1CXNU0mo9lFhdTb)M@^LcD_0;sBdeE`?~z?%!;0Dpi?M7~exJ>3?W-Y_YL+Ui zNxMYmrJ+N6oI5vg%=;~hy3BBX+D1bdISPCA7vrCdtGfqNz--lU0$WV0J<|galfbHU zQua>q{|KbTjH}zSIl3M3*wuD^mxVwmwFS{uOX@mk!@};x4fvk&xx!;E+;!urgp_f7 zC5hWyvwF0P-D+m<(5<)bip|Nl(uu+?#w5QKjIruQqVSFx(ylsohz3>}+fPz4VlUWM zk{%s6vkD|qijyui1iLa)oWKM*V77qO#PYo}e7)d{bg^`2e^sDI45(6(k~c*DpZ`8z z+&*%_3TmQbZ-Rec1%9l8hLFx2-5>b{E|mYeuOJ%=mQ|pbKq}H-ZW=A@Z6=+yL*?}E ztH6t4VL;OA5qO9eGQgDzq(H!ikV$^%j6)Je1k}a-ji}G==OEWqj$_pRIEWs5tKHSj zKU`ZCMLqH*QNfrN#TBZ#6WfGp95rRxY)cNBn3}jWs!T~1H)Q$@C>`3{5Um(?Cxr$7 z4BrGv2!tCI%c>*LPX-8cIZCDyaofu{-s#(~WmIDfG_Ib17G0EgvfySy!2O<3agJ6pA8tM%!)ao4%M-P!vsBUeu%d;n>~Sz-r&a zGTfhIgAj9yXkk?<1Kyt%)j3P@fwt^vyNkHwV>rkB!Xp2X67X~=5QRinblp4W^7iKn z1@Hs;>f4}X^Zj3eh5shG91z-;yy{;3|H$(d*#G?lVeyLv0WaV$Q7cUzt@Xg5xjP2Q zDFVyhSyPGZ>`4s1-X_#-FFU@ZLqC$OB;EN?osU&aL&&aHX&rjy)vKcqR#Q?M9+s@S zZ|;|M_gtsGBTKaU_#er8{OJE6c`I$9NpE_I{wsMeNi;7c5C5t^fwG}c`AedW;%6-H z-^ATO&{8XR22w5@W=B9H|EGcHNw=wYA^=W<}6fsL6WTW{(4$y`M2mx??5J^*@sr9nI&)=&Pue z#XB6Ck~QopUv+xTdSbLx4Am~5yM+N(pzonXoKM2GI#W^vH^yez2i6;PXIpT9 z^2Nz;c~AyM877liWrwphwA^<8w6$5Mh^c+bN^ha8H`s{wpv26iF7+1sVRxM8QUCkr zQ-_Op^S(;wPZKoelAAy%SkmdLMQIHh$1Re-n22kmS$@)&wmK+#i}n_k*PukU$60G_ zp;l5YUHik30A?Lq+mrU>TCVL6+)oF?=?k>u-wuc8szAt+#2JQ!SA7IqaTRh+zUFQg z$JIW1YtGsC<=va=mkIixpfQ--yVuj@V@Omx=sUHUhNjfU3*@n8PFVH07tB5_{K7}? zqJLXc7(}hgnq#gxd(V`R_3Rv{cA^^VGCkERDlayhryb^UAua((GK9*`a_SuL{y|@K z1QmsX@Ux$(F|$YEN@F3R-Hl|&M2`^>MVX`R^&{LpK(fR8@4*J^CkT%Hz3YFPuS>ll zcps>8dKy_{;0*n#Mb52VI`hlF9RP9#83bA5@dY zEb|Elc2*OhUnnaf6yRs=EXoK`3!i9oUBej97k(RWJm_MnC_t;jEW93U6%Wji(YYD2 zvQJ&r&y*hQ2(j_>Rn7 z?IANWODlXrer;5)(1CU1+O|HgG*8xes;Y`nV#~r8wy{4XA~A}X#b*JE@c`~)%ey}HcOpl#T zAr|7H-jGB!wq?M{h3aOq5`5UzqAh&<1=US<8RNGxiV{`c$$`F&?{(b)QWEG%mUiba zeu*6gaCYSC{fd7t#y_G2O}Ww+v$%&%bm3SwSH=YY?;j{AyQ2y{ zGn$iBKmbpttR?cDy{K#HgO<-<5QcW=k!D~x<%23Z;09^kxAiY#@GX!O3!$!0NVKg) zsbQ%y2iB-wIj(s0wMJDBtlTS{hHnj~BozJW>z z_MjEpHX?7S=YwT@yf~FIzA4GIi!+5rkxGkY)P|?>=3{iC@mA6u${?nSm2WQrst_}` z%!Okcfxk=Y=UVtud~{&kZviyt=)_aD9x;)OynmH)^TSf@`XC)Af*kccjhx$GR$7Gv z03=nMP7O&B$xEZXXLqb8l?KYWXSlFmv&iOLxQrBnf+HYlI2Nz3##_y~2G&(A1HRoTIq_=b&t8 z;Af01!J_jPtgW{K4Zu@DhZf@oZ4>pKuU-hYpw2min4MzEBUfDq;=FS;wD|v0LXnOK||zP&m9cV^p=|P!LORXpUvUs zNE^HK!nBK=AsBySjfskaC-dldtF`*>#Kb$Uc_|H6ON)U;)OB?nAk5;3JdWVWJi_9h zqBu=Pc^|Dqq7*%I=GQcpagB&6v#2@+Q1kBjb6aSyF`kn^>vGe3f z??en}uW_`vfkcjF2|=s8PQuPVOaoPZ)?ThhdXHb((d8f(Vp4y|HDghR4~3qT;i#3U zoCPe=npsRa^T*WNWBr6CnM!f&9TsvdE`(ETI&o6Qq~913%TauBt>OSM2mt&+?Sw2t zmM6*ca4E+I%%)R8OYS1Zi1=4q( zF$k3NN|U^aLKPWUW>lxpU@V$sytPIu79-=X@LnwBK=!I7Q_QI6m7eklSw2?XZR>BX zsU*_MazZgLem>5SG1o$2U^l03#|&z@L7Uqag&roz#d+Hw43PyxNLRHyK!eOWAajq^ zb&BI0{C4{+e{n9P%@p1PI0VneE(9DLJg&Z&wzf79uMZ%B0%8fm)oU*H6CzY_O^XNf zo*k^N9;&FMA<6MR=oeMEf(`ce36R>BsuhKYS75`#GHGLDS45??sfMPqul2L@NsY^x z_GgL7@=R*xE%PKhvFhUbg(aEAveGlo2~pq`Ep^|>;lMw+L5p_mgZT{Qp6uNlB$(g? z;R};TTc4(kJpQ#OtsIq$6?yOK`Kjuag`hD$JaJiIS>5+B$!YI-Cg&yPFp#~j!f7F+ z)j(%HJ{hho>1ah;|8Ac9m^<)QoCK`W(MAF{5AW_wMUtoc$t+MAI;0Cgm;cAGT1-luC_fXyYb*_&eLgjf`L;3Z)434Pq^Ib zeVZn=W0Y_3VX7bVzh%-nU?>hKYv=aghwslgWZpUGyVI0M#p3~^`S)4^=~IEg6CJ(5 zU*M-nxXI3Rr*^RB$_3>1m z;y6LsB*)Ex$uY|1~)hJ>M7F0oN|O-k7~2Uv8gB^=NpRU3<-Mk z@X)L+03IqR-O)03Chj zZ(H(*2*JpK`;C|eCH#+60W*UY1vV@-lMZ~=zh&+Uq7N3x0r=vW{1(Ftvj&$wK?NYK zJ`w38e-TJ56k%^pLFBVXl20L$bZLEY7A#Lo!P%@rT)U9DR*FpQhzVIis2p7 z(xJjLnVVV}?Lt)#Hr%zjKc|6OV9I)y?+m(A!pmBCdr6F*GP;&B>&TJ0%fh<*mu=Ky z0~;0aJ-|*+Hfn&6Fh=>37fp-9TjXL}N}~l?I-hwIn)T@^mc;Na8OYy3K+%rzEfV7SK6Ph#+QJGWk5#s>w`z?tX9|~}O{x6sR zwF()06#+juXsC?4ZzQJX2Y9^(M@CFdoDSJ1r#L{dy3o)suoEY}#B;`?tE$$rRpiPQ z!7GwbA(am=n_}d$RNThnSme(HuFk7A+dt(R_gz^3uJEUn7h^p{{oKL$3T>6SM}g!F zj*a+KXTA?7%%OHSTpW}|st>)d;^ak*yAIQj^n8x|q0g(r^_HYdZsU0CP5#!mFOnx} zznZ1z%5Je=YusM2_qcX2^kZRPwZ9L?eBP@1m-)CPi)DvHNMvc(bZxaL{SVK{f=cZ~ z5UWZuKF~R?S7^EW(SAvOd`bK}9|IC5q0`60xHs>l7}m&sK7*PJF?Wuza;oDcF>0Xn z#h|V0$e{cG6T(j{jQmkVK)_vzWodAnSy*T#;}%2;-l|@_*?BgC4W&n^aS)YZp%$|(W?xfD*yaS4p+3;6Uw zX40ZgjADK=f;p40jJBJifo%&(!PK24@-epDVkfL7p8`_>4Lg?Kg475)f)|lc5E8vI z^tFj~aX>sJ8vKBGLh7q6r>qCLXb<`_l77we^29r?E#_(%9B4LEE|z^PrZZE$HMKv? zu+)U|bm@kYn9EfHMm6!Mni|7A-SDT)I_wJJg7@LK`s3Ka{|aNE1<8<3g11gal928alEBDT`V*hijVHCKJVkaoBih=_TEK#UQ{p1&x(cVlb;*iLt zWkW$^DgYyK_K4MJankfjiX1%-t*FluX;UROw#`EnzG=M%k!sEP@{emD8yRZ)`*k`r zEgS5`uqx%rU^w-@G|?R28`DFsUKHTR`X~*2YQ2XfAWz8P1Du^_Pxja0!Lw504nw;5 z{qu8MD^DJ$Bk;I;WqS=q)^JjDM1dapl`3*ud{t3nl46+EqFZ}ME2MSj^u}8)wWoqs z*_LXwdW;my5Geh}{yHo13>k!>U=3<>YFf-BI+*fJIp%Z?s45jW%J`#2w~+p;^aRa- zvh;nC{Nh4Q{ke)@?vhM?$w%u}IuyZ2#E`t7RV<&M-PN4lFDX09v2=Z6|B~hW*I~<4 zujKaJevTgBWYS}MS{Nzg_pzybV0PglEz;wSaLrWg;r86J<9?(Ehu6`h{c|fVd6(vy zf(n z&V`l(RRN}PIqo~tqQo(hybKmpq&Z5p)m%=#w@vMOY?*dtsoDY|cZ=1i$Y1$iVGP`A zn!);;`d(xOa-u6HhV&Pk0Kc*?=AkXuU%V8MfRzE88XK;N@L#D#K$*J(jMTZi_UE#m zi8t&n?$;#f`7_Bq5t%GCOBy;}G@y0`rEHm9Ki?-h3|JMv$MEnTL&$2ezz;yKzhLA%R(G#0o~7w@idbj0HbjS?bL{-4`Th0blfN(-sSYm5Tyd zQt3%?n#wpg5qhFKbYf?=PjC-4Q)#6=)Wb22{a)O1L+QE%2&p;6Lf1ll(+Alty4@_T zWh0hO$*^R#^42UK=x%!&S}T&@WNMM3A|8K1Y=TCh6cv%F`46lL1!T8qxJ_ZD9AC%4O*Sz!+!V7H@`JGN3WN*B^ zwAQaAauSlgJRALjr--=Kg3W{x4M&&CN_t*FST^|YIIve~SD8Id5xSF)otF)q+;sK< zcDZIu_51Xt*-q=_F@vdNs9Mu_>8wD^_K>_{A&zpo0T#UuOz=vOC}$cKB6+VaWOvP~ z<7d^nR2u)exTN}^P>qkdepyqzmz&MUU@`b*iS9~ZC}tIIU@=nk^rE6Q<&?ugP}dK(xY_($zX@W4FdPqo zg5u(ThCrdxL;D1<3)SYrDZ9;IbOFjEfs@U!x;UzTuEGOXLDO#bUI;T5FFfFU_jB`SX6(Z0@t}OG9 zAy|S4yQ;qDWvPQ(0&BgoPn6<8^EHiE3-3A|9_TJC)aEe{QGz<=S5ze?3BtxTZm&TG zwJ-9YS-@Nvs^0JcpLV6B**jrF-10)LJf{F}yHK{61hu?*cXhBVJPyfhUBFQ~bXvUg zL#ecX=Y&qILx$}R>VA8eS7EJ5zntr*d~Vi!1Ig!BHujurF`MzLH|O~*`cKFzx6t<| z52zz?@4~Fw#1B-R*il^STc}RQz z*_JV;7u^3reh}mVEnu`d*OeSyjiP~IA-WJ#WarXTTRIl1W zr97{B^VPKRDSd9hce2JG%@1QTt!}s*=*^Z+zN^}oukkZqkIhi~#UC-gll@}Ky4D-2 zp0JXOnpf7)E*>_@!=R>mP}w0f0yP-$C#svGQ+7Bx*_H%!TCj+ZufHn7?YTmf;Jj`@*!b!zw@^I#-J*dA;4CP6 zpfSFZ8+!PzOK-UcJMWdetKSmYfEEI>{3}DD&VBj=ufY@6IYDwR*h4w=+tRi#hm^}R zb5faR{GKr_2iHj7G`<_!5q6u1{=rI=wr%Xe{M=3k)wE=`-bNMK?RPbyOu$4&9>q>P zrmz>EFSsLMo^@^bv32+`)zkf^d8$X$5g}H*#3oXG*2DW9+-j4owNRr-9W3!uELA)G}9dFN>( zsUEU}3w!tl8=UfQT%Q0S`4nL5m=97UJ1;vvJT=L4yZc z1SpM5z+{FH4n|b<>TYZLN*gAdyvYV9vLYKa#kj?LsMru$WGbvr=`G{db+UDbfMEN5 z51A)?q<}Y(@^!e=7mLazXS5PC#hic}Ixt_W0^Tt{;fkEJD#f9Zi}wPB8&gGYLuMY%4rNX}XSO+N8kxG!f%+Us(Gu280|d5g6*Pg>>f?tjmSIup2yZ7t&rV>fgTQnWcRXk`1Vz zf+GHP&Dm2^?IAO(5#u#_XO}8KAu+q29wPasCB7#3iVW!&Z&pTAnwQNnlyMi0=1HDS zKmd^;4w7tohR6*@99>Fs`kcEIolt1V;&mLhr2z1jp&ws?jI9bL%prf_z2fXy&WmeF zRj%3)^-TXe_aeqlpj5Jq56i`IDY8?NU4^IsOMlUb@Q=7_Pma|jP zTXNULTLu?w@<&9arJpRH+~|kw-%Gp64(6x7s!Y2qc_6}NZW`Yvhr?Ry!TJ^EbW}x3 z^YWv2qe@>Z6=#LjGd>4Z>#skcgR)Z$Rjg%BTLOWLEd8J=gH~AJVQ(V+dCj8ToLN4g z6Y4J+fMv!*j6*eXrKvLrI)Wn6 zpBEUwimgb=^Bhr@hoWgTlah4~1V+&!=&P#tmy3n{w~l9DIwXf+wNkDwLkXg^9oHZJm3a`ZN%xs!)zj2YDrD zOCU_n%xRuW@QNItk=EaYDIWgO*;8$5fB9%BdGBawmZ=On5GDY}TKf6<^Qm*b!6xIG zFqICad7NJ)xR1!h%jY>C5f8XPLwE&&d#551zk0aPrSxe1V_8~3pXGdn`q6bX#SjU0 zE8ZnltMectND{WoNAPZZ%u+C{Osfkwowd&ZhXOGkQ^LD0)H~Hs=LrBDla(>!c1lzx^a_#gHD^PpgKOGfB;pG#GMzU`Z z`<274Tnmklt*LR3u`f(Vog*>#3t1*l|7G$t8O!&bGU=~$G=9cI(Su3`jkjL=Y*m$+ zT2+PHWIyKiKPQT+G+E^s3|!+RH59f8kPJYBmM*FB0%gLw*1@c++9u#iopW^cZGnZc zV}U+nqtprOi88Fk$nW8W@jLBB^$2}1T zoXL@|A3iHjz@?gr&Cv2xJTa7hEGx;5X?Arf9L>pNO?hgc#Eo823=yNJ zX$kiB+L1bCJ@xt3@=NPLwNsVmNCj(db#7x(Wkdv^9^!r;qTZ3p+)iE$O=)b1ZA zR!n*zpc!|BpWvvz#s|C0fX`HO&qJl4?AdoFn)#8mNAr0outEe9zq9=+YnD?;3xgF7 zXyxtF+uLVxARmNNE3||YKvmQT8{M!-qV!dM)M`>6r8j$Fck9C1p@^mO#g!|Mua1%x>TOC_jzGT^ zLxJFI_5{Ca$;1a?ig1^t=$S_RZlKCsD?Z<@%>1ql7lMWIT(CB~UAIoYci4~;<*o1g z6pk}JN$vwG{L7;YGjYL2UpA4J1NQAooTjix%O*(J}ih?0y$I%aooK=K@p z`p_4sh-11ZEe&~EpRr8U2mU-$)(Uu#n53zd`m8)=X5zK06#?0FtmwEDvSQ5cs*c}7 zZYjS8Q7o&)j=Rm$ipMp4(ML!qWl1~BRRDX2%By3a*>re2c*=5Zpt1c{(LCxu{tf`0 z2`a#$mfvKW?BY3#WwY06LUBzW^pc+M2|#0bXmjLPa9A{M5+%*#F&B7%L9>n3C8Rw!h_O@IgLW2`TAi z;9rbWR5Sevuy|FVSn-r#2pi^eh+&gJiQha0Dth%U5>ga!k6V0mxDei}0nF0U|u zc#srxVI6Bwzo;!l9%($YUo)mkMv%t1PhYa6XwxGF%&Kq4(?QN~1sVzqsK;WeK7~+) zpCS-r6@Hk5Y#8s}YYkBQNY56Z*ADhOe`QeF1ws^ehu8FOsDVJpD;ky%zI)!CS>_GNs_cUNGFC1G(gDy=1obgbG&sCU0-b`k_3$0I zY0e^bK~s=RnzA1%SCJln>=uE$JVt2F`gGH>f3GLWX+vfO=QilUFVf`&VKJ_dw zI+mq1*1t1+OYt1R$Pnxe_ic!M(wQ@)ch5FTUl$U z@CZuKK+FU=sI|U5x+NYc8P$eXJ4b=_Sm$0W|J+}``wGkj4r$yt5pnyAh@^{=cbkF9 z5)-WM`#%8oJ`k4{bR%yoiah84Eo@DoJa2H8TZh~GUTR31s5ad9hr{Nzrw>8-`whrE zIJaPngO2uc>3ro|zvVj$20V8{@&Uwi=P0!q#g_o^?1g!`gV~3P=XCcqp!I>6h-e+m zC`Wr9%zgP-l`9}JLR*B&TsRp~ae`bMR2EiN@F|>NaE5iEEKMY6Qu+c05+#_pgN#In zPMuQ`4(P$?Vo;7MA?CE!skD`I>w2s{HkO5+EkB*=&Pm%42ukJ8hMHR^t3R=b%lu0H z)jE7v_qA5FlV(_$u-l22=Q~es?F7cqTpb1z>Gjl_RYM^t61|8$5-y5T8O>ya8h8hD zO@33?BYzuj%zl;=R-t%C!#Ikdt?_T4(`t$k%Rir<3@E;ed<~6WpH-K%ik2$~jURt& z2c<9W63fPo;|xH8Hv|N+jvZ4LeN`ldsuZ)1svmea7Lun!#&Bd*s*+E(pS?=VwA$0D zr>HTX-BQmUCu>09k!Wr1eBu|Uy*;1TQfE_N4C!JnxHog6^(=mTnEqIT8X=r$MXf|* z`{zofBiSVNf!~omnwgv`WEf4OyF}H1duk!k_t=wRfIT6$IA626fzp8?Remqw!BZZb z%GS~S1`|#5E-7PcMybifjg$H3Y5mkRNGpWhwNJuCd**rk=jgH{Opc;7vl4rvKN?|w zkV_>6+X6VUi(Jpk`M19TZ)dj*naNs6P_5HK#q5sMT8I98ov)Uk#~$l>w4 zgBWJ~g*NJxNu|u0&&aik!$<2+q-iv>xvAV=wFWrkZrr*jh|ojsn4v5-Qw&fIc~=49 z6E0~{P_ASvF`e2MjTQvl7&@N&Ok1s1)!&ZFzF`cyEDnl^st%Xv3mAWV^$jyQLh6GN zJ^d5~+J?hEepyi|RP|j5zD=qaCdZ52ZF<8x2SaRw7t{X*Y>d78hTSUhBCNHl;w*79Jf^?Rcwv4{YI~Xf2vC&@LHlqyfVO-1oob#vW zcG(yKs=SN`tk1caU6}foO335q$UKFppp7!E;~JaSEM6KI?Rc3bSxC@21<@TM@vOBx zlw#@MikiSMKZKF9Dlq=9vSo{7-y)2FWMDDqdaj%!nuJ!6K|at zGz<-7j8lRb5no0%_~fKlYqP!WF*yjXFk7fDw&dRCFTe3DjADgH6fZqn(Eg^s;OKl6R|wxE z$jUCN1b;eOuw1xJ%}>?hzKS(^jc6Gm|e69hMtM{CMGf30nlCxq(LA?JNas`CwjED17<=pmd}(3s%q4wyrVR|1kq15ip&@9gLl+_n+7S zBTU|cL`z;b=$!}5G>V)8cLU|D-pz*c0-BZyo0adSA23$}M55N#2F275z@Etq)Ek9z zxAg>yQUt)j++uFfev*)ou(G@i#>)i3Tq)h@AkN4QS=0CYV&0l)6?! z@NsJ2l}U*|HH3jsIfwc!to(lHZRsYt7IW;}To0alEYM_C)b(_Ez+50-tuQHu{2IZx zvPIvn96Ut+<0bhppk=|K1k^B-Cb7EkUbe&{641fH_Z@4OwxPl1)- zmKI}vkO~{fmQ{W=4|=QI!02Q!4Q2OeqftNEVerY4M2a^@{4zWrjc?T#xB$B2)+HVd zZau%XztzP;=C)eq^=p>w`{xw+1c6W@_GNVaec{3Do68x*8{qWtZoISql*nzGX!oKy ziBYZa2Z6$2oN033%7o{S=Vb2=mkUmh8c)YF#BapKsnT@nKmW3y#o{3u8v>sR377`p zqnp5BOZXfEI^yUoZ7gEhXg~Cu>tMCfm_63*Q@U_)=1YXGKQT8S1=A1bjiR-nd-LDO( z1b%)oa$P?J$;f@;{+D5O>$P1y8`F)A-|E&!KGOIQ=XM~~CWI8;d4`8>o#DHfthVO{ zBHm!diY)1CwW(luGD0gWSgMJ{T$M;;626$b zj_G^q&j-F`VN3CR^lK`(bvrm#%%NZC@cyuzG}cx0Z4C{{%(~fcUTheu@`JlF{Q<*l zp0Zkfhy-5Jwer0VH+tMEth9yLdycsFzdk>1O^?CtZ32u_oy(v%PVX@$5!)he%D!)M zuUJn^=nkq`Mm``@?SRf#QWR2}V|U-MPE~)#OxbUo6(3Jz^Vp%kmIXK%*`9V{)W_>l zFYpWiI2qcf_xfMYIJk9&M!Ly4o4}0RHtmBXlAXdfTT*=dz~M;%x;p~KV}9}=*H1Y}K1UxVDE0gd^ z>729{sOGujij(oRLG(q`PuA5VU#)4HL`AC7l9@uon-;;ZXmW8>ySL%xpqymn<;ZofP?3N3?1s8fMcDMg={xtR6H=jD;#VY%Rc zFxu=7kl=YFaCW*L8Qey<*G4001H)cND!J&sw|iN}=7fN$Zc0a}$AI$N3veZ|J=a1f zsrbewe^5@!5Cn@arSz*5n;le^p9K60Hg9LHS^4E+uy;NdJ$VsinDOmxEopzUm;>lFo#oY<^g9UbO+Ua!)+)A~T1Bxl5N}JrL$-;H&D2O`k3bVdGaWbp9*W*;OIEjF}2N2e5ql7i5kzbRNPZHj>A9%&Vv+^sC z_DlRmetl&6BT-LM$XG71i)fFWz_Ekm0D3cr^+fKdeGsEL;Umuj5)8Rix)C2bHzr|4 zJmQSi3cS`P@Q>DI=yo0GyY%#=Gw<-e3CXy6TUzocowxaq;{@VH+f|H-!=>DEwK2=K zpyBitSZ3$qRyHq!Reg-Ao-}Us>@NMhYJ%H~!if1(ExfC{1bRjKy**(Cr@*)x=uONn z_`aqK3UQqLRf;N22H~4X|<$ zn++MkwKnFx|Bt)3j;g9_`-Nc(3K(>##1`pNx?w9N-5{-$Y>*-FAT788DwSSYPVv}*5E-K4yxC}wqinyB5|BO%5 z6Zn#V*eQ47##CYV;C%`vdSEknWpb-r8!_vKR12u)NtiT9WT|o!I1(drtlWyjHFOKj zNhp4elzL^m@GRb_&7ndH`S1*HIS8VpH5)N?W8mANLlaSz7o{m@FsAauP=gtv?Q34U z_4vZpiGGAp%lU_0SW7ac{+}9Sn1Xy!xOuo{c;qbRM+@R7I)x!k2UBbA#o?|(L1Diz zyFLJg*IsEn`B~kJG>q07mYyu>Qoq&F#xY7ATE`X?#zOYnG*1s)zZF6MfN{3MwO#;k z2~G|ZiD%l@@S^hDHaT^U=F8U4FCI!1u4fi%6|4DY1K8~lUW+lJU9m@BTLS7Dj=s^H z+|Jl3+Wce^5r<#QZqGY1bHKOQGQlC=>vLX?ywTfbu|J(lW#~eMMgiM6X>QaPzPcZ6 z-7dJsX&(w+bp5iRsArJ5y%CdoXbMhijiNiH4oPC3bptA;t%H|q3yZ6sQi{4)bXiat z>EBH**_3m%{04@gV@Is&?zz%Sii3qRBsM0uj@rC)DVfh2)$$6j1Q}Lf&LSn)zx3k@ zKluOnuD0GC=8lZ}4fFI!#xEeEn<-Yx5W(`(znCTKAxg$f(=Q$OB7cZz65*n|~lFt_c;%p%>X!KMjNmuN|)JsOv+m6yKgSA{#%6v^8OL;us#KpJaE+b z4@oKvm>}@|J23;;{)6ieSGf)9GT51!wEyY89d|%raE0kV4p{m6L1`iiD$@U$L%IT@ z27APf|Co6tf%<&jE$01)N)QH?JqRhH&*AC($zc4KAm#zME1tBB)PH)B$Y&r=N2$^Q zYDgjSUjWb~#A6c5T7DBb_qgyTRY%}iZ3&)()wOglw!HYI^94%@_$Wx8w$>e}P{T;& z(<&<~jji9`{&RblAdq;$c4Ejuq`d?mBZ*;n10p1GUv(wH-_0X{BGJ_Pr~xpk1FX*R zAi|sOKfl)kHU*ZM;*4mBKn74Ba+`J#P^ldQWUdbpG)6{7&440P6i_!4tq;oIO5B9t z2SBWo2#8kkfs>ULqvQ@o*ke;iMgel0!o%agJH=lSb=cF{=?c+Hg8&q?L8C<4f9J!~ z4zNg+-2iS5=(qR?c~Q|Ia&HE7Ok%*3J9qw)%I&!x?vIacY{Wp^q#yyX8BJ5gJOMoy zuBQP26$3{H7(SPo21E9tBt1oYT zr^aY-|Ll$it}mMmEH_*37Zvvn0AwJkCx=B=M&R@I0v3n@07J|~fB$XQ^#?Idpa~?& z-@HZygn@v)+~>OW(n#SLXa;bI)Aj{;3=Lin=>$>E&RY{M8iXs|3aZ97BR2O|SzG0m}EF_eg~j27!Cd-h>X} zoNSBy@=?56d%&@7b(g&hV8N{daJVBpCqS4DnwB5rDsB_|vC7fVa91JXVLe{z)?aSBzy3 z-=Ama`UPM}*Vr>jWv5HC{?ZqO3+NGY45W4fe>t62OhaSw7|_2`N-~Gof6jr00z|r; zM!Yw&Gv_N+SE1dFkB_gb6N&?kz|ZyUfrsa|m>vj-#SPVCJc+id=HeOu9?kb7SQjD^ zV80UtwS6xJVXVGCbkS*Hg}20X-Xc;;XHCf*ROzgdyJ1&+t4kW|9SMt zbVAcM{X|t|*eU?Z$k~Jv8+aCs<)IC|Tw4E>j>@D0atrNT{)4`+%3odH-k9tegLXHov{ME95f0;qUKvEnPO z#y~$6H<-;ht3-gr2Kt5%c;+jCa1~LkH`O9})ZJxZCN)UR7lepbATXPL7)Z5ElmXBb z6>fzv3={rwIqb`H<*-lSeHX!IDvn=_pK!H#bxop~QNlXT;oJi+GyVfl@NDei-%Wct4iYQQN=&4!v-m zA&~ci>a{Y;zcN*SuY($tpTR5W_z$N-nmgE){OP84`@dxT@6?VQWcQi#XhB8m&zAoA zR^MeXEs*VgK;8Y99RFRkXTk=8oSk+y`2AlmEl2?NdHKgvwm*jW&mEyU3JEZ;vHxei zU{ebljhM$Cb8fQQL+QA2%I-ISW2!){TJ7>CIlC_1%VywJg;+dZl&DL3|Lse0DlO~| zr~-jCq=2Ox!Dl}aPBrAUb(>y&3d~lU{6b4b91W|;>mG#M& z3*r=<#{PA-U>L9tM44MWTOg?e@pMuH6Dc9_%>57`z!_CN)=AkE+Rha}T7rUjR}>3y zdL}_kr>$-V;3exQnzsk#_vu?#@`U{@EiHfTt~IYU9eB;L8o2?hEm3y&N672DO6e6! znUFNFL|}+1dmL=}EW>;it%7r%>qk3W4O>%U>(H&&$cZQhahVG707X4*KpA0WR6 z^=95&@Ni1KjDtWnQ_jfWz;roFaXqa!0nA5RWH0@TgVKRP@a8&uUT^JIY5OBOTIA2~vu9WFFw3VL|TMD&MZp?0wj6 z+HC|xUM8TO!5i4`rtR!oOLfOaCp$)h6LsM5gLvDiX?QJT^&^wO#2q-b$~g}0x$NVc zkAJQ3Qjl2J0%p^>P=JPgvgUnq0A-+;l)ZK5NUdu@!fdBTqC~lGnX^{}K*Q}g^fT!K zyxQ-d%b~p2jQdJ46sUqC&}_#2ER~$Qf_EgD$7x$o-LxGx`^|vi#Rhd+_rYTH`AD3s zi6wu02%PUWz|0(Q%i}9J9|o|0L0gM?fijH|0ctrf2eitFM3F=3tR*!WG7;4LlXlN2 zDFg+9FVKMuze44{m=2J(4!~LWjb1*!VHsv5qX@JbYkGEN`EGc>9oOy~}3$DG) z(9$+A{{X$ZTJ{*A^4y#g0FNeb7JhhnEbruK=Hv)8!L9;?BHs?e$lSgQFha((gCD?? zSp)Nbb=E%%3PO7U29Jfk^EfgW(3O6E%7a=0sF(>t7kgfEzSmTKh;3j+>S^cD6(7j} zN?_GpAOU>tGnDg0Rq=c@1CyQ-fmf_;Z9jhg1qiy84c4Y4ez9nhmOgQ42(GH)6TPOk z_%12Gf>wt?rb5#IU5-bxvCk4Y-U+zZsq>5Y`SSfBVgC@I9HSlVe-vvFb$j+7`zwt2Y z7__VoNovixMi@E{NY$aOELXe_+r61!v(#OQ_iOFvkh!n;0A_jd5rD}|&QYpq>&a4I z$`6(T5ZxLMs4`=}Yc^MH@5bnm5D!RD$K>mH&nu=yq4`I4%5Tqh5hH8#$=u}Z1Ub-5! zZke&h*-n}1pN5oV#z6C>GuN|ZzDo;Nd3np~JfOQfvZdlJoaUjCDa_C+)}0$25xI}d z*oWhlA+ZYho$f8{LP2l{0_nIEmB3(KJ9mzO=K;?vnR81htCA;$=&MAin>o)Xqve?J zs@`7_K3woV&h3niRvXD8zhzjoI^;U^QbXeILdkU^Wlv2`S#JMcHX~8@!FG+YW+_Ug z5(O}(d}>J}s+GSjZgn`sEPT;T56wxr?dD0b@3g7#!Xd-h9hH~Q3OUPqZAp=VH*p}9 zV-FlfTj>^}lQ!!VtZYg*c}>Rk{iX`bxoF(bga#{f3mr>N3EEEsTw=x0krIv_k`H4$ zzF{mlA~oi!fi*ckShE$ec6&0tRD$BY2?uqXXyF1gEyF;@h+X=6^b6THIn@;MVWGw( zDqejNliY$o?SrxJtd`B{+dEB0Z=!~E)Fd7|jip`2gT{0LUXZVOFnJ*-8j*GzrfZgY zT^kz?(;9QQVer85LY`FwgMh`AT)&%jwGiPR-D09oe8Y0QS`-TKFD!nzuT40$yWIcz zQEIV#+E3E!+~zNAA}a68YPW;RkW3&TYG#(Qc2v_6knqJ&jP1|9=kmQS9$lK3c^pBl z!X%w`{qd9^%Xa4d=#oqu&R46Xmm!Me$_H}Vu&WtPJazDVpAuPJyDU%T3Nl&kD}cc6 znOL1yUcBRIIgTQ~CjhbK<=+A3i2(1WPJQa)ETg=X+B}7?O{NZR0JUQw+kVE47pR6b z`7{pQ>Gk*w4LoinHU2>t(n7l{s1X$7b@O!vSdiP0zWbPXWJgKjcJP!iJ1@S zn5yhS^yqL+}jL~1>9aEYVAxjzKX%9$0}VAJJm#c_&Ikmf(%oTycf!h;`pSWE-uJQb0*p%ZWl{d1CP1GSoyDAU9%X_00>S zD81Z<4R2N7EJI7ASz)0Uw|o(?xJ~9t-OP)uKLKX4L&)-N~O77ZLCG)=AAvLSbna7o__MEK+i@rLB+Hk zy=Ylbhmv0+vm>taVZM}w5t-xw64r&UIjFlh>t8KptWfh}=7cktqU578xN{nY`&mdu zsNDBi@Dk$KyWZ?n%9@5BbT93Ppf&~*?~5K z&e=E_aL&R!Qi>kt7dBJA0A++hbkf{y!wVAoP@G;;J8sBdSki=IEn2zz5*A{!C>t#6 zQW1U6Dk9rNuh+=5NFEU2bDoPX}S3$mieXf@B6)=+!0 zh98d+DgC-?-9b;=!9IN|`EXhrtc5hDcG|8pVmebqLMn4I(_XmJLSB_|uES{1AwN96 zqF(bJA}t9^3{_Z4LrQ}q8R=uQmK`VlDOE>d2;ftww;`o>6dg^5^~&>Q=e*)ZnH9oNh8SBh9F1 zU$h2><@kRn=QVJkLvUV7pvp4pP!Ei&R5%k+l<5Jt8LV3_qx!#+XHzO#tK_=kBb}l< zcg^P&F1``Lu%5E*>C};MwVXxE8d}OO;x*k&O~rdmUhj2A5#kbja78QVdFPz zR@UNy5=udyU;HPL{j90mcHhAn!%wtrGSFHAXpP4;r&&Mu4u{-6!sDURHWBNlwcRgr zd=jW0Z`TB+Z}KQ$dm^M?wp?X0Q*t_<4sQvvuk!7if3~;F&CA?mn3>Sh(oNd5R4VBl z<{^+G)8}U>%-Sz_9WWo!u{$)W*=s%U0$=gQ(l92UQzJ)M%DqmR5tG~BLXuz~8lz?k zbp|)t4U{#hV;KmqE02tHvG%Tb)?&jL(AfEPBAV5LoKe*`+trBBA3Dy(%3)@!UV;S> zKA=~9IGLv@2CEav<8;`ic&+(ru98A#?U8DQ;Ui7;?pGrDyHktvS}}Z1?Rm(sI=nhP zFN-R_mSx@P{0S%a#s04Qy&Wn}0lM3z!8MPT(kz1dzENrRuzdH@Tv^RhF>oSb==Y;y zCmei+6E{Gq%g!=D+BfCY)`+X^Bk^>KRVZ`4p+&Tgz*080HbqvpjePQImW^KBAZxMC zb(VQUm$*!vSiKLaDsGAk8-~oin*?+90le%(ib=0STO@44`O}{|jgiHa-u5S26>X?~ z&0oAA;x3ZGXz*q{X-)ZJrr4%B>8&CC8`wr90@r?BxUAYR^w-UaF>uX zj%T3rP~vVIPcl!ibj;&QgU}Q+S-m;*<9mj$a!xEZ!|_{qzpi4Lun}%&aQ+cAEkHWwo=u-@2-y;QlQH6dCO1| zd0`@sgJTMqE?hww=XE90gP!wU8lscMHgg;+ernP=manC1XZ=2Xq#Tu)U(=M6yeRp2 znWg=NLBwJId!8}DtL&7VY9^7aLO%{$UA(Lx+7;x_Nru=P8R8bn#-`e}$+ZK}I|PWe zS5e2PmuaE#6(jF4ne*A3ww>P=Nt23nbuo`>^P=dx8u34NCEOU)kue~bTQS%C@I5O= z^V89|>-u<6V|++Ki8CN0GCeKf$iUZTq4j%}E$AeV}3W{0|lY z&-Hu6ilmbLA9z;bsaHakkh*YI_zi^5ibZ+n+cE5WYRPIhrvdATAk8GBnkYW~C8 zlH)z5stn#9_q|M-Adf5Qs~sc#4cEgYNQeBmNY%wH@e|lW?U#u~hVUCQzmn)P&_hX~ z)=-ckz}^!v??84HPzNvB7?s=X^mkANZpxE(+%}9%N^EE5x)rpZ@Nw;qti5(=fjjzJ zQ|7p4kN)D8z}p;CM8b!ALtKws-V3Nt9pvCNkC$*6DCP+YK3y%Mt*)E@$x>`^vaPS) zm}&5IXW;FSgx1>i8xnouTCPO&J2K7opav}s|vY&tL8_ACVP;|;oY^{_VSjq z8TI0cTuv^<2MV4&l`6uXiz!12e*Kz?12&!{`=gd5RB9D%3b;}D=;kZ6is+(6>fY4; z0#(x6l)+DhU zcu!+JW~_gCS0&Ov=gLwvvVmBf;D=zYQv*vHYhl!Ac7B#0ym;7XHIwC*f}-z$YTFt~ z8+S|Z`(zQz>jf<4^J@87WQ_Id$W4tNp)6cs-R11mU|c2SHIXcYdx%rxS zY|GdRt9jkgMKiJU&d9}#?mMM&g8NL1MRHl2jR&*?^ZSjzFL;_JDj+&XO!wvO@%F3t7A&H-c3KRLtUB0 zc+{yunpo<&eI%9=m2+E$+C@knwQHr#uIXSuvRRRRbq;l*ID#a8p|sj^@nNxf)6?tp zmwj!B9?Znsz_Q#0L7KXFFDU-wBDTczPZHt&SOO>#=2-P)DUsPl)qWuxvTjHkb<^5C zVJVto;+c6@&vlploGAZobUfKGCVvmv7=u7@dqrKD&0dO`zs1%@QCPF&{8sN<2G?N!zCC;11wtmy$7 z<8?h#!x9^C>yn%=cjJd5H48IK#}n_zDDvpFlMvYb_)?gkG{1xB(zq`KnZdv7S@eX-bjmkfQzG4SB~$07d_t)|EyjuJ zwtXXuk;!UjoG+Y@>5}c|^Ik={_g;|<6@wjog++vum<}@ zd-j;(VrO;=N!@V@^MgrbwVe!Z<9XGIV}xLj>@e+~uaI)b0k1<~$R#PzOf+gKd#J3r3AoS_yBTeEYy$l-6kA$j*bm z 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 D07(<# literal 0 HcmV?d00001 diff --git a/ml-snippets.md b/ml-snippets.md new file mode 100644 index 0000000..340dcd2 --- /dev/null +++ b/ml-snippets.md @@ -0,0 +1,317 @@ +- [Features](#features) + - [Features analysis](#features-analysis) + - [Target to classes](#target-to-classes) + - [Features importance](#features-importance) + - [Features selection](#features-selection) +- [Prediction](#prediction) + - [evaluation](#evaluation) + - [calculated returns based on various probability prediction thresholda](#calculated-returns-based-on-various-probability-prediction-thresholda) + - [cumulative returns bases od prob predictions](#cumulative-returns-bases-od-prob-predictions) + - [charts](#charts) + + + + + +# Features + +## Features analysis + +```python +# Calculate different percentiles +percentiles = [1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99] +print("\nPercentiles:") +for p in percentiles: + print(f"{p}th percentile: {df['target'].quantile(p/100):.6f}") + +# Plot distribution +plt.figure(figsize=(15, 10)) + +# Plot 1: Overall distribution +plt.subplot(2, 2, 1) +sns.histplot(df['target'], bins=100) +plt.title('Distribution of Returns') +plt.axvline(x=0, color='r', linestyle='--', alpha=0.5) + +# Plot 2: Distribution with potential thresholds +plt.subplot(2, 2, 2) +sns.histplot(df['target'], bins=100) +plt.title('Distribution with Potential Thresholds') + +# Add lines for different standard deviations +std = df['target'].std() +mean = df['target'].mean() +for i in [0.5, 1.0, 1.5]: + plt.axvline(x=mean + i*std, color='g', linestyle='--', alpha=0.3, label=f'+{i} std') + plt.axvline(x=mean - i*std, color='r', linestyle='--', alpha=0.3, label=f'-{i} std') +plt.legend() + +# Let's try different threshold approaches +# Approach 1: Standard deviation based +std_multiplier = 0.2 +std_threshold = std_multiplier * std +labels_std = np.where(df['target'] > std_threshold, 1, + np.where(df['target'] < -std_threshold, -1, 0)) + +# Approach 2: Percentile based +percentile_threshold = 0.2 # top/bottom 20% +top_threshold = df['target'].quantile(1 - percentile_threshold) +bottom_threshold = df['target'].quantile(percentile_threshold) +labels_percentile = np.where(df['target'] > top_threshold, 1, + np.where(df['target'] < bottom_threshold, -1, 0)) + +# Plot 3: Distribution of STD-based classes +plt.subplot(2, 2, 3) +sns.histplot(data=pd.DataFrame({'return': df['target'], 'class': labels_std}), + x='return', hue='class', bins=100) +plt.title(f'Classes Based on {std_multiplier} Standard Deviation') +plt.axvline(x=std_threshold, color='g', linestyle='--', alpha=0.5) +plt.axvline(x=-std_threshold, color='r', linestyle='--', alpha=0.5) + +# Plot 4: Distribution of Percentile-based classes +plt.subplot(2, 2, 4) +sns.histplot(data=pd.DataFrame({'return': df['target'], 'class': labels_percentile}), + x='return', hue='class', bins=100) +plt.title(f'Classes Based on {percentile_threshold*100}th Percentiles') +plt.axvline(x=top_threshold, color='g', linestyle='--', alpha=0.5) +plt.axvline(x=bottom_threshold, color='r', linestyle='--', alpha=0.5) + +plt.tight_layout() +plt.show() + +# Print class distributions +print("\nClass Distribution (STD-based):") +print(pd.Series(labels_std).value_counts(normalize=True)) + +print("\nClass Distribution (Percentile-based):") +print(pd.Series(labels_percentile).value_counts(normalize=True)) + +# Calculate mean return for each class +print("\nMean Return by Class (STD-based):") +std_df = pd.DataFrame({'return': df['target'], 'class': labels_std}) +print(std_df.groupby('class')['return'].mean()) + +print("\nMean Return by Class (Percentile-based):") +perc_df = pd.DataFrame({'return': df['target'], 'class': labels_percentile}) +print(perc_df.groupby('class')['return'].mean()) +``` +Target distributions + +### Target to classes + +Based on std dev + +```python +# Read and prepare the data +df = pd.read_csv('model_data.csv') +df = df.drop('ts_event', axis=1) + +# Separate features and target +X = df.drop('target', axis=1) +y = df['target'] + +# Split the data first so we only use train data statistics for thresholds +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# Calculate threshold based on training data only +train_std = y_train.std() +threshold = 0.2 * train_std + +# Transform targets into classes (update this function) instead of -1,0,1 do 0,1,2 +def create_labels(y, threshold): + return np.where(y > threshold, 2, + np.where(y < -threshold, 0, 1)) + +y_train_classes = create_labels(y_train, threshold) +y_test_classes = create_labels(y_test, threshold) + +# Print class distribution +print("Training Class Distribution:") +print(pd.Series(y_train_classes).value_counts(normalize=True)) +print("\nTest Class Distribution:") +print(pd.Series(y_test_classes).value_counts(normalize=True)) +``` + +based on percentile/threshold + +## Features importance + +```python +#XGB top 20 feature importance +feature_importance = pd.DataFrame({ + 'feature': X.columns, + 'importance': xgb_model.feature_importances_ +}) +feature_importance = feature_importance.sort_values('importance', ascending=False).head(20) + +plt.figure(figsize=(12, 6)) +sns.barplot(x='importance', y='feature', data=feature_importance) +plt.title('Top 20 Most Important Features') +plt.xlabel('Feature Importance') +plt.tight_layout() +plt.show() + +``` + +## Features selection + +# Prediction + +## evaluation + +```python +# Calculate directional accuracy +directional_accuracy = (np.sign(y_pred) == np.sign(y_test)).mean() +print(f"Directional Accuracy: {directional_accuracy:.4f}") + +#confusion matrix +from sklearn.metrics import confusion_matrix +# Plot confusion matrix +plt.figure(figsize=(10, 8)) +cm = confusion_matrix(y_test_classes, y_pred) +sns.heatmap(cm, annot=True, fmt='d', cmap='Blues') +plt.title('Confusion Matrix') +plt.ylabel('True Label') +plt.xlabel('Predicted Label') +plt.show() +``` +### calculated returns based on various probability prediction thresholda + +```python +# .predict_proba() gives the probabilities for each class +print("Predicted probabilities:", model.predict_proba(X_test)) +# Output example: +# [ +# [0.35, 0.65], # 35% not spam, 65% spam +# [0.70, 0.30], # 70% not spam, 30% spam +# [0.45, 0.55], # 45% not spam, 55% spam +# ] +``` + +Chart probabilities + +```python +# Predict probabilities for each class +probabilities = model.predict_proba(X_test) # Shape: (n_samples, n_classes) +results_df = pd.DataFrame({ + 'Date': dates_test, + 'Short Probability': probabilities[:, 0], # Probability of class 0 (short) + 'Neutral Probability': probabilities[:, 1], # Probability of class 1 (neutral) + 'Long Probability': probabilities[:, 2] # Probability of class 2 (long) +}).sort_values(by='Date') # Sort by date for time series plotting + +fig = go.Figure() + +# Add lines for each class probability +fig.add_trace(go.Scatter( + x=results_df['Date'], y=results_df['Short Probability'], + mode='lines', name='Short (Class 0)', line=dict(color='red') +)) + +fig.add_trace(go.Scatter( + x=results_df['Date'], y=results_df['Neutral Probability'], + mode='lines', name='Neutral (Class 1)', line=dict(color='orange') +)) + +fig.add_trace(go.Scatter( + x=results_df['Date'], y=results_df['Long Probability'], + mode='lines', name='Long (Class 2)', line=dict(color='green') +)) + +# Add title and labels +fig.update_layout( + title="Time Series of Predicted Class Probabilities", + xaxis_title="Date", + yaxis_title="Probability", + legend_title="Class" +) + +fig.show() + +``` + +### cumulative returns bases od prob predictions +```python +# Calculate returns based on probablity predictions +def calculate_returns(predictions, actual_returns, confidence_threshold=0.0): + pred_probs = final_model.predict_proba(X_test_selected) + max_probs = np.max(pred_probs, axis=1) + + # Only take positions when confidence exceeds threshold + positions = np.zeros_like(predictions, dtype=float) + confident_mask = max_probs > confidence_threshold + + # Convert predictions 0->-1, 2->1 for returns calculation + adj_predictions = np.where(predictions == 2, 1, np.where(predictions == 0, -1, 0)) + positions[confident_mask] = adj_predictions[confident_mask] + + returns = positions * actual_returns + return returns, np.mean(confident_mask) + +# Test different confidence thresholds +confidence_thresholds = [0.4, 0.5, 0.6, 0.7, 0.8] +results = [] + +for conf_threshold in confidence_thresholds: + returns, coverage = calculate_returns(y_pred, y_test.values, conf_threshold) + + # Calculate metrics + sharpe = np.sqrt(252) * returns.mean() / returns.std() + accuracy = accuracy_score(y_test_classes[returns != 0], + y_pred[returns != 0]) + + results.append({ + 'confidence_threshold': conf_threshold, + 'sharpe': sharpe, + 'accuracy': accuracy, + 'coverage': coverage + }) + +##Plot difference confidence threshodls +# Plot cumulative returns +plt.figure(figsize=(12, 6)) +for th in confidence_thresholds: + returns, _ = calculate_returns(y_pred, y_test.values, th) # Using 0.6 confidence threshold + cumulative_returns = (1 + returns).cumprod() + plt.plot(cumulative_returns) +plt.title('Cumulative Returns (0.6 confidence threshold)') +plt.xlabel('Trade Number') +plt.ylabel('Cumulative Return') +plt.grid(True) +plt.show() + + +results_df = pd.DataFrame(results) +print("\nPerformance at different confidence thresholds:") +print(results_df) + +# Plot feature importance +importance_df = pd.DataFrame({ + 'feature': selected_features, + 'importance': final_model.feature_importances_ +}) +importance_df = importance_df.sort_values('importance', ascending=False) + +plt.figure(figsize=(12, 6)) +sns.barplot(x='importance', y='feature', data=importance_df) +plt.title('Feature Importance') +plt.xlabel('Importance') +plt.tight_layout() +plt.show() + +``` + + +## charts + +```python +# Actual vs predicted values +plt.figure(figsize=(10, 6)) +plt.scatter(y_test, y_pred, alpha=0.5) +plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2) +plt.xlabel('Actual Returns') +plt.ylabel('Predicted Returns') +plt.title('Actual vs Predicted Returns') +plt.tight_layout() +plt.show() +``` \ No newline at end of file diff --git a/vbt-snippets.md b/vbt-snippets.md index 916f446..49812a5 100644 --- a/vbt-snippets.md +++ b/vbt-snippets.md @@ -132,7 +132,35 @@ basic_data = vbt.Data.from_data(vbt.symbol_dict({"BAC": ohlcv_df}), tz_convert=z basic_data.wrapper.index.normalize().nunique() #numdays #Fetching Trades and Aggregating custom OHLCV -TBD +from ttools import load_data +#This is how to call LOAD function +symbol = ["SPY", "BAC"] +#datetime in zoneNY +day_start = datetime(2024, 1, 15, 9, 30, 0) +day_stop = datetime(2024, 10, 20, 16, 0, 0) +day_start = zoneNY.localize(day_start) +day_stop = zoneNY.localize(day_stop) + +#requested AGG +resolution = 1 #12s bars +agg_type = AggType.OHLCV #other types AggType.OHLCV_VOL, AggType.OHLCV_DOL, AggType.OHLCV_RENKO +exclude_conditions = ['C','O','4','B','7','V','P','W','U','Z','F','9','M','6'] #None to defaults +minsize = 100 #min trade size to include +main_session_only = False +force_remote = False + +data = load_data(symbol = symbol, + agg_type = agg_type, + resolution = resolution, + start_date = day_start, + end_date = day_stop, + #exclude_conditions = None, + minsize = minsize, + main_session_only = main_session_only, + force_remote = force_remote, + return_vbt = True, #returns vbt object + verbose = True + ) ``` ## REINDEX to main session @@ -266,7 +294,8 @@ _feature_config: tp.ClassVar[Config] = HybridConfig( basic_data._feature_config = _feature_config ``` -ddd + +```python #1s to 1T t1data = basic_data[['open', 'high', 'low', 'close', 'volume','vwap','buyvolume','trades','sellvolume']].resample("1T") t1data = t1data.transform(lambda df: df.between_time('09:30', '16:00').dropna()) @@ -275,6 +304,7 @@ t1data = t1data.transform(lambda df: df.between_time('09:30', '16:00').dropna()) resampler_s = vbt.Resampler(target_data.index, source_data.index, source_freq="1T", target_freq="1s") basic_data.resample(resampler_s) +``` # REALIGN @@ -1383,6 +1413,8 @@ pf_stats.sort_values(by='Sharpe Ratio', ascending=False).iloc[::-1].vbt.heatmap( # UTILS ```python +#use plotly resampler +vbt.settings.plotting["use_resampler"] = True #RELOAD module in ipynb %load_ext autoreload