交易系统
让我们划分算法交易系统或自动交易系统的某些部分。我们将逐步介绍它们,然后在文章末尾展示一个完成的示例。
算法交易系统的一些关键要素:
1. 信号和指标
2. 交易执行系统
3. 回测模组
交易信号和指标
指标是信号的产生者。指标是一些信号发生器,可以在适当时机(股票,债券,期权等)向我们的交易系统发出警报。这可能意味着打开头寸,增加头寸,减少头寸,做空,对衍生工具采用某种策略等。长期以来,技术指标一直在算法交易系统中用于生成各类交易信号。算法交易者通常会构建和回溯指标,时间表和条目的数十种组合,以构建实际生成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 Plotly
fig.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 $1500
if 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中处于活动状态。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/494681
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!