本指南应作为构建你自己的第一个算法交易系统的指导手册
交易信号和指标
指标是信号的产生者。指标是一些信号发生器,可以在适当时机(股票,债券,期权等)向我们的交易系统发出警报。这可能意味着打开头寸,增加头寸,减少头寸,做空,对衍生工具采用某种策略等。长期以来,技术指标一直在算法交易系统中用于生成各类交易信号。算法交易者通常会构建和回溯指标,时间表和条目的数十种组合,以构建实际生成Alpha的信号。
You can get your API Token to start interacting with the API.
Using standard REST we’ll pass a ticker and our token and get back JSON:
开发者可以获取API令牌以开始与API进行交互。使用标准的REST,我们将传递代码和令牌,并返回JSON:
token = 'sp_znci3#zcnz49Kjznkkze'url = 'https://spawnerapi.com/bollinger/aapl/token'response = requests.get(url)print(response.json())
returns:
[{'upper’: [302.74, 307.65, (…)],
'lower’: [302.74, 288.01, (…)]}]
这些是布林带的上下带。
交易程序API中还有其他指标,例如RSI,Kelton Bands等。
使用此类API的好处是我们不必收集自己的数据。
我们可以跳过建立大量数据管道的操作,而直接访问我们的交易指标。
我们可以直观地看到上下布林带的样子:
bands = response.json()upper = bands[0]['upper']lower = bands[0]['lower']# Using Plotlyfig.add_trace(go.Scatter(x=date, y=upper, line_color='rgba(107, 191, 22,1)', name='Upper Band'))fig.add_trace(go.Scatter(x=date, y=lower, line_color='rgba(214, 14, 14,1)', name='Lower Band'))
上方和下方布林带的绘制是在股价的简单移动平均线(SMA)之上和之下的一个标准偏差处绘制的。这类波段对价格的波动较为敏感。一些交易者喜欢在价格触及下限时买入,从上限触及空头,并在价格触及移动平均线时退出任一头寸。
那么我们该如何在算法中实现该逻辑?让我们编写一些伪代码:
if price divided by lower band less than 5% different and price > lower band: long $1500if price divided by upper band less than 5% different and price < upper band: short $1500
然后,我们可以编写平仓交易头寸的逻辑。交易平仓逻辑可以变得非常复杂。例如,投资者可能希望逐渐获利,在某些条件下获利,比如说在头寸崩溃时下达止损单,等等……:
if position_value > 1550: exit position if position_value < 1450: exit position
让我们用Python编写此代码,看看如何执行订单。
订单执行系统
因此,我们收到了一个自己想要的交易信号,那么我们如何设置订单执行?我们将为此使用AlpacaAPI。羊驼(ALPACA) 有一个免费的交易API,通过它我们可以以编程方式建立我们的交易。除了以用户身份以外,我没有与羊驼毛有任何关联。但是我可以说,通过在各种经纪人中设置这些系统,Alpaca的使用要比主流经纪人提供的大多数API容易得多。我们可以构建一个API并为我们的交易系统(例如Flask App)公开端点。就本文而言,我们将所有内容保存在一个文件中。我们将使用计时器不断检查我们关注的股票行情的市场状况。如果其中任何一个触发我们的指标以发出信号,我们将执行交易!这是一个指标的例子。如果价格进入低于布林通道下限<0.5%的范围,我们将返回信号。
def indicator(ticker): # Get lower Bollinger Band url = 'https://spawnerapi.com/bollinger/' + ticker + '/' + token response = requests.get(url) bands = response.json() lower = bands[0]['lower'] moving_avg = bands[0]['average'] # get last value in list (latest band values) lower = lower[-1] moving_avg = moving_avg[-1] # Get real-time price quote url = 'https://spawnerapi.com/price/' + ticker + '/' + token response = requests.get(url) price = response.json()['price'] # Return signal or no signal if price > lower and ((price / lower)-1) < .005: return 'buy lower', moving_avg[-1], price else: return 'no signal', 'no avg', price
现在我们可以建立订单执行功能模组
#我们将传输一个报价(ticker),要购买的数量以及获利和止损限制。
def submit(ticker, quantity, profit_limit, stop_limit): api.submit_order( symbol=ticker, side='buy', type='market', qty=str(quantity), time_in_force='day', order_class='bracket', take_profit=dict( limit_price=str(profit_limit), ), stop_loss=dict( stop_price=str(stop_limit), limit_price=str(stop_limit), ) )
最后,我们将编写一个过于简化的函数(不健壮!),以便每隔几秒钟检查一次信号,并在信号触发时执行交易。注意:重要的是我们不要无限次触发购买订单, 信号可能会长时间保持高电平,因此请确保您摆脱了循环!实现此目的的一种方法是列出您正在观看的股票行情清单,每当触发购买时,都可以从列表中删除该股票行情。
由你决定!这是一个过于简化的功能,只会检查一次信号,执行并退出信号。
def timer(): x = True while x==True: print('Checking Signal...') signal, moving_avg, price = indicator('AAPL') if signal == 'buy lower': submit('AAPL', 5, moving_avg, (price-(price*.02))) print('Executing Trade.') # exit loop x = False else: print('No Signal.') time.sleep(2)
Let’s test!
自动交易系统…v0.1!
如果我们查看Alpaca门户网站,我们将看到已提交交易,并设置了我们的利润和止损限额。
订单历史风险管理将交易保持在设定的风险参数之内非常重要。这意味着要适当调整头寸大小,限制波动性等条件的暴露,最大程度地减少亏损,管理风险价值等……我们将在另一篇文章中讨论未来的风险。这些指标中的许多指标已在Spawner API中处于活动状态。
下期我们再来讨论回测系统。
联系客服