Pășim pe urmele campionilor „all time” ai investițiilor

Niciodată n-am putut spune că mă dă hărnicia afară din casă și în niciun caz nu se întâmplă asta în anotimpul călduros. Dacă îi compar pe nemți și nordici cu grecii sau spaniolii sunt convins că e o corelare între temperaturi și cheful de muncă. Dar nu vreau ca asta să sune ca o scuză pentru că eu chiar prefer stilul de viață de la Mediterană.

Pe la începutul verii am început cu elan un serial numit Arsenal de lucrări de cercetare pentru cucerirea bursei și am făcut o pauză cam mare de la ultimul episod, de aceea am explicat puțin despre treaba cu lenea.

Dar acum, dacă tot ne apropiem de sfârșitul verii… „I’m back baby” și am ceva nou.

Înapoi la cucerirea bursei

Cum abordăm cucerirea asta, pentru că nu e o sarcină ușoră?

Imediat îți spun abordarea la care mă gândesc, dar mai întâi ar mai fi o întrebare.

Merită să riști să investești la bursă?

Pentru majoritatea oamenilor răspunsul e nu.

E clar că e posibil să pierzi bani și e normal să te întrebi dacă merită să-ți asumi acest risc. Care e recompensa? Cât poți câștiga?

Ca să ai câteva referinte, fondul Medallion, unul dintre cele mai de succes fonduri de investiții din istorie a obținut un randament mediu de 39% pe an timp de 30 de ani.

Berkshire Heathaway, compania lui Warren Buffett a obtinut o medie de aproximativ 20% pe an timp de 56 de ani, în timp ce S&P500 a crescut în medie cu aproximativ 10% pe an timp de peste 100 de ani.

În afară de exemplele de mai sus, au existat mii de fonduri care au dat faliment, unele dintre ele pierzând toți banii investitorilor.

Chiar dacă în cele 3 exemple randamentele medii sunt pozitive, toate au avut și ani mai slabi. S&P500 și Berkshire Heathaway au avut ani cu pierderi de pâna la -47%.

Singurul fond de care am auzit că nu a avut niciun an în pierdere e Medallion.

Hai să vedem ce câștiguri ar putea aduce asemenea randamente pe o perioadă de 10 ani dacă pornești cu o investiție de $10.000.

  1. Randamente Medallion (39% pe an) -> $269.245 – $10.000 = $259.245
  2. Randamente Berkshire Heathaway (20% pe an) -> $61.917 – $10.000 = $51.917
  3. Randamente S&P500 (10% pe an) -> $25.937 – $10.000 = $15.937

Așadar, dacă pierderea unor sume de bani nu-ți afectează stilul de viață și vrei să riști o anumită sumă pentru a avea șansa să realizezi asemenea profituri poți lua în considerare investițiile la piețele financiare.

Și acum, înapoi la prima întrebare…

Cum abordăm investitiile?

Dacă Medallion e cel mai de succes fond al tuturor timpurilor, aducând profituri mult peste media bursei, fără să aibă nicun an cu pierderi, de ce să nu încercăm să abordăm investițiile așa cum o fac ei?

Performanțele lor sunt probabil imposibil de obținut din cauză că ei au în echipă o grămadă de super matematicieni, fizicieni și oameni de știință, plus zeci de ani de experiență, dar tot e o idee bună să învățăm tot ce se poate de la acest fond.

Medallion a folosit dintotdeauna algoritmi și aproape toate tranzacțiile fondului au fost realizate de computere. Asemenea programe se numesc „trading bots” (roboti de tranzactionare).

Cele mai importante motive pentru care robotii de tranzactionare pot avea rezultate mai bune decât traderii care executa tranzactii manuale sunt:

  • capacitatea de procesare a informatiilor e mult mai mare decât a unui om
  • mulți traderi iau decizii greșite din cauza emoțiilor, lucru care evident nu se întâmplă în cazul roboților

Acesti roboti analizeaza tot felul de date cu scopul de a face predictii legate de evoluția preturilor anumitor active tranzacționate.

De obicei e vorba despre baze de date cu prețurile istorice dar există mulți alți indicatori și alte informații care pot fi luate în considerare pentru a face predicții și a iniția tranzcții.

Exemple pot fi: date legate de inflație, de șomaj, ratele dobânzilor, dar și trend-uri de căutări pe internet sau apariția unor cuvinte și fraze în comunicate de presă sau în mediul online.

