当前位置: 首页 > news >正文

使用Python编写你的第一个算法交易程序

背景 Background

​ 最近想学习一下量化金融,总算在盈透投资者教育(IBKRCampus)板块找到一篇比较好的算法交易入门教程。我在记录实践过程后,翻译成中文写成此csdn博客,分享给大家。

​ 如果你的英语好可以直接看原文。原文在数据准备阶段,采用了 pandas_datareader.data 读取网络数据,实际中出现了很多问题,我换成了 yfinance。可以参考文末完整代码。

参考资料:https://www.interactivebrokers.com/campus/ibkr-quant-news/basic-trading-algorithms-in-python/

算法交易简介 Introduction

​ 算法交易的兴起改变了金融市场,让交易者能够在数据驱动下做出精确的决策。具备 Pandas 和 NumPy 等强大第三方库的 Python 语言是开发交易算法的首选。本文将指导您利用这些库在 Python 中创建基本的交易算法。

​ 算法交易,指的是使用远超过人类能力的计算机程序,去提升交易速度和频率,这些算法通过分析市场数据,观察交易时机,基于预先给定的规则去执行交易命令。

​ 算法交易有一些核心优势,包括

  • 速度:指令可以在低于百万分之一秒的时间内运行

  • 准确度:减少人类的操作误差

  • 连续性:持续操作,不会像人类一样感到疲倦

为什么使用 Python 进行交易 Why Use Python

Python的简洁语法和灵活性(支持大量不同种类的第三方库),使其成为交易算法的理想语言。这篇文章主要聚焦于两个主要的第三方库:Pandas和NumPy。

  • Pandas:对于数据管理和分析,提供了一系列数据结构和函数,可以毫不费力与这些结构化数据协同工作

  • NumPy:对于数学计算,处理巨大的、多维的数组和矩阵,有一系列配套的数学函数。

其他有用的Python库包括:

  • scikit-learning:用于在算法交易中加入机器学习内容
  • matplotlib:用于过程和结构的数据可视化

准备开发环境 Environment

创建 Conda 环境

在这里插入图片描述
在这里插入图片描述

安装 Pandas 和 NumPy 库

在这里插入图片描述
在这里插入图片描述

数据获取和预处理 Data preparation

import yfinance as yf
import datetime
import numpy as np
# data preparation
# Define the start and end date
start = datetime.datetime(2020, 1, 1)
end = datetime.datetime(2022, 1, 1)# Fetch data for a particular stockstock_data = yf.download('AAPL', start='2022-01-01', end='2022-12-31')
print(stock_data.head())

计算技术指标 Technical Indicators

移动均线 Moving Average(MA)

# technical indicator
# Simple Moving Average (SMA)
stock_data['SMA_20'] = stock_data['Adj Close'].rolling(window=20).mean()
# Exponential Moving Average (EMA)
stock_data['EMA_20'] = stock_data['Adj Close'].ewm(span=20, adjust=False).mean()

相对力量指数 Relative Strength Index(RSI)

# RSI
def calculate_rsi(data, window):delta = data['Adj Close'].diff(1)gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()rs = gain / lossrsi = 100 - (100 / (1 + rs))return rsistock_data['RSI_14'] = calculate_rsi(stock_data, 14)

一个基础的交易算法 A Basic Trading Algorithm

定义策略 Define the Strategy

# Define a strategy
# Calculate longer-term SMA
stock_data['SMA_50'] = stock_data['Adj Close'].rolling(window=50).mean()# Create buy/sell signals
stock_data['Signal'] = 0
stock_data.loc[stock_data.index[20]:, 'Signal'] = np.where(stock_data.loc[stock_data.index[20]:, 'SMA_20'] > stock_data.loc[stock_data.index[20]:, 'SMA_50'], 1, 0)
stock_data['Position'] = stock_data['Signal'].diff()

回测策略 Backtesting the Strategy

# Backtest
initial_capital = 100000.0
stock_data['Holdings'] = stock_data['Adj Close'] * stock_data['Position'].cumsum()
stock_data['Cash'] = initial_capital - (stock_data['Adj Close'] * stock_data['Position']).cumsum()
stock_data['Total'] = stock_data['Cash'] + stock_data['Holdings']

分析结果 Analyzing the Results

# Analizing results
cumulative_returns = (stock_data['Total'].iloc[-1] - initial_capital) / initial_capital
average_daily_returns = stock_data['Returns'].mean()
volatility = stock_data['Returns'].std()print("Cumulative Returns: {:.2f}%".format(cumulative_returns * 100))
print("Average Daily Returns: {:.4f}".format(average_daily_returns))
print("Volatility: {:.4f}".format(volatility))

在这里插入图片描述

结论 Conclusion

