امروزه معاملات در بازارهای مالی به یکی از سرمایه گذاریهای پر سود تبدیل شده است. در این بازارها سرعت و دقت در تحلیل و انجام معاملات از اهمیت بالایی برخوردار است. از همین رو بسیاری از معامله گران در صدد استفاده از رباتهای معاملهگر برای تحلیل و انجام معاملات در بازارهایی مثل بازارهای فارکس بر میآیند. در معاملات الگوریتمی استراتژیهای معاملاتی توسط زبانهای برنامهنویسی مختلفی مثل پایتون، ام کیو ال و… به کدهایی تبدیل میشوند که رباتهای معامله گر هستند. یکی از زبانهای مهم برنامهنویسی رباتهای معاملاتی، زبان برنامهنویسی پایتون است. طراحی و برنامهنویسی پایتون برای رباتهای معاملهگر api، بستر خوبی برای آموزش، خودکارسازی و سپس پردازش برنامههای ربات به معامله گران میدهد.
در برنامهنویسی رباتهای معامله گر با زبان پایتون به جای ورود دستی هر عبارت، میتوان اسکریپتی نوشت که تمامی عملیات را در ربات معاملهگر محاسبه، ضبط و شبیهسازی میکند. این کار به معامله گران این امکان را میدهد که به سرعت استراتژی خود را تجسم نموده، شبیهسازی کرده و تست کنند، همچنین برنامه و منطق آن را اصلاح نمایند.
ربات تجاری پایتون چیست؟
ربات معاملاتی نرم افزاری است که به API صرافی مورد نظرمعامله گر متصل میشود تا به طور خودکار با آن تعامل داشته باشد و براساس تجزیه و تحلیل دادههای بازار معاملات را از طرف معاملهگر انجام میدهد. زمانی که شرایط بازار با مجموعهای از معیارهای از پیش تعریف شده مطابقت داشته باشد، ربات دارایی را خرید/فروش میکند.
API
واژه (API (Application Programming Interface به معنای «رابط برنامهنویسی اپلیکیشن» است. در واقع API رابطی است که برای دریافت و ارسال اطلاعات در یک نرم افزار از آن استفاده می شود. برای اتصال به صرافی مورد نظر فقط باید API صرافی موردنظر به ربات معاملهگر داده شود. بعد از دادن API به ربات معامله گر، صرافی به ربات معامله گر متصل شده و معاملات خود را آغاز میکند.
در این مقاله به شما نشان داده میشود که چگونه با کدهای ساده زبان پایتون، دادههای بازار را بخوانید، سهام بخرید و بفروشید، و منطق الگوریتم معاملاتی خود را برنامه ریزی کنید. البته به خاطر داشته باشید که این آموزش برای کسب درآمد میلیاردی از رباتهای معاملاتی ارائه نمی شود.
سلب مسئولیت: هیچ یک از مواردی که در این مقاله وجود دارد نباید توصیه سرمایهگذاری در نظر گرفته شود. مقاله فوق هیچ نوع توصیه یا پیشنهاد معاملاتی در مورد نحوه سرمایه گذاری، نحوه معامله، نوع دارایی سرمایهگذاری یا پیشنهاداتی در مورد نحوه استفاده از رباتهای معاملاتی یا الگوریتمهای معاملاتی ارائه نمیدهد! همیشه قبل از سرمایهگذاری تحقیق خود را انجام دهید و همیشه (!) فقط آنچه را سرمایهگذاری کنید که توانایی از دست دادنش را دارید! حتما این را در نظر بگیرید که بک تستها نشان دهنده نتایج آینده نیستند.
قبل از شروع طراحی یک ربات معاملاتی با پایتون ابتدا به تعریف چند اصطلاح مفید میپردازیم:
- تجارت کاغذی: معامله اوراق بهادار با پول مجازی برای اهداف آموزشی یا آزمایشی.
- بک تست: آزمایش یک الگوریتم معاملاتی در برابر دادههای بازار گذشته به منظور ارزیابی اثربخشی آن.
- میانگین متحرک: میانگین مقدار معینی از ورودیهای اخیر در مجموعهای از داده ها.
- S&P 500: شاخص بازار سهام متشکل از ۵۰۰ شرکت بزرگ فهرست شده در بازار بورس آمریکا
- قیمت پایانی: قیمت نهایی اوراق بهادار در طول یک واحد زمان
- Good ‘Til Cancel (GTC): زمانی که معاملهای انجام میدهید، ممکن است فوراً انجام نشود. یک کارگزار به تلاش و اجرای یک معامله GTC تا زمانی که آن را لغو نکنید، ادامه خواهد داد.
قبل از شروع تجارت با رباتهای معاملهگر به یک کلید API نیاز است.
نصب API
پروژه فوق، API معاملاتی که قرار است از آن استفاده کنیم Alpaca نام دارد و یکی از بصریترین APIهای معاملاتی است. از آدرس زیر میتوانید API آلپاکا را دانلود کنید.
http:// alpaca.markets/
Alpaca در بخش رایگان خود، شامل دادههای معاملات مجازی و واقعی و دادههای بازار گذشته و زنده است. همچنین دارای یک رابط کاربری فوق العاده تمیز و کتابخانه پایتون است.
اگر قصد دارید اسکریپت پایتون خود را در رایانه خود اجرا کنید، باید ربات تجاری خود را در فضای ابری مستقر کنید. برای این کار از Codesphere استفاده میکنیم:
http://codesphere.com/
از آنجایی که بخش ابتدایی- انتهایی Codesphere یک IDE است، میتوانیم ربات خود را مستقیماً روی پلتفرم توسعه دهیم. با این حال، اگر میخواهید برنامهنویسی را روی دستگاه خود انجام دهید، میتوانید GitHub خود را به Codesphere متصل کرده و سپس آن را مستقر کنید.
تنها فضای نصب که واقعاً قبل از شروع کدنویسی به آن نیاز داریم، ایجاد محیط پیپ (pipenv shell) است.
سپس Alpaca API را نصب کنید.
pipenv install alpaca_trade_api
ما همچنین باید یک حساب Alpaca رایگان ایجاد کنیم و سپس وارد حساب تجارت مجازی خود شویم.
به کلید API خود در سمت راست توجه کنید. هنگامی که برای اولین بار حساب خود را باز میکنید، از شما خواسته میشود یک کلید ایجاد کنید و کلید عمومی و خصوصی به شما نشان داده میشود. بعدا به این کلیدهای عمومی و خصوصی نیاز خواهیم داشت.
خرید و فروش سهام با کتابخانه Alpaca Trading در پایتون
سپس میتوانیم کتابخانه Alpaca Trading خود را راهاندازی کنیم و خرید و فروش سهام را در زبان پایتون بدین صورت طراحی کنیم.
import alpaca_trade_api as tradeapi |
SEC_KEY = ” # Enter Your Secret Key Here |
PUB_KEY = ” # Enter Your Public Key Her |
BASE_URL = ‘https://paper-api.alpaca.markets’ # This is the base URL for paper trading |
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL) # For real trading, don’t enter a base_url |
# Buy a stock |
api.submit_order( |
symbol=’SPY’; # Replace with the ticker of the stock you want to buy |
qty=1, |
side=’buy’, |
type=’market’, |
time_in_force=’gtc’ # Good ’til cancelled |
) |
# Sell a stock(Just change side to ‘sell’) |
api.submit_order( |
symbol=’SPY’, |
qty=1, |
side=’sell’, |
type=’market’, |
time_in_force=’gtc’ |
) |
طراحی استراتژی
در این مثال استراتژی ما این است که زمانی که میانگین متحرک ۵ دقیقه از قیمت ما عبور کرد، خرید و فروش کنیم. هرچند این با یک استراتژی معاملاتی خوب فاصله دارد، اما منطقی نسبتاً ساده است و به ما اجازه میدهد تا روی ساختار کلی یک ربات معاملاتی تمرکز کنیم.
در مثال بالا، خط قرمز قیمت سهام و خط آبی میانگین متحرک است. وقتی میانگین متحرک از قیمت عبور کرد، ما قصد داریم سهمی از سهام خود را بخریم. سپس سهام را نگه میداریم تا زمانی که میانگین متحرک دوباره عبور کند و از قیمت بالاتر رود. . زمانی که این اتفاق افتاد، سهم خود را میفروشیم و سپس منتظر سیگنال خرید بعدی خواهیم بود.
در این مقاله، SPY را معامله میکنیم، که شاخصی است که S&P 500 را دنبال میکند و هر بار فقط یک سهم را معامله میکنیم.
خواندن اطلاعات بازاربا Alpaca API در پایتون
حال به نحوه خواندن دادههای بازار با استفاده از Alpaca API در پایتون میپردازیم:
import alpaca_trade_api as tradeapi |
import numpy as np |
import time |
SEC_KEY = ‘bcO995J1nB2W7iWbzIkXv4foX0GKaQJAYT8pX1fN’ |
PUB_KEY = ‘PKRQE96HW8BM6TO9V13V’ |
BASE_URL = ‘https://paper-api.alpaca.markets’ |
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL) |
symb = “SPY” |
symb = “SPY” |
print(“”) |
print(“Checking Price”) |
market_data = api.get_barset(symb, ‘minute’, limit=5) # Get one bar object for each of the past 5 minutes |
close_list = [] # This array will store all the closing prices from the last 5 minutes |
for bar in market_data[symb]: |
close_list.append(bar.c) # bar.c is the closing price of that bar’s time interval |
close_list = np.array(close_list, dtype=np.float64) # Convert to numpy array |
ma = np.mean(close_list) |
last_price = close_list[4] # Most recent closing price |
print(“Moving Average: ” + str(ma)) |
print(“Last Price: ” + str(last_price)) |
time.sleep(60) # Wait one minute before retreiving more market data |
اگر به دنبال اطلاعات عمیقتر برای ساختن استراتژی خود هستید، اسناد Alpaca را از آدرس زیر بررسی کنید:
https://alpaca.markets/docs/api-documentation/api-v2/market-data/alpaca-data-api-v2/
اجرای استراتژی معاملاتی با alpaca trade api در پایتون
برای الگوریتم معاملاتی کامل خود همه موارد را کنار هم قرار میدهیم:
import alpaca_trade_api as tradeapi |
SEC_KEY = ” # Enter Your Secret Key Here |
PUB_KEY = ” # Enter Your Public Key Her |
BASE_URL = ‘https://paper-api.alpaca.markets’ # This is the base URL for paper trading |
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL) # For real trading, don’t enter a base_url |
# Buy a stock |
api.submit_order( |
symbol=’SPY’; # Replace with the ticker of the stock you want to buy |
qty=1, |
side=’buy’, |
type=’market’, |
time_in_force=’gtc’ # Good ’til cancelled |
) |
# Sell a stock(Just change side to ‘sell’) |
api.submit_order( |
symbol=’SPY’, |
qty=1, |
side=’sell’, |
type=’market’, |
time_in_force=’gtc’ |
) |
import alpaca_trade_api as tradeapi |
import numpy as np |
import time |
SEC_KEY = ‘bcO995J1nB2W7iWbzIkXv4foX0GKaQJAYT8pX1fN’ |
PUB_KEY = ‘PKRQE96HW8BM6TO9V13V’ |
BASE_URL = ‘https://paper-api.alpaca.markets’ |
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL) |
symb = “SPY” |
symb = “SPY” |
print(“”) |
print(“Checking Price”) |
market_data = api.get_barset(symb, ‘minute’, limit=5) # Get one bar object for each of the past 5 minutes |
close_list = [] # This array will store all the closing prices from the last 5 minutes |
for bar in market_data[symb]: |
close_list.append(bar.c) # bar.c is the closing price of that bar’s time interval |
close_list = np.array(close_list, dtype=np.float64) # Convert to numpy array |
ma = np.mean(close_list) |
last_price = close_list[4] # Most recent closing price |
print(“Moving Average: ” + str(ma)) |
print(“Last Price: ” + str(last_price)) |
time.sleep(60) # Wait one minute before retreiving more market data |
و این هم ربات معاملاتی است که در ۵۴ خط با استفاده از زبان پایتون نوشته ایم.
چنانچه بخواهیم آن را به صورت روزانه روی Codesphere اجرا کنیم، باید روزانه بهروزرسانی داشبورد Alpaca خود را ببینیم:
بک تست یک استراتژی در پایتون با API
اگر علاقهای به این ندارید که منتظر بمانید تا عملکرد صحیح الگوریتم خود را ببینید، میتوانید از API دادههای بازار Alpaca برای بک تست الگوریتم پایتون خود در برابر دادههای قدیمی استفاده کنید:
import alpaca_trade_api as tradeapi | 1 |
import numpy as np | 2 |
import time | 3 |
4 | |
SEC_KEY = ” | 5 |
PUB_KEY = ” | 6 |
ASE_URL = ‘https://paper-api.alpaca.markets’ | 7 |
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL) | 8 |
9 | |
symb = “SPY” | 10 |
pos_held = False | 11 |
hours_to_test = 2 | 12 |
13 | |
print(“Checking Price”) | 14 |
market_data = api.get_barset(symb, ‘minute’, limit=(60 * hours_to_test)) # Pull market data from the past 60x minutes | 15 |
16 | |
close_list = [] | 17 |
for bar in market_data[symb]: | 18 |
close_list.append(bar.c) | 19 |
20 | |
21 | |
22 | |
print(“Open: ” + str(close_list[0])) | 23 |
print(“Close: ” + str(close_list[60 * hours_to_test – 1])) | 24 |
25 | |
26 | |
close_list = np.array(close_list, dtype=np.float64) | 27 |
startBal = 2000 # Start out with 2000 dollars | 28 |
balance = startBal | 29 |
buys = 0 | 30 |
sells = 0 | 31 |
32 | |
33 | |
34 | |
for i in range(4, 60 * hours_to_test): # Start four minutes in, so that MA can be calculated | 35 |
ma = np.mean(close_list[i-4:i+1]) | 36 |
last_price = close_list[i] | 37 |
38 | |
print(“Moving Average: ” + str(ma)) | 39 |
print(“Last Price: ” + str(last_price)) | 40 |
41 | |
if ma + 0.1 < last_price and not pos_held: | 42 |
print(“Buy”) | 43 |
balance -= last_price | 44 |
pos_held = True | 45 |
buys += 1 | 46 |
elif ma – 0.1 > last_price and pos_held: | 47 |
print(“Sell”) | 48 |
balance += last_price | 49 |
pos_held = False | 50 |
sells += 1 | 51 |
print(balance) | 52 |
time.sleep(0.01) | 53 |
54 | |
print(“”) | 55 |
print(“Buys: ” + str(buys)) | 56 |
print(“Sells: ” + str(sells)) | 57 |
58 | |
if buys > sells: | 59 |
balance += close_list[60 * hours_to_test – 1] # Add back your equity to your balance | 60 |
61 | |
62 | |
print(“Final Balance: ” + str(balance)) | 63 |
64 | |
print(“Profit if held: ” + str(close_list[60 * hours_to_test – 1] – close_list[0])) | 65 |
print(“Profit from algorithm: ” + str(balance – startBal)) | 66 |
67 |
حال شما یک ربات معاملاتی ابتدایی دارید، که تنها با چند سطر زبان برنامهنویسی پایتون ایجاد شده است.
جمعبندی
ربات معاملاتی نرم افزاری است که به API صرافی مورد نظرمعامله گر متصل میشود تا به طور خودکار با آن تعامل داشته باشد. برای اتصال به صرافی مورد نظر باید API صرافی موردنظر را به ربات معاملهگر داد.
هر چند استفاده از Alpaca API برای راه اندازی رباتهای معاملهگر توصیه میشود، اما زمانی که میخواهید با پول واقعی معامله کنید، بسیار مراقب باشد، چرا که یک خطا در کدهای نوشته شده میتواند خطرات زیادی بر سرمایه شما داشته باشد.
بهترین کار برایتان این است که نوشتن آن را به برنامه نویسان خبره بسپارید و یا اینکه در دورههای معتبر برنامهنویسی پایتون شرکت نمایید.