Din toate aceste cantități uriașe de date se pot construi nenumarate modele și strategii de tranzactionare care se pot implementa sub forma de roboti de tranzactionare.

Până când am suficientă experiență și cunoștințe încât să dezvolt propriile strategii, voi începe să studiez lucrări de cercetare despre bursă și să dezvolt roboți de tranzacționare pe baza celor mai promițătoare strategii descoperite în aceste lucrări.

De exemplu, chiar strategia din episodul 1 al serialului Arsenal de lucrări de cercetare pentru cucerirea bursei se poate transforma într-un roboțel.

În concluzie, voi urma 3 pași principali:

  1. Studiul cât mai multor lucrări de cercetare despre bursă pe care le găsesc aici: https://www.ssrn.com/index.cfm/en/rps/
  2. Dezvoltare roboti de tranzactionare in Python pe baza strategiilor profitabile descoperite in lucrari
  3. Punerea in functiune a robotilor cu alocarea unui buget în funcție de performanțele strategiei și de componența totală a strategiilor din portofoliu

Cum funcționează și cum se dezvoltă în Python un robot de tranzacționare

În viitor o să public mai multe detalii despre dezvoltarea roboților, sau chiar codul unora dintre ei, dar astăzi o să explic doar câteva chestii de bază ca să înțelegi cu ce se mănâncă treaba asta.

În primul rand, pentru a putea face tranzactii folosind roboti ai nevoie de un cont la un broker care ofera acces via API (application programming interface). Poti vedea aici o lista: https://www.wikijob.co.uk/trading/forex/brokers-with-api-access.

Eu folosesc si recomand Interactive Brokers si voi dezvolta roboti care vor functiona cu acest broker.

Roboțelul e un program care rulează în permanență pe computerul tău sau pe un VPS (server privat virtual) dacă vrei să ai mai multa incredere in conexiunea la internet.

Pe acelasi computer se instaleaza si un program de tipul platforma de tranzactionare, in cazul Interactive Brokers (IB) platforma se numeste Trader Workstation.

O platforma de tranzactionare se foloseste pentru a vizualiza grafice de pret pentru diferite active (actiuni, ETF-uri, crypto, obligatiuni, etc), știri, pentru a analiza graficele folosind diferiti indicatori și pentru a seta ordine de tranzactionare.

Daca brokerul ofera un API, tranzactiile se pot realiza prin niste apeluri de functii care trimit mesaje de la robot la platforma.

Practic ce actiuni poti face manual pe platforma le poti face si prin cod.

Înainte să scrii cod e nevoie sa faci câteva setări la platforma de tranzacționare.

În Global Configuration / API – Settings asigură-te că e bifată prima opțiune, Enable ActiveX and Socket Clients și e debifată a doua: Read-Only API.

Codul pentru un robot de tranzacționare e format din 3 componente principale.

  1. Conectarea la API, care in cazul Interactive Brokers se numește IBApi
  2. Logica robotului. Aceasta e partea cea mai complexa in care se analizeaza date si se iau decizii de tranzactionare
  3. Crearea si plasarea ordinelor de tranzacționare

În articolele următoare vom discuta mai mult legat de partea de logica, scopul acestui articol fiind să facă o introducere și sa ofere o privire de ansamblu despre cum se dezvolta si cum functioneaza roboti de tranzactionare.

Iată și codul pentru un robot de tranzactionare cu o logica extrem de simpla: te intreaba ce simbol vrei sa tranzactionezi, ce cantitate și cu ce preț, apoi plasează un ordin de timp bracket care conține un ordin de cumpărare la pretul specificat de tine, un ordin de vânzare de tip Stop Loss la un pret cu 1% sub pretul pietei și un ordin de vânzare de tip Limit la un preț cu 2% mai mare decât prețul pieței.

#Trading bot that sets and places a bracket order for Interactive Brokers

import ibapi
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.order import *
import threading
import time
#Vars
orderId = 1
# Class for Interactive Brokers Connection
# Data on IBApi Class and Logic in the Bot Class
class IBApi(EClient,EWrapper):
     def__init__(self):
          EClient.__init__(self, self)
     # Get next order id we can use
     def nextValidId(self, nextorderId):
          global orderId
          orderId = nextorderId
          print(„Order Id is {}”.format(nextorderId))