​ 利用Python的Pandas和NumPy库,开发基础交易算法,是一个有利的手段,去驱使数据为交易决定增加信息。这篇文章提供了一个基础的指导去准备数据、计算技术指标、完成一个简单的交易策略和评估其表现。

​ 当你继续探索和试图打磨你的算法的时候,记住金融市场是复杂和持续变化的。

​ 不断的学习和适应市场环境,是在算法交易中取得成功的关键。

完整代码 Code

import yfinance as yf
import datetime
import numpy as np
# data preparation
# Define the start and end date
start = datetime.datetime(2020, 1, 1)
end = datetime.datetime(2022, 1, 1)# Fetch data for a particular stockstock_data = yf.download('AAPL', start='2022-01-01', end='2022-12-31')
print(stock_data.head())# technical indicator
# Simple Moving Average (SMA)
stock_data['SMA_20'] = stock_data['Adj Close'].rolling(window=20).mean()# Exponential Moving Average (EMA)
stock_data['EMA_20'] = stock_data['Adj Close'].ewm(span=20, adjust=False).mean()# RSI
def calculate_rsi(data, window):delta = data['Adj Close'].diff(1)gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()rs = gain / lossrsi = 100 - (100 / (1 + rs))return rsistock_data['RSI_14'] = calculate_rsi(stock_data, 14)# Define a strategy
# Calculate longer-term SMA
stock_data['SMA_50'] = stock_data['Adj Close'].rolling(window=50).mean()# Create buy/sell signals
stock_data['Signal'] = 0
stock_data.loc[stock_data.index[20]:, 'Signal'] = np.where(stock_data.loc[stock_data.index[20]:, 'SMA_20'] > stock_data.loc[stock_data.index[20]:, 'SMA_50'], 1, 0)
stock_data['Position'] = stock_data['Signal'].diff()
# Backtest
initial_capital = 100000.0
stock_data['Holdings'] = stock_data['Adj Close'] * stock_data['Position'].cumsum()
stock_data['Cash'] = initial_capital - (stock_data['Adj Close'] * stock_data['Position']).cumsum()
stock_data['Total'] = stock_data['Cash'] + stock_data['Holdings']# Calculate returns
stock_data['Returns'] = stock_data['Total'].pct_change()# Print final portfolio value
print("Final Portfolio Value: ${}".format(stock_data['Total'].iloc[-1]))# Analizing results
cumulative_returns = (stock_data['Total'].iloc[-1] - initial_capital) / initial_capital
average_daily_returns = stock_data['Returns'].mean()
volatility = stock_data['Returns'].std()print("Cumulative Returns: {:.2f}%".format(cumulative_returns * 100))
print("Average Daily Returns: {:.4f}".format(average_daily_returns))
print("Volatility: {:.4f}".format(volatility))

相关文章:

使用Python编写你的第一个算法交易程序

背景 Background ​ 最近想学习一下量化金融&#xff0c;总算在盈透投资者教育&#xff08;IBKRCampus&#xff09;板块找到一篇比较好的算法交易入门教程。我在记录实践过程后&#xff0c;翻译成中文写成此csdn博客&#xff0c;分享给大家。 ​ 如果你的英语好可以直接看原文…...

点进HTML初步了解

写在前边 ##关于插件 ①简体中文 ②open-in-browser&#xff1a;自动在浏览器生成html页面&#xff1b; ③Auto Rename Tag&#xff1a;自动匹配标签&#xff1b; ④Live server&#xff1a;实现页面的实时刷新&#xff1b; ##关于快捷键&#xff1a; Ctrl / 用来注释…...

幸运的沈抖,进击的百度智能云

文&#xff5c;白 鸽 编&#xff5c;王一粟 AI对百度智能云的意义&#xff0c;可能远大于任何一家云计算厂商。 2022年5月&#xff0c;分管百度移动生态事业群组&#xff08;MEG&#xff09;的集团执行副总裁沈抖&#xff0c;转而担任百度智能云事业群组&#xff08;ACG&…...

android广播实现PIN码设置

摘要&#xff1a;本文通过广播的方式调用系统设置PIN码的流程实现类似锁机的功能&#xff0c;可供开发人员在联网状态下后台推送消息进行锁机/解锁。有需要的同学可以参考PIN码的流程改为密码等其他形式。 1 定义一个广播接收器 广播action&#xff1a;android.intent.action…...

Mac 需要杀毒软件?

大部分 mac用户普遍认为 Apple mac 不受病毒和恶意软件的影响。这导致许多 Mac 用户误以为无需为 Mac 安装防病毒软件&#xff0c;但事实并非如此。 在这篇文章中&#xff0c;将深入探讨 Mac 安全性的细节&#xff0c;探索针对 Apple 设备的恶意软件类型&#xff0c;并为您…...

