معاملات الگوریتمی به معاملات خودکار ابزارهای مالی (مبتنی بر برخی الگوریتم ها) با مداخله کم یا بدون مداخله انسانی در ساعات معاملات اشاره دارد. تقریباً هر نوع ابزار مالی – اعم از سهام، ارز، کامودیتی ها، محصولات اعتباری یا نوسانات – با چنین روشی قابل معامله است. کتابهای The Quants نوشته Scott Patterson و More Money than God نوشته Sebastian Mallaby تصویری زنده از آغاز تجارت الگوریتمی و شخصیتهای نو ظهور آن را ترسیم کرده اند.

موانع ورود به معاملات الگوریتمی همواره وجود داشته است. چندی پیش فقط سرمایه گذاران حقوقی با بودجه بسیار بالا در بخش فناوری اطلاعات می توانستند در اینگونه معاملات شرکت کنند، اما امروزه حتی افرادی که فقط به یک دفترچه یادداشت و اتصال اینترنت مجهز هستند می توانند در عرض چند دقیقه کار خود را آغاز کنند. چند روند برای شروع معاملات خودکار را باید در نظر گرفت:

نرم افزار منبع آزاد: هر نرم افزاری که یک معامله گر برای شروع به کار در معاملات الگوریتمی نیاز دارد، به صورت منبع باز در دسترس است. به طور خاص، پایتون بسیار در این زمینه محبوب شده است.

منابع: مجموعه داده های ارزشمند از منابع آزاد در دسترس هستند به طوری که گزینه های زیادی برای آزمایش فرضیه ها و استراتژی های معاملاتی فراهم می کنند.

سیستم عامل های معاملاتی آنلاین: تعداد زیادی سیستم عامل معاملات آنلاین وجود دارد که دسترسی آسان و استاندارد به داده های تاریخی (از طریق RESTful API) و داده های زمان واقعی (از طریق API) را فراهم می کنند، و همچنین ویژگی های معاملات و پرتفوی را در اختیارمان می گذارند.

عناصر اصلی ساخت الگوریتم معاملاتی خودکار

  • استراتژی: یکی از گزینه های ممکن، استراتژی حرکت سری زمانی است (Moskowitz، Tobias، Yao Hua Ooi و Lasse Heje Pedersen (2012): “Time Series Momentum.” Journal of Financial Economy، 104، 228-250.)، به طوری که فرض می کند یک ابزار مالی که عملکرد خوب / بدی داشته باشد، همچنان روند خود را ادامه می دهد.
  • بستر های نرم افزاری: ما Oanda را انتخاب کردم. Oanda به شما امکان می دهد انواع قراردادهای اهرمی را برای تفاوت (CFD) استفاده کنید، که اساساً آربیتراژ جهت دار روی مجموعه متنوعی از ابزارهای مالی (به عنوان مثال ارزها، شاخص های سهام، کالاها) را امکان پذیر می کند.
  • داده ها: می توانید تمام داده های تاریخی خود را از Oanda دریافت کنید.
  • نرم افزار: ما از Python در ترکیب با کتابخانه (پاندا) قدرتمند تجزیه و تحلیل داده ها، به علاوه چند بسته اضافی Python استفاده خواهیم کرد.

در ادامه فرض شده است که شما برنامه Python 3.5 با کتابخانه های تجزیه و تحلیل داده های اصلی مانند NumPy و pandas در دسترس دارید. همچنین می توانید فایل آموزشی کتابخانه نامپای را از اینجا دانلود کنید.

Oanda

در http://oanda.com، می توانید در عرض چند دقیقه یک حساب رایگان (“معاملات کاغذی”) ایجاد کنید. پس از انجام این کار، برای دسترسی برنامه ای به Oanda API، باید بسته مربوطه Python را نصب کنید:

pip install oandapy

برای کار با بسته، باید یک فایل پیکربندی با نام پرونده oanda.cfg ایجاد کنید که دارای محتوای زیر باشد:

[oanda]
account_id = YOUR_ACCOUNT_ID
access_token = YOU_ACCESS_TOKEN

اطلاعات فوق را به شرح ذیل بروز کنید:

In [1]:
import configparser  # 1 
import oandapy as opy  # 2

config = configparser.ConfigParser()  # 3
config.read('oanda.cfg')  # 4

oanda = opy.API(environment='practice',
access_token=config['oanda']['access_token'])  # 5

تست و آزمون

ما در حال حاضر همه موارد لازم را برای شروع استراتژی حرکت تنظیم کرده ایم. به طور کلی ، ما می توانیم داده های تاریخی را از Oanda دانلود کنیم. ابزاری که ما استفاده می کنیم EUR_USD است و بر اساس نرخ ارز EUR / USD تنظیم شده است.

اولین مرحله در تست داده ها و تبدیل آنها به یک DataFrame ازکتابخانه  pandas است. مجموعه داده های مربوط به دو روز 8 و 9 دسامبر است و تایم فریم یک دقیقه است. خروجی در انتهای بلوک زیر، نمای کاملی از مجموعه داده ها را نشان می دهد.

In [2]:
import pandas as pd  # 6

data = oanda.get_history(instrument='EUR_USD',  # our instrument
                         start='2016-12-08',  # start data
                         end='2016-12-10',  # end date
                         granularity='M1')  # minute bars  # 7

df = pd.DataFrame(data['candles']).set_index('time')  # 8

df.index = pd.DatetimeIndex(df.index)  # 9

df.info() # 10


