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

news2024/11/26 20:43:20

背景 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 stock

stock_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 / loss
   rsi = 100 - (100 / (1 + rs))
   return rsi

stock_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 stock

stock_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 / loss
   rsi = 100 - (100 / (1 + rs))
   return rsi

stock_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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

秋日相邀!与 deepin 一起逛 OSCAR 开源产业大会开源市集

查看原文 10 月 16 日&#xff0c;“2024 OSCAR 开源产业大会”将在北京开幕。这场大会不仅是开源领域一年一度的盛会&#xff0c;更是一个汇集众多行业专家、技术领袖和开源爱好者的交流平台。大会将围绕开源技术的最新发展、产业应用、风险治理以及未来趋势等议题展开深入讨…

TCP连接重置,到底是怎么回事?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友 连接建立失败并不仅仅包含无响应问题&#xff0c;还有一种常见的情况&#xff0c;即RST&#xff08;Reset&…

kubernetes中微服务部署

微服务 问&#xff1a;用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 答&#xff1a;需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service&#xff0c;应用可以实现服务发现和负载均衡Service 默认只…

网优学习干货:王者荣耀游戏用户体验洞察及质差识别(1)

一、课题背景 二、课题目的 针对热点游戏&#xff08;王者荣耀&#xff09;进行业务质量评估&#xff0c;并通过对端到端定界分析&#xff0c;从无线、核心网、互联网维度识别影响用户体验关键因素&#xff0c;为游戏用户的体验优化提供依据。 三、课题实施进度 王者荣耀卡顿特…

基于STM32的智能门锁

基于STM32的智能门锁 在现代家居安全领域&#xff0c;智能门锁已经成为提升居住安全和便利性的关键技术之一。本文将介绍一个基于STM32微控制器的智能门锁项目&#xff0c;该项目集成了多种模块&#xff0c;包括步进电机、矩阵键盘、OLED显示屏、蓝牙模块和RFID刷卡模块&#…

小程序项目实践(一)--项目的初始化以及前期的准备工作

目录 1.起步 1.1 uni-app 简介 1.2 开发工具 1.2.1 下载 HBuilderX 1.2.2 安装 HBuilderX 1.2.3 安装 scss/sass 编译 1.2.4 快捷键方案切换 1.2.5 修改编辑器的基本设置 1.3 新建 uni-app 项目 1.4 目录结构 1.5 把项目运行到微信开发者工具 1.6 使用 Git 管理项目 …

DDIM扩散模型相关原理

DDIM扩散模型相关原理 Denoising Diffusion Implicit Models 论文下载地址&#xff1a;https://arxiv.org/abs/2010.02502

CentOS 安装 nvm+Node.js

CentOS 安装 nvmNode.js 文章目录 CentOS 安装 nvmNode.js一、安装nvm①&#xff1a;更新系统包②&#xff1a;安装依赖③&#xff1a;安装 NVM④&#xff1a;配置 NVM⑤&#xff1a;验证安装 二、安装 Node.js①&#xff1a;查看可安装版本②&#xff1a;安装&#xff08;指定…

腾讯广告-web转化数据api自归因对接记录

文章目录 前言一、参考文档记录二、使用步骤1.整体流程&#xff08;可以根据官方最新的文档来做&#xff09;2.关于上报代码参考3.关于uniapp网页在history模式下接收不到url参数的问题 总结 前言 项目中需要做对扫码加粉的监测&#xff0c;于是用到了腾讯广告的Web转化数据AP…

七载耕耘,全面盘点:Zabbix实战文章精华大全分享

在数字化转型的加速推进中&#xff0c;IT监控系统的稳定与高效性已成为企业IT运维战略的核心要素。Zabbix作为开源监控领域的佼佼者&#xff0c;凭借其卓越的功能集成、灵活的定制能力以及相对经济的运营成本&#xff0c;成功吸引了全球范围内众多企业的目光。 在国内&#xf…

zynq sdk裸机开发调试问题,不能进入中断问题

zynq sdk裸机开发总是时不时的就不能进入中断了, 找来找去的找不到原因. 后来我经过多次尝试. 将问题限位到非常小的范围. 只用了最普通的内部定时器, 开启中断也是偶尔会进去偶尔会进不去. 我的版本是 2018.3 后来多次尝试慢慢的摸索出经验规律, 只要修改过代码重新开始调试.就…

Math.js 基础使用:常用的数值操作

一. 引言 在进行数学计算和处理时&#xff0c;JavaScript 提供了许多强大的工具函数&#xff0c;其中最常用且广泛应用的就是 Math 对象中的函数。无论是进行简单的数值操作还是复杂的数学运算&#xff0c;Math 工具函数都能发挥出强大的作用。 本篇文章将带您探索 JavaScrip…

汽车3d动效的作用!云渲染实现3d动效

在汽车营销领域&#xff0c;3D动效技术以其独特的视觉冲击力和交互体验&#xff0c;正成为吸引消费者注意力的新利器。而云渲染技术的应用&#xff0c;更是让这些动效如虎添翼&#xff0c;实现了高效、低成本的3D视觉内容制作与分享。本文将探讨汽车3D动效的作用&#xff0c;并…

闯关leetcode——70. Climbing Stairs

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/climbing-stairs/description/ 内容 You are climbing a staircase. It takes n steps to reach the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you cl…

GPT 生成绘画_Java语言例子_超详细

基于spring ai &#xff1a;简化Java AI开发&#xff0c;提升效率与维护性 过去在使用Java编写AI应用时&#xff0c;主要困境在于缺乏统一的标准化封装&#xff0c;开发者需要针对不同的AI服务提供商查阅各自独立的文档并进行接口对接&#xff0c;这不仅增加了开发的工作量&am…

Halcon Tuple数组的增删查改

read_image (Image33, E:/Halcon数据/资源图片/33.png) dev_get_window (WindowHandle) dev_set_draw (margin) get_image_size (Image33, Width, Height) query_font (WindowHandle, Font) FontWithSize : Font[0]-30 set_font (WindowHandle, FontWithSize) 增加 NewTT1T2 …

学习如何将Spring Boot Jar包注册成Windows服务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在开发Spring Boot应用时&#xff0c;我们通常通过命令行或IDE手动启动项目。然而&#xff0c;在生产环境中&#xff0c;为了提升效率和稳定性&#xff0c;我们更希望应用能够自动启动&#xff0c;并且作为Wi…

2024年软件设计师中级(软考中级)详细笔记【5】软件工程基础知识上(分值10+)

第5章软件工程 目录 前言第5章 软件工程基础知识&#xff08;上&#xff09;&#xff08;分值10&#xff09;5.1 软件工程概述5.1.4 软件过程 5.2 软件过程模型5.2.1 瀑布模型 (Waterfall Model)5.2.2 增量模型5.2.3 演化模型5.2.4 喷泉模型&#xff08;Water Fountain Model&a…

java继承-cnblog

类的继承 继承本身 一个类要继承另一个类需要使用关键字extends 关键字extends的使用 class a extend b{}由于java只支持单继承&#xff0c;所以同时继承多个父类是错误的 在创造子类对象时&#xff0c;会先执行父类的构造方法&#xff0c;再执行子类的构造方法 举例说明 …

Linux 云服务器部署kafka(单机版)

进入对应安装目录 cd /usr/local/ 下载对应的安装包 wget https://downloads.apache.org/kafka/3.8.0/kafka_2.13-3.8.0.tgz 解压缩 tar zxf kafka_2.13-3.8.0 进入安装目录 cd /usr/local/kafka_2.13-3.8.0/ 修改配置文件 vim ./config/server.properties 主要修改…