# Bot Logic
class Bot:
     ib = None
     def__init__(self):
          #Connect to IB on init
          self.ib = IBApi()
          self.ib.connect(„127.0.0.1”, 7496,1)
          ib_thread = threading.Thread(target=self.run_loop, daemon=True)
          # this will call run_loop. ib.run() will initiate the connection and start listening on the socket
          ib_thread.start()
          time.sleep(1)
          #Get symbol info
          symbol = input(„Enter the symbol you want to trade:”)
          #Get the number of shares
          quantity = input(„Enter the number of shares you want to trade : „)
          #Get the limit price
          lmtPrice = input(„Enter the limit price for your order : „)
          #Bracket Order 2% Profit Target 1% Stop Loss
          profitTarget = float(lmtPrice)*1.02
          stopLoss = float(lmtPrice)*0.99
          self.ib.reqIds(-1)
          bracket = self.bracketOrder(symbol,orderId,”BUY”,lmtPrice,quantity,profitTarget,stopLoss)
          contract = Contract()
          contract.symbol = symbol.upper()
          contract.secType = „CFD”
          contract.exchange = „SMART”
          contract.currency = „USD”
          #Place Bracket Order
          for o in bracket:
               o.ocaGroup = „OCA_”+str(orderId)
               print(„Placing order {}”.format(o.orderId))
               self.ib.placeOrder(o.orderId,contract,o)
     #Bracket Order Setup
     def bracketOrder(self, symbol, parentOrderId, action, price, quantity, profitTarget, stopLoss):
          #Initial Entry
          #Create our IB Contract Object
          contract = Contract()
          contract.symbol = symbol.upper()
          contract.secType = „CFD”
          contract.exchange = „SMART”
          contract.currency = „USD”
          # Create Parent Order / Initial Entry
          parent = Order()
          parent.orderId = parentOrderId
          parent.orderType = „LMT”
          parent.lmtPrice = price
          parent.action = action
          parent.totalQuantity = quantity
          parent.transmit = False
          # Profit Target
          profitTargetOrder = Order()
          profitTargetOrder.orderId = parent.orderId+1
          profitTargetOrder.orderType = „LMT”
          profitTargetOrder.action = „SELL”
          profitTargetOrder.totalQuantity = quantity
          profitTargetOrder.lmtPrice = round(profitTarget,2)
          profitTargetOrder.parentId = parentOrderId
          profitTargetOrder.transmit = False
          # Stop Loss
          stopLossOrder = Order()
          stopLossOrder.orderId = parent.orderId+2
          stopLossOrder.orderType = „STP”
          stopLossOrder.action = „SELL”
          stopLossOrder.totalQuantity = quantity
          stopLossOrder.parentId = parentOrderId
          stopLossOrder.auxPrice = round(stopLoss,2)
          stopLossOrder.transmit = True
          bracketOrders = [parent, profitTargetOrder, stopLossOrder]
          return bracketOrders
     #Listen to socket in separate thread
     def run_loop(self):
          self.ib.run()
#start Bot
bot = Bot()

 

Acest progrămel e aproape inutil în ceea ce privește tranzacționarea deoarece nu are de fapt nicio logică. L-am inclus totuși pentru că e folositor ca punct de plecare pentru a dezvolta roboți adevărați.

Dacă dorești să te joci cu el să vezi cum plasează ordinele, ai nevoie de un cont activ la Interactive Brokers și apoi trebuie să urmezi pașii de mai jos.

  1. Pornește Trader Workstation si fă setările specificate mai sus în articol.
  2. Salvează codul de mai sus intr-un fisier cu extensia .py (ex firstbot.py)
  3. Ruleaza programelul dintr-un terminal folosind comanda: python firstbot.py (include si calea catre fisierul tau)

Daca totul a mers bine vei vedea ordinele tale in platforma. Eu am introdus datele symbol – SPY, number of shares – 4 și limit price – 380. Rezultatul poate fi văzut în imaginea de mai jos.

Bogdan Popescu – Clubul Investitorilor

 

 

 

 

4 comentarii la “Pășim pe urmele campionilor „all time” ai investițiilor

  1. Bună dimineața Bogdan
    și mulțumesc mult pentru materialele ce mi le trimiți.
    Se salvează și recitesc până la însușire.
    Păstrez ca valoros și materialul tău de welness pe care mi-am permis a-l orândui grafic un pic și ți-am trimis elaboratul. Parcă acum doi ani sau anul trecut.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.