python使用pandas进行量化回测
作者:神出鬼没,指的就是我! 发布时间:2021-10-12 12:37:29
标签:python,pandas,量化回测
下面文章描述可能比excel
高级一点,距离backtrader
这些框架又差一点。做最基础的测试可以,如果后期加入加仓功能,或者是止盈止损等功能,很不合适。只能做最简单的技术指标测试。
导包,常用包导入:
import os
import akshare as ak
import requests
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import talib as ta
%matplotlib inline
plt.style.use("ggplot")
获取数据,本文使用akshare中债券数据为对象分析:
bond_zh_hs_daily_df = ak.bond_zh_hs_daily(symbol="sh010107")
添加指标:
def backtest_trend_strategy(ohlc: pd.DataFrame,
fast_period: int = 50,
slow_period: int = 200,
threshold: float = 1.0) -> pd.DataFrame:
"""封装向量化回测的逻辑"""
# 计算指标
ohlc["fast_ema"] = talib.EMA(ohlc.close, fast_period)
ohlc["slow_ema"] = talib.EMA(ohlc.close, slow_period)
ohlc["pct_diff"] = (ohlc["fast_ema"] / ohlc["slow_ema"] - 1) * 100
# 生成信号,1表示做多,-1表示做空,0表示空仓
ohlc["signal"] = np.where(ohlc["pct_diff"] > threshold, 1, 0)
ohlc["signal"] = np.where(ohlc["pct_diff"] < -threshold, -1, ohlc["signal"])
# 计算策略收益率
ohlc["returns"] = np.log(ohlc["close"] / ohlc["close"].shift(1))
ohlc["strategy"] = ohlc["signal"].shift(1) * ohlc["returns"]
ohlc["strategy_returns"] = ohlc["strategy"].cumsum()
return ohlc
运行策略,并绘制图片:
data = strategy1(data)
fig, ax = plt.subplots(nrows=3, ncols=1, figsize=(12, 15), sharex=True)
ax[0].plot(data.index, data["close"])
ax[0].plot(data.index, data["fast_ema"])
ax[0].plot(data.index, data["slow_ema"])
ax[0].set_title("Price and Indicators")
ax[1].plot(data.index, data["signal"])
ax[1].set_title("Strategy Position")
data[["returns", "strategy"]].cumsum().plot(ax=ax[2], title="Strategy Return")
参数优化:
# 选择核心参数和扫描区间,其它参数保持不变
fast_period_rng = np.arange(5, 101, 5)
total_return = []
for fast_period in fast_period_rng:
ohlc = data.filter(["open", "high", "low", "close"])
res = backtest_trend_strategy(ohlc, fast_period, 200, 1.0)
total_return.append(res["strategy_returns"].iloc[-1])
# 散点图:策略收益率 vs 快速均线回溯期
fig, ax = plt.subplots(figsize=(12, 7))
ax.plot(fast_period_rng, total_return, "r-o", markersize=10)
ax.set_title("Strategy Return vs Fast period")
ax.set_xlabel("fast_period")
ax.set_ylabel("return(%)")
来源:https://blog.csdn.net/qq_26742269/article/details/123697226


猜你喜欢
- 引子编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。数据天生就是文静的
- Python获取时间范围内日期列表和周列表的函数 1、获取日期列表# -*- coding=utf-8 -*-import datetime
- 有一个表,用户需要在后台操作它,希望能对它动态进行添加删除字段。这个功能也许没有问题,但是它原有插入与更新的两个存储过程,也需要一起修改。因
- --建递增序列CREATE SEQUENCE LZEAM_SP_LOOP_EQ_SEQ MINVALUE 1 INCREMENT BY 1
- 数据可视化是任何探索性数据分析或报告的关键步骤,它可以让我们一眼就能洞察数据集。目前有许多非常好的商业智能工具,比如Tableau、goog
- 如果中间红色区域是针则可以用下面的代码检测,其阈值和斑点检测的参数根据图像像素值做相应修改检测的主要思路是先通过找到外面的大圆,再通过圆心定
- 本文实例为大家分享了python实现nao机器人身体躯干和腿部动作的具体代码,供大家参考,具体内容如下跟上一篇类似,代码没什么难度,可以进行
- 1.SYS用户具有DBA权限,并且拥有SYS模式,只能通过SYSDBA登陆数据库。是Oracle数据库中权限最高的帐号SYSTEM具有DBA
- URL是可以添加变量部分的,把类似的部分抽象出来,比如:@app.route('/example/1/')@app.rout
- 本文实例讲述了python实现将html表格转换成CSV文件的方法。分享给大家供大家参考。具体如下:使用方法:python html2csv
- sql查询数组中是否包含某个内容find_in_set如果表Atable中的a字段内容是1,2,3 的格式(a字段是用,分隔的),要查询该字
- import turtle as tt.setup(800,600,0,0,)t.pensize(2)t.speed(1)t.color(&
- 本文实例讲述了PHP+redis实现添加处理投票的方法。分享给大家供大家参考,具体如下:<?php header("Cont
- 今天介绍一种基于高斯滤波和邻域随机采样,生成一种毛玻璃的图像特效,简单来说,就是先对图像做高斯滤波模糊,然后对模糊后的图像,通过对邻域的随机
- 关于元组,上一讲中涉及到了这个名词。本讲完整地讲述它。先看一个例子:>>>#变量引用str>>> s =
- 本文实例讲述了thinkphp3.x自定义Action、Model及View的实现方法。分享给大家供大家参考,具体如下:1、在xmall/L
- 本文实例讲述了Python设计模式之代理模式。分享给大家供大家参考,具体如下:代理模式在一般形式上是一个类函数接口。代理可以是这些事物的接口
- 前言调用,让客户端可以更具自身情况自由选择,服务端工作只需要做一份呢?还别说真还有一个准备好的轮子那就是今天的主角《grpc-gateway
- 问题描述vscode中跨目录的模块调用远不如pycharm中的来的简单,在pycharm中即使是不同库文件夹中子函数也可以进行互相调用。而在
- 先备份数据库,再用下面的办法: USE MASTER GO SP_CONFIGURE 'ALLOW UPDATES',1 R