使用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 最近想学习一下量化金融,总算在盈透投资者教育(IBKRCampus)板块找到一篇比较好的算法交易入门教程。我在记录实践过程后,翻译成中文写成此csdn博客,分享给大家。 如果你的英语好可以直接看原文…...
点进HTML初步了解
写在前边 ##关于插件 ①简体中文 ②open-in-browser:自动在浏览器生成html页面; ③Auto Rename Tag:自动匹配标签; ④Live server:实现页面的实时刷新; ##关于快捷键: Ctrl / 用来注释…...
幸运的沈抖,进击的百度智能云
文|白 鸽 编|王一粟 AI对百度智能云的意义,可能远大于任何一家云计算厂商。 2022年5月,分管百度移动生态事业群组(MEG)的集团执行副总裁沈抖,转而担任百度智能云事业群组(ACG&…...
android广播实现PIN码设置
摘要:本文通过广播的方式调用系统设置PIN码的流程实现类似锁机的功能,可供开发人员在联网状态下后台推送消息进行锁机/解锁。有需要的同学可以参考PIN码的流程改为密码等其他形式。 1 定义一个广播接收器 广播action:android.intent.action…...
Mac 需要杀毒软件?
大部分 mac用户普遍认为 Apple mac 不受病毒和恶意软件的影响。这导致许多 Mac 用户误以为无需为 Mac 安装防病毒软件,但事实并非如此。 在这篇文章中,将深入探讨 Mac 安全性的细节,探索针对 Apple 设备的恶意软件类型,并为您…...
Java | Leetcode Java题解之第472题连接词
题目: 题解: 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图(CUDA Graphs)为CUDA引入了一种全新的工作提交模型。它允许将一系列操作(如内核启动)以图的形式表示,并通过依赖关系将这些操作连接起来。这种图的定义…...
【自注意力与Transformer架构在自然语言处理中的演变与应用】
背景介绍 在自然语言处理(NLP)领域,序列到序列(seq2seq)模型和Transformer架构的出现,极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络(RNN&…...
LabVIEW交直流接触器动态检测系统
LabVIEW软件与霍尔传感器技术结合的交直流接触器动态检测系统通过实时数据采集和处理技术,有效地测量并分析交直流接触器在吸合及吸持阶段的电流和电压变化,以及相应的功率消耗,从而优化电力和配电系统的性能和可靠性。 项目背景 交直流接触…...
Unity3D中基于四叉树的范围检测算法详解
在游戏开发中,碰撞检测和范围检测是常见的需求,尤其是在处理大量物体时,传统的暴力检测法(即每个物体与其他所有物体进行碰撞检测)会消耗大量的计算资源,导致性能下降。为了优化这一过程,四叉树…...
k8s网络通信
k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel,calico等 CNI插件存放位置:# cat /etc/cni/net.d/10-flannel.conflist 插件使用的解决方案如下 虚拟网桥,虚拟网卡,多个容器共用一个虚…...
07 欢乐的跳
题目: 代码: #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个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…...
论文翻译 | Fairness-guided Few-shot Prompting for LargeLanguage Models
摘要 大型语言模型已经显示出令人惊讶的执行上下文学习的能力,也就是说,这些模型可以通过对由几个输入输出示例构建的提示进行条件反射,直接应用于解决大量下游任务。然而,先前的研究表明,由于训练示例、示例顺序和提示…...
【分布式微服务云原生】战胜Redis脑裂:深入解析与解决方案
战胜Redis脑裂:深入解析与解决方案 摘要: Redis脑裂问题(Split Brain Syndrome)是分布式系统中的一个常见且复杂的问题,通常发生在网络分区或主节点出现问题时。本文将详细探讨脑裂的主要原因、导致的问题以及有效的解…...
数据治理与可持续发展:开启企业价值新模式——The Open Group 2024生态系统架构·可持续发展年度大会邀您共襄盛举
在当今数字化转型的浪潮中,企业正面临着前所未有的机遇和挑战。当数据治理遇上可持续发展,企业价值的新模式应运而生。那么,如何在数字化时代实现数据治理与可持续发展的融合,推动企业价值的飞跃? The Open Group 202…...
数据库的分类及主流数据库
一、数据库的分类 (一)关系型数据库(RDBMS) 定义与原理 关系型数据库是基于关系模型建立的数据库。它以表格(关系)的形式组织数据,每个表格包含行(记录)和列࿰…...
Qt C++设计模式->备忘录模式
备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获并保存对象的内部状态,以便在将来的某个时刻可以恢复到之前的状态。备忘录模式的核心是状态的保存和恢复,常用于实现撤销…...
Vue使用@别名替换后端ip地址
1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后,就可以导入nodejs的 path模块,在下面代码 import path…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