Java | Leetcode Java题解之第472题连接词

题目&#xff1a; 题解&#xff1a; class Solution {Trie trie new Trie();public List<String> findAllConcatenatedWordsInADict(String[] words) {List<String> ans new ArrayList<String>();Arrays.sort(words, (a, b) -> a.length() - b.length(…...

CUDA Graphs学习与实验

CUDA Graphs学习与实验 一.参考链接二.测试方案三.测试代码 CUDA图&#xff08;CUDA Graphs&#xff09;为CUDA引入了一种全新的工作提交模型。它允许将一系列操作&#xff08;如内核启动&#xff09;以图的形式表示&#xff0c;并通过依赖关系将这些操作连接起来。这种图的定义…...

【自注意力与Transformer架构在自然语言处理中的演变与应用】

背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;序列到序列&#xff08;seq2seq&#xff09;模型和Transformer架构的出现&#xff0c;极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络&#xff08;RNN&…...

LabVIEW交直流接触器动态检测系统

LabVIEW软件与霍尔传感器技术结合的交直流接触器动态检测系统通过实时数据采集和处理技术&#xff0c;有效地测量并分析交直流接触器在吸合及吸持阶段的电流和电压变化&#xff0c;以及相应的功率消耗&#xff0c;从而优化电力和配电系统的性能和可靠性。 项目背景 交直流接触…...

Unity3D中基于四叉树的范围检测算法详解

在游戏开发中&#xff0c;碰撞检测和范围检测是常见的需求&#xff0c;尤其是在处理大量物体时&#xff0c;传统的暴力检测法&#xff08;即每个物体与其他所有物体进行碰撞检测&#xff09;会消耗大量的计算资源&#xff0c;导致性能下降。为了优化这一过程&#xff0c;四叉树…...

k8s网络通信

k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel&#xff0c;calico等 CNI插件存放位置&#xff1a;# cat /etc/cni/net.d/10-flannel.conflist 插件使用的解决方案如下 虚拟网桥&#xff0c;虚拟网卡&#xff0c;多个容器共用一个虚…...

07 欢乐的跳

