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
Transformers: 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.
Double DQN (DDQN): 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ů.
Noisy Nets podporují průzkum přidáváním parametrizovaného šumu přímo k vahám sítě.
LoRA 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í.
Test-Time Training (TTT): 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.
Kód je zapnutý
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 model Transformer . 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 TransformerNetwork
, 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:
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 input_fc
(lineární vrstva vylepšená o šum a potenciální adaptace nízké úrovně), procházejí naskládanými moduly TransformerEncoderLayerRelative
, které zachycují časové a relativní polohové informace, a nakonec jsou shrnuty do akcí pomocí output_fc
. 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.
Pokud model Transformer poskytuje agentovi „oči“ a „uši“, třída TradingEnv simuluje svět, se kterým interaguje. Tato třída prostředí s názvem TradingEnv
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ů:
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ě DiscreteDDQNAgent , 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 online_net
a target_net
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ě:
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 online_net
. Pravidelně provádí měkkou aktualizaci target_net
, 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ů.
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 tréninku v testovacím čase (TTT) . 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í.
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 activate_lora()
a deactivate_lora()
(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:
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?
Potenciál další úrovně
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ář.