用pandas做简单策略回测

news2024/12/24 8:45:38

一,RSI策略 

        数据:

        代码

import pandas as pd

# 读取贵州茅台股票历史交易数据
df = pd.read_csv('贵州茅台股票历史交易数据.csv')
missing_values = df.isnull().sum()

# print("缺失值数量:")
# print(missing_values)

# 计算RSI指标
def calculate_rsi(data, window=14):
    delta = data['Close'].diff()
    gain = delta.copy()
    loss = delta.copy()
    gain[gain < 0] = 0
    loss[loss > 0] = 0
    avg_gain = gain.rolling(window).mean()
    avg_loss = abs(loss.rolling(window).mean())
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

# 调用calculate_rsi函数计算RSI指标
df['RSI'] = calculate_rsi(df)
# print(df)

#  交易信号生成
df['Signal'] = 0
df.loc[df['RSI'] > 70, 'Signal'] = -1
df.loc[df['RSI'] < 30, 'Signal'] = 1
# 打印df对象
# print(df)

### 绘制RSI指标曲线
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 设置负号显示
rsi = calculate_rsi(df)  # 计算RSI指标
plt.figure(figsize=(12, 6))
plt.plot(df.index, rsi, label='RSI')
plt.title('RSI指标')
plt.xlabel('日期')
plt.ylabel('RSI')
plt.legend()
plt.grid(True)
plt.show()

###  绘制K线图
import mplfinance as mpf
plt.rcParams['font.family'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 设置负号显示
# 重新加载数据
df = pd.read_csv('贵州茅台股票历史交易数据.csv')


# 创建日期索引
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)


market_colors = mpf.make_marketcolors(up='red', down='green')
my_style = mpf.make_mpf_style(marketcolors=market_colors)
# 绘制K线图
mpf.plot(df, type='candle',
         figsize=(10, 6),
         mav=(10, 20),
         volume=True,
         style=my_style)