<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2658 entries, 2016-12-08 00:00:00 to 2016-12-09 21:59:00
Data columns (total 10 columns):
closeAsk    2658 non-null float64
closeBid    2658 non-null float64
complete    2658 non-null bool
highAsk     2658 non-null float64
highBid     2658 non-null float64
lowAsk      2658 non-null float64
lowBid      2658 non-null float64
openAsk     2658 non-null float64
openBid     2658 non-null float64
volume      2658 non-null int64
dtypes: bool(1), float64(8), int64(1)
memory usage: 210.3 KB


در مرحله بعد، ما استراتژی حرکت را با زبان پایتون رسمیت می دهیم که میانگین بازده ورود به سیستم را در فریم های 15، 30، 60 و 120 دقیقه گذشته برای گرفتن موقعیت در نظر بگیرد. به عنوان مثال، میانگین بازگشت برای تایم فریم 15 دقیقه گذشته میانگین مقدار 15 مشاهده گذشته را نشان می دهد. اگر این مقدار مثبت باشد، در موقعیت خود یا خرید می مانیم. اگر منفی باشد می می فروشیم.

In [3]:
import numpy as np  # 11

df['returns'] = np.log(df['closeAsk'] / df['closeAsk'].shift(1))  # 12

cols = []  # 13

for momentum in [15, 30, 60, 120]:  # 14
    col = 'position_%s' % momentum  # 15
    df[col] = np.sign(df['returns'].rolling(momentum).mean())  # 16
    cols.append(col)  # 17


مرحله سوم ، به منظور بدست آوردن عملکرد مطلوب استراتژی برای تایم فریم های مختلف (در چند دقیقه) ، باید موقعیت های بدست آمده در بالا (با یک روز تغییر مکان) را با بازده بازار ضرب کنید

In [4]:
%matplotlib inline
import seaborn as sns; sns.set()  # 18

strats = ['returns']  # 19

for col in cols:  # 20
    strat = 'strategy_%s' % col.split('_')[1]  # 21
    df[strat] = df[col].shift(1) * df['returns']  # 22
    strats.append(strat)  # 23

df[strats].dropna().cumsum().apply(np.exp).plot()  # 24

Out[4]:
<matplotlib.axes._subplots.AxesSubplot at 0x11a9c6a20>

معامله خودکار

هنگامی که تصمیم گرفتید کدام یک از استراتژی های معاملاتی خود را اجرا کنید ، آماده هستید که عملیات معامله گری خودکار را شروع کنید.

In [5]:
class MomentumTrader(opy.Streamer):  # 25
    def __init__(self, momentum, *args, **kwargs):  # 26
        opy.Streamer.__init__(self, *args, **kwargs)  # 27
        self.ticks = 0  # 28
        self.position = 0  # 29
        self.df = pd.DataFrame()  # 30
        self.momentum = momentum  # 31
        self.units = 100000  # 32
    def create_order(self, side, units):  # 33
        order = oanda.create_order(config['oanda']['account_id'], 
            instrument='EUR_USD', units=units, side=side,
            type='market')  # 34
        print('\n', order)  # 35
    def on_success(self, data):  # 36
        self.ticks += 1  # 37
        # print(self.ticks, end=', ')
        # appends the new tick data to the DataFrame object
        self.df = self.df.append(pd.DataFrame(data['tick'],
                                 index=[data['tick']['time']]))  # 38
        # transforms the time information to a DatetimeIndex object
        self.df.index = pd.DatetimeIndex(self.df['time'])  # 39
        # resamples the data set to a new, homogeneous interval
        dfr = self.df.resample('5s').last()  # 40
        # calculates the log returns
        dfr['returns'] = np.log(dfr['ask'] / dfr['ask'].shift(1))  # 41
        # derives the positioning according to the momentum strategy
        dfr['position'] = np.sign(dfr['returns'].rolling( 
                                      self.momentum).mean())  # 42
        if dfr['position'].ix[-1] == 1:  # 43
            # go long
            if self.position == 0:  # 44
                self.create_order('buy', self.units)  # 45
            elif self.position == -1:  # 46
                self.create_order('buy', self.units * 2)  # 47
            self.position = 1  # 48
        elif dfr['position'].ix[-1] == -1:  # 49
            # go short
            if self.position == 0:  # 50
                self.create_order('sell', self.units)  # 51
            elif self.position == 1: # 52
                self.create_order('sell', self.units * 2)  # 53
            self.position = -1  # 54
        if self.ticks == 250:  # 55
            # close out the position
            if self.position == 1:  # 56
                self.create_order('sell', self.units)  # 57
            elif self.position == -1:  # 58
                self.create_order('buy', self.units)  # 59
            self.disconnect()  # 60

کد زیر اجازه می دهد تا کلاس MomentumTrader کار خود را شروع کند. معاملات خودکار با شتاب محاسبه شده در طول 12 بازه به مدت 5 ثانیه انجام می شود. کلاس پس از 250 فریم داده دریافت شده به طور خودکار معامله را متوقف می کند.

In [6]:
mt = MomentumTrader(momentum=12, environment='practice',
                    access_token=config['oanda']['access_token'])
mt.rates(account_id=config['oanda']['account_id'],
         instruments=['DE30_EUR'], ignore_heartbeat=True)

جمع بندی

در این مقاله یادگرفتیم که با کمتر از 100 خط کد پایتون، یک معامله الگوریتمی را خودمان برنامه نویسی کنیم. تمام مراحل چنین پروژه ای مانند دریافت داده ها برای اهداف آزمون و تست، آزمایش مجدد استراتژی و خودکار سازی معاملات بر اساس مشخصات استراتژی بیان شد. کد ارائه شده یک نقطه شروع برای تحقیق بیشتر در بسیاری از جهات مختلف را فراهم می کند.