Tato zpráva představuje nový přístup k obchodování s kryptoměnami pomocí agenta Deep Reinforcement Learning (DRL) založeného na Transformeru. Systém využívá moderní architektury inspirované NLP (Transformers), Double DQN (DDQN), Noisy Networks a Low-Rank Adaptation (LoRA) pro trénink v testovacím čase (TTT). Kombinací těchto komponent agent prokazuje zlepšenou adaptabilitu, stabilní tvorbu politiky a výrazně zvýšenou ziskovost na historických datech BTC/USDT. I když jsou tyto výsledky předběžné, tyto výsledky naznačují, že metodu lze rozšířit na složitější datové sady (např. na úrovni knihy objednávek) a více tříd aktiv, což poskytuje škálovatelný základ pro obchodní strategie na institucionální úrovni. Poznámka redakce: Tento článek má pouze informativní charakter a nepředstavuje investiční poradenství. Kryptoměny jsou spekulativní, složité a zahrnují vysoká rizika. To může znamenat vysokou volatilitu cen a potenciální ztrátu vaší počáteční investice. Před jakýmkoli investičním rozhodnutím byste měli zvážit svou finanční situaci, investiční účely a poradit se s finančním poradcem. Redakční tým HackerNoon pouze ověřil gramatickou správnost příběhu a neschvaluje ani nezaručuje přesnost, spolehlivost nebo úplnost informací uvedených v tomto článku. #DYOR Proč Transformers, proč DRL a proč by vás to mělo zajímat Narodili se ve světě NLP a vynikají v dešifrování sekvencí. Trhy jsou jednoduše hádanky časové řady. Transformers je čtou jako příběhy, předvídají zvraty v zápletce (pohyby cen) mnohem dříve, než vaše průměrné množství mrkne. Transformers: Už žádné jednostranné odhady Q-hodnoty. DDQN omezuje tato notoricky známá nadhodnocování a dodává vaší obchodní politice důvěryhodnost, kterou potřebuje ke zvládnutí záludných pastí na býky a nájezdů medvědů. Double DQN (DDQN): podporují průzkum přidáváním parametrizovaného šumu přímo k vahám sítě. Noisy Nets umožňuje trénink na zkoušku (TTT) s minimální režií, což modelu umožňuje rychle se přizpůsobit novým podmínkám na trhu bez úplného cyklu přeškolování. LoRA Trhy se posouvají, vyvíjejí, překvapují. TTT umožňuje, aby se tento model rychle přizpůsoboval a přizpůsoboval strategie uprostřed letu, jako by dnes četl zítřejší titulky. Test-Time Training (TTT): Kód je zapnutý Naklonujte to, spusťte to, pitvejte to. Mohlo by se ti to líbit. https://github.com/pmatheus/themoneyhack V tomto rámci vytváří systém, kde učící se agent interaguje se simulovaným obchodním prostředím, řízeným moderní architekturou založenou na Transformeru. Ve svém jádru se systém snaží v průběhu času zlepšovat obchodní rozhodnutí, zdokonalovat svou strategii prostřednictvím posilování učení a rychlého přizpůsobování se novým tržním podmínkám. Nejprve zvažte . Transformers tradičně způsobili revoluci v oblastech, jako je zpracování přirozeného jazyka, interpretací sekvencí slov nebo tokenů. Zde jsou stejné principy aplikovány na cenová data časových řad. Namísto slov model přijímá historické rysy trhu – ceny, objemy, technické ukazatele – a pokouší se extrahovat smysluplné časové závislosti. Třída , definovaná v kódu, je příkladem tohoto přístupu. Všimněte si, jak konstruktér promítá nezpracované vstupní prvky do reprezentace vyšší dimenze a poté je předává několika vrstvami kodéru Transformer: model Transformer TransformerNetwork class TransformerNetwork(nn.Module): def __init__(self, state_dim, output_dim, lookback, nhead=8, num_layers=4, model_dim=512, lora_r=8, lora_alpha=1.0, lora_active=False, sigma_init=hyperparameters['SIGMA_INIT']): super(TransformerNetwork, self).__init__() self.model_dim = model_dim self.lookback = lookback self.lora_active = lora_active self.input_fc = NoisyLoRALinear(state_dim, self.model_dim, r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) encoder_layer = TransformerEncoderLayerRelative(d_model=model_dim, nhead=nhead, lora_r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) self.transformer = TransformerEncoderRelative(encoder_layer, num_layers=num_layers) self.output_fc = NoisyLoRALinear(self.model_dim, output_dim, r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) self._initialize_weights() def forward(self, x): x = self.input_fc(x) x = x.permute(1, 0, 2) x = self.transformer(x) x = x.mean(dim=0) output = self.output_fc(x) return output Tento úryvek zdůrazňuje tok: nezpracované stavy vstupují přes (lineární vrstva vylepšená o šum a potenciální adaptace nízké úrovně), procházejí naskládanými moduly , které zachycují časové a relativní polohové informace, a nakonec jsou shrnuty do akcí pomocí . Tento návrh umožňuje modelu vážit události v různých okamžicích a identifikovat opakující se vzorce nebo anomálie, které mohou naznačovat ziskové příležitosti. input_fc TransformerEncoderLayerRelative output_fc Pokud model Transformer poskytuje agentovi „oči“ a „uši“, simuluje svět, se kterým interaguje. Tato třída prostředí s názvem definuje, co to znamená provést akci – jako je otevření nebo uzavření pozic – a jak jsou přidělovány odměny. Uvnitř prostředí agent sleduje změny cen, technické ukazatele a své aktuální držby. Následující úryvek ukazuje, jak prostředí vytváří stavy z tržních dat a pozic agentů: třída TradingEnv TradingEnv def get_state(self): states = [] current_timestamp = self.tech_array.iloc[self.time]['timestamp'] weight_long = float(self.stocks_long * self.current_price / self.total_asset) if self.total_asset > 0 else 0.0 weight_short = float(self.stocks_short * self.current_price / self.total_asset) if self.total_asset > 0 else 0.0 for _ in range(self.lookback): row = self.precomputed_tech.get(current_timestamp) if row is not None: features = row.drop(['timestamp', 'date']).astype(np.float32).values state_row = np.concatenate(([weight_long, weight_short], features)).astype(np.float32) else: state_row = np.zeros(self.state_dim, dtype=np.float32) states.append(state_row) current_timestamp -= self.get_timeframe_in_seconds() states = states[::-1] # ensure chronological order state = torch.tensor(np.array(states, dtype=np.float32), dtype=torch.float32).unsqueeze(0).to(self.device) return state Prostředí zde tvoří bohaté vložení stavu, které zahrnuje informace o poloze a historické okno funkcí. Poskytnutím této okénkové perspektivy může Transformer modelovat časové vzory. Každý krok v prostředí aktualizuje pozice, počítá zisk nebo ztrátu a vrací agentovi nový stav a odměnu. Tato cyklická výměna podporuje zpětnou vazbu a umožňuje agentovi zjistit, co funguje a co ne. Rozhodovací jádro se nachází ve třídě , která implementuje přístup Double DQN. Double DQN pomáhá řešit dobře známou zaujatost nadhodnocení v Q-learningu pomocí samostatných sítí pro výběr akcí a odhad hodnoty. Agent spravuje instance a modelu založeného na Transformeru a používá vyrovnávací paměť pro přehrávání k vzorkování minulých zkušeností. Během tréninku aktualizuje své parametry minimalizací rozdílu mezi předpokládanými Q-hodnotami a cílovými Q-hodnotami odvozenými z cílové sítě: DiscreteDDQNAgent online_net target_net def update(self): self.online_net.train() if len(self.memory) < self.batch_size: return None states, actions, rewards, next_states, dones = self.memory.sample(self.batch_size) q_values = self.online_net(states).gather(1, actions.unsqueeze(1)).squeeze(1) with torch.no_grad(): next_q_values = self.target_net(next_states).gather(1, self.online_net(next_states).argmax(dim=1).unsqueeze(1)).squeeze(1) target_q_values = rewards + self.gamma * next_q_values * (1 - dones) ddqn_loss = self.loss_fn(q_values, target_q_values.detach()) self.optimizer.zero_grad() ddqn_loss.backward() torch.nn.utils.clip_grad_norm_(self.online_net.parameters(), max_norm=1.0) self.optimizer.step() self.soft_update() return ddqn_loss.item() Tento kód odhaluje pečlivou trénovací rutinu: agent opakovaně vzorkuje mini-dávky minulých přechodů, počítá ztrátu DDQN a aktualizuje . Pravidelně provádí měkkou aktualizaci , aby pomalu sledovala zlepšení. Kombinací schopností rozpoznávání vzorů Transformeru se stabilní dynamikou učení Double DQN se agent postupně stává zběhlejším ve výběru ziskových obchodů. online_net target_net Podmínky na trhu se však nikdy nezastaví. Posuny ve volatilitě, regulační změny nebo náhlé události likvidity mohou proměnit včerejší vítěze v dnešní poražené. Aby bylo možné takové směny zvládnout, je zaveden koncept . Namísto spoléhání se pouze na aktualizace prováděné po nasbírání velkého množství zkušeností umožňuje TTT určitým částem sítě dynamicky se přizpůsobovat, když přicházejí nové stavy, a to i během vyvozování. Tato rychlá adaptace umožňuje agentovi překalibrovat své strategie za běhu a přizpůsobit se nepředvídaným okolnostem, aniž by čekal na celý cyklus přeškolení. tréninku v testovacím čase (TTT) V tomto kódu je TTT usnadněno selektivním tréninkem parametrů během inference a zaměřením na malou podmnožinu parametrů. Agent může například upravit část své sítě tak, aby rychle absorbovala nové vzory. Metody a (nyní nejsou zobrazeny, protože se zaměřujeme na logiku Transformer, Env, DDQN a TTT) tyto adaptivní parametry zapínají a vypínají. I když tento úryvek kódu konkrétně odkazuje na LoRA (adaptace nízké úrovně), platí stejná filozofie: TTT znamená umožnit určitým částem modelu učit se v době testu. Když je aktivní režim TTT, specializovaný optimalizátor na místě aktualizuje tyto parametry: activate_lora() deactivate_lora() def update_auxiliary(self, state): self.autoencoder.train() self.online_net.train() # Ensure noise and adaptive params are active masked_state, target_state = self.mask_input(state) masked_state_flat = masked_state.view(state.size(0), -1) target_state_flat = target_state.view(state.size(0), -1) reconstructed = self.autoencoder(masked_state_flat) aux_loss = F.mse_loss(reconstructed, target_state_flat) self.autoencoder_optimizer.zero_grad() self.ttt_optimizer.zero_grad() aux_loss.backward() torch.nn.utils.clip_grad_norm_(self.autoencoder.parameters(), max_norm=1.0) torch.nn.utils.clip_grad_norm_(filter(lambda p: p.requires_grad, self.online_net.parameters()), max_norm=1.0) self.autoencoder_optimizer.step() self.ttt_optimizer.step() self.autoencoder.eval() return aux_loss.item() Tato pomocná aktualizační rutina, spouštěná v době testu, demonstruje přizpůsobivost systému. Agent záměrně maskuje některé vstupní vlastnosti a snaží se je rekonstruovat, čímž zlepšuje svou vnitřní reprezentaci aktuálního tržního režimu. Díky tomu může rychle reagovat na změny dat a udržovat ziskové strategie v neustále se měnícím prostředí. Stručně řečeno, souhra těchto komponent vytváří robustní a flexibilní obchodní stroj. Model založený na transformátoru poskytuje bohaté, kontextově citlivé pochopení tržních signálů. TradingEnv simuluje realistické podmínky a zpětnovazební smyčky. Rámec Double DQN zajišťuje stabilní učení akčních hodnot a postupně zpřesňuje obchodní rozhodnutí. Konečně TTT umožňuje agentovi zůstat agilní a upravovat své vnitřní parametry, když je konfrontován s novými vzory. Tyto prvky společně vytvářejí půdu pro systém, který je sofistikovaný v rozpoznávání vzorů a zároveň odolný vůči nejistotě trhu a nabízí přesvědčivou vizi pro obchodní strategie nové generace. Jaký je výsledek? Na historických denních datech BTC/USDT tento agent nezískal jen malé zisky – několikrát zdvojnásobil svůj počáteční kapitál. Jestli to není budíček, tak nevím co. Vícenásobné zdvojnásobení kapitálu: Záznamy TensorBoard ukazují ztráty vyhlazené na působivě nízké úrovně a distribuce Q-hodnot pro různé obchodní akce tvořily odlišné, smysluplné vzorce. Překlad: Model nejen hádá, ale učí se trvale ziskovému přístupu. Stabilní, nízké ztráty a jasné zásady: Potenciál další úrovně Právě teď tančíme s OHLCV. Dej mi hloubku knihy objednávek a já ti dám alfu, která je prakticky nukleární. Váš interní fond likvidity si zaslouží model, který dokáže předvídat a využívat cenové pohyby na úrovni mikrosekund. Data na úrovni objednávky: intradenní skalpování nebo dlouhodobější poziční obchody? S transformátory můžeme sloučit více granularit – 1minutové grafy s denními trendy – a odhalit signály, které nemůže nabídnout žádný jediný časový rámec. Integrace více časových rámců: Trhy neustále lámou vzorce. S LoRA a TTT se tento agent dokáže přizpůsobit rychleji než kofeinovaný stážista, který táhne celou noc. Nárůst volatility přes noc? Oznámení Fedu? Modelka říká: "Přines to." Odolnost vůči posunům režimů: Komentujte, zapojte se, nabídněte nabídku 🤯 Nedovolte, aby to byla jen letmá kuriozita. Komentujte, kritizujte, ptejte se. Pokud vás zajímá, jak upravit svou strategii nebo jak integrovat flexibilní řešení DRL do vašeho stávajícího zásobníku, zanechte komentář.