题目&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define M 1000005int main() {int n;cin>>n;int a[M]{0};for(int i0;i<n;i){cin>>a[i];}int c[M]{0};for(int i1;i<n;i){c[i]abs(a[i]a[i1]);}sort(c1,cn); // 注意f…...

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【262-271】

文章目录 262. 回顾上一章内容263. IDEA介绍263.1 IDEA 介绍263.2 Eclipse 介绍 264. IDEA下载265. IDEA使用1257. IDEA使用2268. IDEA使用3268. 269. 270. IDEA快捷键1,2,3271. IDEA模板 262. 回顾上一章内容 看视频 263. IDEA介绍 263.1 IDEA 介绍 IDEA 全称 IntelliJ ID…...

GNU链接器(LD):输入分区的垃圾回收及保护处理(KEEP命令)介绍

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…...

论文翻译 | Fairness-guided Few-shot Prompting for LargeLanguage Models

摘要 大型语言模型已经显示出令人惊讶的执行上下文学习的能力&#xff0c;也就是说&#xff0c;这些模型可以通过对由几个输入输出示例构建的提示进行条件反射&#xff0c;直接应用于解决大量下游任务。然而&#xff0c;先前的研究表明&#xff0c;由于训练示例、示例顺序和提示…...

【分布式微服务云原生】战胜Redis脑裂:深入解析与解决方案

战胜Redis脑裂&#xff1a;深入解析与解决方案 摘要&#xff1a; Redis脑裂问题&#xff08;Split Brain Syndrome&#xff09;是分布式系统中的一个常见且复杂的问题&#xff0c;通常发生在网络分区或主节点出现问题时。本文将详细探讨脑裂的主要原因、导致的问题以及有效的解…...

数据治理与可持续发展:开启企业价值新模式——The Open Group 2024生态系统架构·可持续发展年度大会邀您共襄盛举

在当今数字化转型的浪潮中&#xff0c;企业正面临着前所未有的机遇和挑战。当数据治理遇上可持续发展&#xff0c;企业价值的新模式应运而生。那么&#xff0c;如何在数字化时代实现数据治理与可持续发展的融合&#xff0c;推动企业价值的飞跃&#xff1f; The Open Group 202…...

数据库的分类及主流数据库

一、数据库的分类 &#xff08;一&#xff09;关系型数据库&#xff08;RDBMS&#xff09; 定义与原理 关系型数据库是基于关系模型建立的数据库。它以表格&#xff08;关系&#xff09;的形式组织数据&#xff0c;每个表格包含行&#xff08;记录&#xff09;和列&#xff0…...

Qt C++设计模式->备忘录模式

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获并保存对象的内部状态&#xff0c;以便在将来的某个时刻可以恢复到之前的状态。备忘录模式的核心是状态的保存和恢复&#xff0c;常用于实现撤销…...

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API&#xff0c;并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后&#xff0c;就可以导入nodejs的 path模块&#xff0c;在下面代码 import path…...

告别手动重复!用Python+ArcPy实现多要素批量裁剪年度影像的保姆级教程

PythonArcPy自动化遥感影像裁剪&#xff1a;从原理到实战的完整解决方案 遥感影像处理是GIS工程师的日常必修课。每当拿到新一年的土地利用数据或行政区划影像时&#xff0c;最头疼的莫过于要为每个行政单元单独裁剪每年的数据。我曾花费整整一周时间手动处理30个乡镇5年的NDVI…...

[Android] 鲁迅全集 7.2.0

[Android] 鲁迅全集 7.2.0 链接&#xff1a;https://pan.xunlei.com/s/VOp2ylhHGYlTTbQ2rTOhsk3RA1?pwdh6tu# 鲁迅作品全集&#xff01;&#xff01;&#xff01;...

期权到期日别慌!手把手教你搞定上交所股票期权的行权与交割(附避坑清单)

期权到期日实战指南&#xff1a;从行权准备到交割避坑全流程解析 手机屏幕上的红色倒计时提醒着期权合约即将到期&#xff0c;作为刚接触期权交易不久的新手&#xff0c;此刻最需要的不再是复杂的概念解释&#xff0c;而是一份能握在手中的应急操作清单。本文将用最直白的语言拆…...

【Skills开发实战指南】第01篇:Skills开发入门:AI助手的能力扩展革命

快速导航 读完本文&#xff0c;你将获得&#xff1a; ✅ 深入理解Skills是什么以及为什么需要它✅ 掌握Skills在AI编程工具中的核心价值✅ 了解Skills的完整生态和应用场景✅ 明确Skills开发的学习路径和资源✅ 准备好开始你的第一个Skills开发项目 一、Skills是什么&#xf…...

STM32开发方式对比与HAL库实战指南

1. STM32开发方式概述作为一名嵌入式开发者&#xff0c;我亲历了STM32开发方式的变迁。从早期的寄存器操作到标准库&#xff0c;再到如今主流的HAL库&#xff0c;每种方式都有其独特的优势和适用场景。对于刚接触STM32的新手来说&#xff0c;选择合适的开发方式往往是个令人困惑…...

GyverTimers:ATmega硬件定时器寄存器级精准控制

1. GyverTimers 库深度技术解析&#xff1a;面向 ATmega328P 与 ATmega2560 的硬件定时器全功能控制 GyverTimers 是一款专为 AVR 微控制器设计的轻量级、高精度硬件定时器控制库&#xff0c;其核心价值在于 绕过 Arduino 框架的抽象层&#xff0c;直接操作 ATmega 系列 MCU 的…...

大厂疯抢!AI Agent开发岗要求速览+进阶学习路线图,速收藏!

文章分析了大厂AI Agent开发岗位的核心要求&#xff0c;包括扎实的后端开发基础、AI知识储备、主流框架掌握等。文章强调AI应用开发与后端开发并非对立&#xff0c;而是相辅相成&#xff0c;并提供了详细的学习路线图&#xff0c;涵盖基础阶段、AI知识入门、实践项目、深化与拓…...

AI辅助开发新范式:让快马AI优化你的17.143.cv模型推理管线

AI辅助开发新范式&#xff1a;让快马AI优化你的17.143.cv模型推理管线 最近在做一个实时视频流人物动作识别的项目&#xff0c;用到了17.143.cv库中的姿态估计模型。开发过程中遇到了两个比较棘手的问题&#xff1a;一是模型在某些帧上的推理速度不够理想&#xff0c;影响了实…...

从概念到上线:基于快马平台构建一个功能完备的qun329实战应用

今天想和大家分享一个实战项目经验——如何从零开始构建一个功能完备的qun329群组应用。这个项目不仅包含了基础的群聊功能&#xff0c;还实现了消息状态同步、文件共享等生产级需求&#xff0c;整个过程在InsCode(快马)平台上完成&#xff0c;特别适合想快速验证复杂场景的开发…...

汇川小型机 H5U编写程序 设备采用回转hu小型机编写程序不含的硬件配置有ECT的总线

汇川小型机 H5U编写程序 设备采用回转hu小型机编写程序不含的硬件配置有ECT的总线&#xff0c;包括汇川660系列伺服驱动器以及Io模块。 设备程序分段明确采用梯形图编写更加方便&#xff0c;直观&#xff0c;易懂各个伺服轴密切配合&#xff0c;实现收放卷pid调节&#xff0c;以…...