### 绘制价格和交易信号图表
plt.rcParams['font.family'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 设置负号显示

# 读取贵州茅台股票历史交易数据
df = pd.read_csv('贵州茅台股票历史交易数据.csv')

# 创建日期索引
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 计算RSI指标
def calculate_rsi(data, window=14):
    delta = data['Close'].diff()
    gain = delta.copy()
    loss = delta.copy()
    gain[gain < 0] = 0
    loss[loss > 0] = 0
    avg_gain = gain.rolling(window).mean()
    avg_loss = abs(loss.rolling(window).mean())
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

# 计算RSI指标
df['RSI'] = calculate_rsi(df)
#  交易信号生成
df['Signal'] = 0
df.loc[df['RSI'] > 70, 'Signal'] = -1
df.loc[df['RSI'] < 30, 'Signal'] = 1

# 绘制价格和交易信号图表
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Close'], label='Close Price')
plt.scatter(df[df['Signal'] == 1].index, df[df['Signal'] == 1]['Close'], color='green', marker='^', label='Buy Signal')
plt.scatter(df[df['Signal'] == -1].index, df[df['Signal'] == -1]['Close'], color='red', marker='v', label='Sell Signal')
plt.title('贵州茅台股票价格和交易信号')
plt.xlabel('日期')
plt.ylabel('股价')
plt.legend()
plt.grid(True)
plt.show()

        图表

二,RSI策略 

    数据 

        0601857股票历史交易数据.csv

    代码

import pandas as pd
import numpy as np

# ================================数据处理============================================
# 原始文件
inputfile = '0601857股票历史交易数据.csv'
# 目标文件
outfile = '0601857股票历史交易数据(清洗后).csv'

# 打开原始文件和目标文件
with open(inputfile, 'r') as input_file, open(outfile, 'w') as output_file:
    # 逐行读取原始文件
    for line in input_file:
        # 去除行末的换行符
        line = line.rstrip('\n')
        # 判断是否为空行
        if line:
            # 写入非空行到目标文件
            output_file.write(line + '\n')

print('处理完成。')

# 数据文件
f = '0601857股票历史交易数据(清洗后).csv'
# 读取股票历史交易数据
df = pd.read_csv(f, encoding='gbk', index_col='日期', parse_dates=True)

# 移除“股票代码”和“名称”列
df = df.drop(['股票代码', '名称'], axis=1)

# 筛选出2021年的数据
df = df.query('日期.dt.year == 2021')
# 打印前10条数据
# print(df.head(10))

# 重新命名列名
column_mapping = {
    '日期': 'Date',
    '收盘价': 'Close',
    '最高价': 'High',
    '最低价': 'Low',
    '开盘价': 'Open',
}
df = df.rename(columns=column_mapping)
# 打印前10条数据
# print(df.head(10))

# ===================================海龟策略===================================================
# 设置移动平均线窗口期
ma_short_window = 20
ma_long_window = 50

# 计算移动平均线
df['MA20'] = df['Close'].rolling(window=ma_short_window, min_periods=1).mean()
df['MA50'] = df['Close'].rolling(window=ma_long_window, min_periods=1).mean()

# 移除NaN值
df.dropna(subset=['MA50'], inplace=True)


# 定义海龟策略函数
def turtle_trading_strategy(df):
    # 从策略参数
    initial_capital = 1000000  # 初始资金
    unit_size = 100  # 每次交易量

    # 确定买入和卖出信号
    df['Buy_Signal'] = df['Close'].gt(df['MA20']) & df['Close'].shift(1).lt(df['MA20'].shift(1))
    df['Sell_Signal'] = df['Close'].lt(df['MA20']) & df['Close'].shift(1).gt(df['MA20'].shift(1))

    # 计算持仓量和资金曲线
    df['Position'] = 0
    df.loc[df['Buy_Signal'], 'Position'] = unit_size
    df.loc[df['Sell_Signal'], 'Position'] = -unit_size
    df['Total_Value'] = df['Position'] * df['Close'].shift(-1)

    # 计算每日盈亏和总盈亏
    # df['Daily_Return'] = df['Total_Value'].pct_change()
    df['Daily_Return'] = df['Total_Value'].pct_change(fill_method=None)

    # 清除NaN和inf值
    df['Daily_Return'].replace([np.inf, -np.inf], np.nan, inplace=True)
    df['Daily_Return'].fillna(0, inplace=True)

    df['Cumulative_Return'] = (df['Daily_Return'] + 1).cumprod()

    # 计算总收益和平均收益
    cumulative_returns = df['Cumulative_Return'].iloc[-1] * initial_capital - initial_capital
    total_trades = df[df['Position'] != 0].shape[0]
    average_return = cumulative_returns / total_trades

    return cumulative_returns, average_return


print(df)

# 调用turtle_trading_strategy函数
total_profit, average_return = turtle_trading_strategy(df)

print(f"总交易次数:{df[df['Position'] != 0]['Position'].count()}")
print(f"总盈利:{total_profit:.2f}元")
print(f"平均收益:{average_return:.2f}元/交易")

# 绘图
import mplfinance as mpf
import matplotlib.pyplot as plt

# ==================绘制K线图和移动平均线图========================
plt.rcParams['font.family'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 设置负号显示

# 添加移动平均线参数
ap0 = [
    mpf.make_addplot(df['MA20'], color="b", width=1.5),
    mpf.make_addplot(df['MA50'], color="y", width=1.5),
]

market_colors = mpf.make_marketcolors(up='red', down='green')
my_style = mpf.make_mpf_style(marketcolors=market_colors)

# 绘制K线图
mpf.plot(df, type='candle',
         figratio=(10, 4),
         mav=(ma_short_window, ma_long_window),
         show_nontrading=True,
         addplot=ap0,
         style=my_style)

mpf.show()

# ==================绘制交易信号图========================
# 设置图表大小
plt.figure(figsize=(10, 6))
plt.rcParams['font.family'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 设置负号显示

plt.plot(df['Close'], label='收盘价')
plt.plot(df.loc[df['Buy_Signal'], 'Close'], 'o', markersize=8, color='green', label='买入信号')
plt.plot(df.loc[df['Sell_Signal'], 'Close'], 'o', markersize=8, color='red', label='卖出信号')
plt.title('交易信号')
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend()

# 调整 x 轴标签倾斜
plt.xticks(rotation=45)

plt.grid(True)
plt.show()

          图表

三,scikit-learn 使用分类策略预测苹果股票走势

        新数据

        新数据.csv

Date,Close,Volume,Open,High,Low
2023/6/1,$186.68,53117000,$185.55,$187.56,$185.01
2023/6/2,$187.00,51245330,$183.74,$187.05,$183.67
2023/6/3,$183.96,49515700,$184.90,$185.41,$182.59
2023/6/4,$185.01,49799090,$184.41,$186.10,$184.41
2023/6/5,$184.92,101256200,$186.73,$186.99,$184.27
2023/6/6,$186.01,65433170,$183.96,$186.52,$183.78
2023/6/7,$183.95,57462880,$183.37,$184.39,$182.02
2023/6/8,$183.31,54929130,$182.80,$184.15,$182.44
2023/6/9,$183.79,54755000,$181.27,$183.89,$180.97
2023/6/10,$180.96,48899970,$181.50,$182.23,$180.63
2023/6/11,$180.57,50214880,$177.90,$180.84,$177.46
2023/6/12,$177.82,61944620,$178.44,$181.21,$177.32
2023/6/13,$179.21,64848370,$179.97,$180.12,$177.43
2023/6/14,$179.58,121946500,$182.63,$184.95,$178.04
2023/6/15,$180.95,61996910,$181.03,$181.78,$179.26
2023/6/16,$180.09,68901810,$177.70,$180.12,$176.93
2023/6/17,$177.25,99625290,$177.33,$179.35,$176.76
2023/6/18,$177.30,55964400,$176.96,$178.99,$176.57
2023/6/19,$175.43,54834980,$173.32,$175.77,$173.11
2023/6/20,$172.99,56058260,$172.41,$173.90,$171.69

       代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.metrics import accuracy_score
import joblib

# 数据准备和处理
data = pd.read_csv('AAPL.csv')
data['Close'] = data['Close'].str.replace('$', '').astype(float)
data['Open'] = data['Open'].str.replace('$', '').astype(float)
data['High'] = data['High'].str.replace('$', '').astype(float)
data['Low'] = data['Low'].str.replace('$', '').astype(float)

# 创建标签列
data['Label'] = data['Close'].diff().gt(0).astype(int)

# 提取特征和目标变量
X = data[['Volume', 'Open', 'High', 'Low']]
y = data['Label']

# 划分训练集测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

# 构建Pipeline
pipe = Pipeline([
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler()),
    ('model', LogisticRegression())
])

# 模型训练
pipe.fit(X_train, y_train)

# 保存模型
joblib.dump(pipe, 'model.pkl')

# 测试集预测
y_pred = pipe.predict(X_test)

# 准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy}")


import pandas as pd
import joblib

# 加载模型
loaded_model = joblib.load('model.pkl')

# 新数据准备
new_data = pd.read_csv('新数据.csv')
new_data['Close'] = new_data['Close'].str.replace('$', '').astype(float)
new_data['Open'] = new_data['Open'].str.replace('$', '').astype(float)
new_data['High'] = new_data['High'].str.replace('$', '').astype(float)
new_data['Low'] = new_data['Low'].str.replace('$', '').astype(float)

# 删除Close和Date特征列
new_data.drop('Close', axis=1, inplace=True)
new_data.drop('Date', axis=1, inplace=True)

# 预测结果
predicted_labels = loaded_model.predict(new_data)

# 输出预测结果
for i, label in enumerate(predicted_labels):
    print(f"样本{i+1}的预测结果:{label}")

        预测结果

四,scikit-learn 使用回归策略预测苹果股票走势

        代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import joblib

# 1. 数据准备和处理
data = pd.read_csv('AAPL.csv')
data['Close'] = data['Close'].str.replace('$', '').astype(float)
data['Open'] = data['Open'].str.replace('$', '').astype(float)
data['High'] = data['High'].str.replace('$', '').astype(float)
data['Low'] = data['Low'].str.replace('$', '').astype(float)

# 提取特征和目标变量
X = data[['Volume', 'Open', 'High', 'Low']]
y = data['Close']

# 划分训练集测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

# 2. 模型训练
model = LinearRegression()
model.fit(X_train, y_train)

# 3. 测试集预测
y_pred = model.predict(X_test)

# 4. 模型评估
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差 (MSE): {mse}")

# 保存模型数据
joblib.dump(model, 'model2.pkl')

# =======================预测股票走势=====================

# 加载模型
loaded_model = joblib.load('model2.pkl')

# 新数据准备
new_data = pd.read_csv('HistoricalData_1687681340565.csv')
new_data['Close'] = new_data['Close'].str.replace('$', '').astype(float)
new_data['Open'] = new_data['Open'].str.replace('$', '').astype(float)
new_data['High'] = new_data['High'].str.replace('$', '').astype(float)
new_data['Low'] = new_data['Low'].str.replace('$', '').astype(float)

# 删除或保持"Volume"特征列为空值
# new_data.drop('Volume', axis=1, inplace=True)
new_data.drop('Close', axis=1, inplace=True)
new_data.drop('Date', axis=1, inplace=True)

predicted_labels = loaded_model.predict(new_data)

# 输出预测结果
for label in predicted_labels:
    print("预测结果:", label)

        预测结果

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

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

相关文章

【LeetCode: 590. N 叉树的后序遍历 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

机器学习中梯度下降法的缺点

机器学习中的梯度下降法是一种寻找函数最小值的优化算法&#xff0c;广泛应用于训练各种模型&#xff0c;尤其是在深度学习中。尽管其应用广泛&#xff0c;但梯度下降法也存在一些不可忽视的缺点&#xff1a; 1. 局部最小值和鞍点 局部最小值问题&#xff1a; 对于非凸函数&a…

Rofin罗芬Laser激光DQ80设备操作说明书

Rofin罗芬Laser激光DQ80设备操作说明书

Elasticsearch:什么是 kNN?

kNN - K-nearest neighbor 定义 kNN&#xff08;即 k 最近邻算法&#xff09;是一种机器学习算法&#xff0c;它使用邻近度将一个数据点与其训练并记忆的一组数据进行比较以进行预测。 这种基于实例的学习为 kNN 提供了 “惰性学习&#xff08;lazy learning&#xff09;” 名…

【大模型】大模型基础知识

几个常用术语 模型公式参数 K矩阵&#xff1a;字典 V矩阵&#xff1a;关键字的权重数值 AGI&#xff1a;通用人工智能 分词、词性关联、词性标注、知识图谱。分词操作是AI的开发&#xff0c;但是离AGI越来越远。自注意力机制的核心思想是摒弃分词等操作&#xff0c;面向更通…

机器人初识 —— 电机传动系统

一、背景 波士顿动力公司开发的机器人&#xff0c;其电机传动系统是其高性能和动态运动能力的核心部分。电机传动系统通常包括以下几个关键组件&#xff1a; 1. **电动马达**&#xff1a;波士顿动力的机器人采用了先进的电动马达作为主要的动力源&#xff0c;如伺服电机或步进…

Netty Review - NIO空轮询及Netty的解决方案源码分析

文章目录 Pre问题说明NIO CodeNetty是如何解决的&#xff1f;源码分析入口源码分析selectCntselectRebuildSelector Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty Review - 服务端channel注册流程源码解析 问题说明 N…

探索AI视频生成新纪元:文生视频Sora VS RunwayML、Pika及StableVideo——谁将引领未来

探索AI视频生成新纪元&#xff1a;文生视频Sora VS RunwayML、Pika及StableVideo——谁将引领未来 sora文生视频&#xff0c;探索AI视频生成新纪元 由于在AI生成视频的时长上成功突破到一分钟&#xff0c;再加上演示视频的高度逼真和高质量&#xff0c;Sora立刻引起了轰动。在S…

vscode 开发代码片段插件

环境准备 node - 20v版本 &#xff0c;推荐使用nvm进行版本控制全局安装 "yo" 是 Yeoman 工具的命令行工具&#xff0c; npm i yo -g全局安装 generator-code 是一个 Yeoman 脚手架 gernerator-code npm i gernerator-code -g全局安装 npm install -g vsce官方文档 …

代码随想录算法训练营第55天 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

最佳买卖股票时机含冷冻期 股票题做到这地步&#xff0c;可以发现分析每一天的可能状态与状态之间的转换是解决问题的关键。这道题中每一天可以有4种有效状态&#xff1a; 持有股票不持有股票&#xff0c;当天之前就已经卖出了股票不持有股票&#xff0c;当天卖出股票冷冻期状…

数字化转型导师坚鹏:政府数字化转型之数字化新技术解析与应用

政府数字化转型之数字化新技术解析与应用 课程背景&#xff1a; 数字化背景下&#xff0c;很多政府存在以下问题&#xff1a; 不清楚新技术的发展现状&#xff1f; 不清楚新技术的重要应用&#xff1f; 不清楚新技术的成功案例&#xff1f; 课程特色&#xff1a; 有…

计算机视觉的应用23-OpenAI发布的文本生成视频大模型Sora的原理解密

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用23-OpenAI发布的文本生成视频大模型Sora的原理解密。本文概况性地将Sora模型生成视频主要分为三个步骤&#xff1a;视频压缩网络、空间时间潜在补丁提取以及视频生成的Transformer模型。 文章目录…

专修戴尔R730xd服务器闪电灯 心跳亮黄灯故障

2024年开年第二天接到一个用户反馈说他公司有一台DELL PowerEdge R730xd服务器春节前由于市电问题意外断电关机了&#xff0c;刚好碰上春节就没去开机了&#xff0c;今天工厂开工服务器通电发现开不了机&#xff0c;且机器过了一会后报了2个黄灯错误&#xff0c;如下图&#xf…

【数据结构】每天五分钟,快速入门数据结构(一)——数组

目录 一.初始化语法 二.特点 三.数组中的元素默认值 四.时间复杂度 五.Java中的ArrayList类 可变长度数组 1 使用 2 注意事项 3 实现原理 4 ArrayList源码 5 ArrayList方法 一.初始化语法 // 数组动态初始化&#xff08;先定义数组&#xff0c;指定数组长度&#xf…

书生浦语大模型实战营-课程笔记(5)

LLM部署特点&#xff0c;内存开销大&#xff0c;TOKEN数量不确定 移动端竟然也可以部署LLM。之前以为只能在服务端部署&#xff0c;移动端作为客户端发起请求来调用大模型。 LMDeploy用于模型量化 模型量化&#xff1a;降低内存消耗 推理性能对比 量化主要作用&#xff1a;…

内存计算研究进展-技术架构

内存计算技术是一个宏观的概念&#xff0c;是将计算能力集成到内存中的技术统称。集成了内存计算技术的计算机系统不仅能直接在内存中执行部分计算&#xff0c;还能支持传统以CPU为核心的应用程序的执行。区别于内存计算&#xff0c;存算一体芯片将存储与计算相结合&#xff0c…

MySQL--SQL解析顺序

前言&#xff1a; 一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。 本文将从MySQL总体架构—>查询执行流程—>语句执行顺序来探讨一下其中的知识。 一、MySQL架构总览&a…

算法模板 6.并查集

并查集 用于解决连通块问题。 判断集合个数也就是判断p[x] x 的个数 836. 合并集合 - AcWing题库 #include <bits/stdc.h> using namespace std; const int N 1e5 10; int p[N]; // 记录每个元素的father int n, m;int find(int x){ // 查询元素x的fatherif(p[x] …

GPIO控制和命名规则

Linux提供了GPIO子系统驱动框架&#xff0c;使用该驱动框架即可灵活地控制板子上的GPIO。 GPIO命名 泰山派开发板板载了一个40PIN 2.54间距的贴片排针&#xff0c;排针的引脚定义兼容经典40PIN接口。 在后续对GPIO进行操作前&#xff0c;我们需要先了解k3566的GPIO命名规则&a…

Windows 重启 explorer 的正确做法

目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者…