我用 Python 构建了一个简单的交易算法,你也可以
我用 Python 构建了一个简单的交易算法,你也可以
钱使世界运转。或者至少这就是世界会告诉你的。在过去的几年里,世界各地的工作已经自动化或被机器取代,以实现利润最大化。华尔街的工人,例如股票经纪人,也经历过这种情况。计算机的实施和互联网的接入使传统的股票经纪人在很大程度上已经过时了。但是股票交易仍然需要一些人为因素。
有些人可能会根据感觉或直觉进行交易,这是机器目前无法复制的。其他人则根据一套严格的规则或准则进行交易,这些规则或准则可以被计算机完全复制,如果不是完全复制的话。所以今天,让我们尝试通过用 Python 编码来复制一组简单的规则。我们将编写的代码将使我们能够自动交易股票,而无需观察股票价格或股票图表。这不是很神奇吗?
现在,这种为股票交易制定一套规则或指导方针的尝试被称为—— 算法交易 .使用这种方法的交易者被归类为量化交易者( 量化 ) 从事量化金融业务的交易员。算法交易需要对股票市场有所了解,以便更好地理解某些策略是如何应用的。没有必要像沃伦巴菲特那样了解市场来制作交易算法,但绝对没有坏处。考虑到这一点,让我们快速解释一些市场概念和定义。
股票交易策略
首先,让我们定义股票市场交易的两种主要方法:买入 (渴望) 和销售( 做空 )。当你认为股票会上涨时你会买入,当你认为股票会下跌时你会做空。这种买空活动被区分为“ 看涨 '(股价会上涨)或' 看跌 '(股价会下跌)。在股票市场交易方面,实施了许多不同的策略。一种策略,称为 技术分析 , 基于对股票价格、交易量、高点、低点等的多次计算得出的交易信号和模式。下面是一个示例:
使用信号交叉和趋势突破的 TWMJF 技术分析。
一些人批评这种策略,因为他们认为技术分析在确定未来方面与十二生肖一样有效。但其他人对此深信不疑,并引领了成功的交易生涯。
在交易中实施的另一种策略称为—— 基本面分析 .简而言之,该策略观察股票的财务报表和与其竞争对手相比的当前价值。交易者将看涨或看跌,这取决于他们是否认为股票相对于他们当前的行业和市场被低估或高估。
这就是我们将要介绍的有关股票市场的全部内容。研究市场和交易策略需要数月甚至数年的审查。如果您是想要交易的初学者,请点击 这里 作为一个简单的起点。现在,我们将继续使用 Python 代码自动化股票交易策略。
宽托邦
为了开始,我们需要访问这个站点: Quantopian.com 使用他们的平台,这有助于简化流程。在那里,您将能够测试不同的策略并练习一些针对市场的编程技能,而不会冒使用实际资金的风险。您必须创建一个免费帐户才能使用他们自己独特的 IDE,该 IDE 专门为回测不同的市场策略而校准。创建帐户后,请通过单击导航到创建新算法 ** 研究——算法——新算法。** 一旦你发现自己在一个看起来像下面的页面,那么我们就可以开始了。
The starting template for creating a new algorithm.
为了简单起见,我们将编写一个基本的交易策略,涉及两个简单的移动平均线的交叉:50 天和 200 天移动平均线。一个简单的移动平均线是通过平均最近的 ñ 天收盘价。我们将在 50 天移动平均线超过 200 天移动平均线时买入股票,并在相反的情况下做空。该策略如下所示:
Simple Moving Average Stock Strategy
现在,此特定策略并未被认可为合法策略,如果您选择为自己实施此策略,则您对所产生的任何资本损失负主要责任。我们将仅将此策略用作算法交易的示例。一旦您对 Quantopian 编码感到满意,请随意使用您可能知道或以后发现的任何其他策略。
好的,既然我们有了一个策略,我们就可以开始算法的编码方面了。 Quantopian 使用其 IDE 独有的许多不同库,因此我们将在必要时解释它们的差异。但是,我们将无法涵盖您可能对平台提出的所有问题,因此请探索他们的 帮助页面 需要的时候。
交易算法
让我们从导入我们需要的库开始:
与 Quantopian 的 IDE 的主要区别在于某些功能的运行方式。您仍然可以像平常一样调用函数,但其他函数需要安排在市场期间的特定时间运行。
初始化函数
The Initialize function
在这里,我们有 初始化()
功能。在这个函数中,我们将使用 algo.schedule_function()
安排三个功能:
贸易()
退出交易()
记录变量()
其他论点:
algo.date_rules.every_day()
algo.time_rules.market_close()
指定函数何时运行。这些功能安排在这些时间的原因是为了解决任何潜在的杠杆问题。杠杆在我们的算法中扮演着重要的角色,稍后将进行解释。
交易功能
所以现在我们有一个 初始化()
将运行我们的算法的函数,我们可以继续 贸易()
自动交易我们想要的股票的功能。
但首先我们必须解释我们如何检索我们想要的股票。在 Quantopian 中,股票被分配了唯一的 id 值。要访问这些股票,我们呼吁 西德()
功能,输入股票代码,将出现一个下拉菜单。请参阅下文以查看分配给 TSLA 的 ID 号。
TSLA and its sid #
对于我们的交易功能,我们将列出我们想从中挑选的股票。这些股票是:TSLA、DIS、AAPL 和 SPY。每个都有自己的 sid #。有一些方法可以获取更多股票并过滤掉选定的股票,但这需要另一个功能。
使用我们的股票列表,我们将使用“for”循环遍历它们。在“for”循环中采取的步骤是:
- 获取每只股票的收盘价历史。
- 计算它们的 50 天和 200 天移动平均线。
- 创建一个真/假语句来确定交叉点。
- 计算杠杆限额并将其设置为另一个 True/False 语句。
- 使用创建条件语句
open_lev
, 和看涨交叉
或者看跌交叉
. - 满足所有条件后,我们使用
order_target_percent(库存,0.25)
用该股票填充我们投资组合的 25%。 (我们将购买或卖空股票的百分比设置为负数或正数)。
The Trading function
现在每个步骤都需要特定的 Quantopian 方法和函数。所以请参考 帮助页面 再次进行详细说明。接下来,我们将解释交叉信号和开放杠杆背后的概念推理。
为了确定 50 日均线是否以看涨的方式穿过 200 日均线,我们将 50 日均线设置为小于 200 日均线,两者均从前一天计算。然后,我们将当前 50 天 MA 设置为大于当前 200 天 MA。通过将其设置为条件语句,我们可以捕获移动平均线的交叉点。
现在关于公开杠杆,它的重要性被考虑在内,因为杠杆决定了我们是用自己的钱还是借钱。借钱的结果可以极大地改变我们的交易结果。之前编码的公式和时间表允许我们在不超过我们自己的杠杆或现金限额的情况下进行交易。
退出交易功能
现在下一个功能, 退出交易()
, 与我们的交易功能非常相似。唯一的区别是首先检查我们是否有任何未平仓头寸以及是什么样的头寸(多头或空头)。
The exiting trade function
如您所见,两者之间没有太大区别 退出交易()
和 贸易()
.这个退出交易功能会重复之前的大部分计算和条件,以便在移动平均线与我们相交时平仓。
接下来,让我们完成代码 记录变量()
函数来跟踪我们认为必要的一些变量。
在这里我们将 记录()
我们的杠杆以及我们开仓的数量。我们希望杠杆率不会大幅超过 1。未平仓头寸不应超过 4,因为我们仅将 25% 的投资组合用于我们交易的每只股票。
运行回测
最后,将日期和起始资本设置为与下面的匹配。我们不会进行完整的回测,因为没有必要。完整的回测将提供有关编码策略的更多信息,但目前还不需要。
Set to 7 years of backtesting with a starting amount of $10,000
点击按钮 构建算法, 它将运行代码,然后您将得到如下页面:
Results of our coded strategy
伟大的!我们已经成功地回测了我们的第一个交易算法。我们成功地将杠杆限制为 1(尽管有一点余地,这很好)并且交易头寸从未超过 4。随意更改一些代码,看看它是否会显着影响结果。
结束的想法
这种交易策略非常简单且非常常见,可以与其他策略结合使用以提高其整体效果。看起来这种策略非常成功,但请注意,与其他股票相比,我们交易的股票本质上是稳定且有利可图的。此外,作为确定其有效性的一般规则,如果交易策略能够超过 SPY 的回报,那么它是值得注意的。然而,这种策略无法显着超过 SPY 的回报。如果我们要交易不稳定的股票,那么我们可能会看到截然不同的结果。
到目前为止,您应该对交易算法的内部运作有了更好的理解,即使这个算法是基于简单的策略。如果你觉得这太难了,那么你也可以探索 Quantopian's 教程页面 .但如果你觉得这太容易了,那就继续探索吧 Quantopian 的帮助页面 并尝试创建一种新的改进算法。也许那时你可以用你的新交易算法打败华尔街!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明