【股票数据API接口55】如何获取股票历史分时MACD数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据

​ 如今,量化分析在股市领域风靡一时,其核心要素在于数据,获取股票数据,是踏上量化分析之路的第一步。你可以选择亲手编写爬虫来抓取,但更便捷的方式,莫过于利用专业的股票数据API接口。自编爬虫虽零成本,却伴随着时间与精力的巨大消耗,且常因目标页面变动而失效。大家可以依据自己的实际情况来决定数据获取方式。

接下来,我将分享200多个实测可用且免费的专业股票数据接口,并通过Python、JavaScript(Node.js)、Java、C#、Ruby等五种主流语言,逐一演示如何高效获取各类股票数据,希望能够对大家有所帮助。

先把数据接口的地址给大家,大家可以直接点击地址或复制到地址栏打开,马上就可以验证接口的有效性

沪深A股历史分时MACD数据API接口:http://api.mairui.club/hszbl/macd/000001/60m/LICENCE-66D8-9F96-0C7F0FBCD073

接口URL中,000001是股票代码,60m是分时级别,LICENCE-66D8-9F96-0C7F0FBCD073是请求证书,这个是官方提供的测试证书只能测试000001的数据,随后大家自己可以去领取一个免费的请求证书就可以获取其他股票的数据了。

分时级别 支持5分钟、15分钟、30分钟、60分钟、日周月年级别(包括前后复权),对应的值分别是 5m(5分钟)、15m(15分钟)、30m(30分钟)、60m(60分钟)、dn(日线未复权)、dq(日线前复权)、dh(日线后复权)、wn(周线未复权)、wq(周线前复权)、wh(周线后复权)、mn(月线未复权)、mq(月线前复权)、mh(月线后复权)、yn(年线未复权)、yq(年线前复权)、yh(年线后复权)

1、python

import requests  
  
url = "http://api.mairui.club/hszbl/macd/000001/60m/LICENCE-66D8-9F96-0C7F0FBCD073"  
response = requests.get(url)  
data = response.json()  
print(data)

2、JavaScript (Node.js)

const axios = require('axios');  
  
const url = "http://api.mairui.club/hszbl/macd/000001/60m/LICENCE-43D5-9F96-0C7F0FBCD073";  
axios.get(url)  
  .then(response => {  
    console.log(response.data);  
  })  
  .catch(error => {  
    console.log(error);  
  });

3、Java

import java.net.URI;  
import java.net.http.HttpClient;  
import java.net.http.HttpRequest;  
import java.net.http.HttpResponse;  
import java.io.IOException;  
  
public class Main {  
    public static void main(String[] args) {  
        HttpClient client = HttpClient.newHttpClient();  
        HttpRequest request = HttpRequest.newBuilder()  
            .uri(URI.create("http://api.mairui.club/hszbl/macd/000001/60m/LICENCE-43D5-9F96-0C7F0FBCD073"))  
            .build();  
  
        try {  
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());  
            System.out.println(response.body());  
        } catch (IOException | InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
}

4、C#

using System;  
using System.Net.Http;  
using System.Threading.Tasks;  
  
class Program  
{  
    static async Task Main()  
    {  
        using (HttpClient client = new HttpClient())  
        {  
            string url = "http://api.mairui.club/hszbl/macd/000001/60m/LICENCE-43D5-9F96-0C7F0FBCD073";  
            HttpResponseMessage response = await client.GetAsync(url);  
            string responseBody = await response.Content.ReadAsStringAsync();  
            Console.WriteLine(responseBody);  
        }  
    }  
}

5、Ruby

require 'net/http'  
require 'json'  
  
url = URI("http://api.mairui.club/hszbl/macd/000001/60m/LICENCE-43D5-9F96-0C7F0FBCD073")  
  
http = Net::HTTP.new(url.host, url.port)  
request = Net::HTTP::Get.new(url)  
response = http.request(request)  
data = JSON.parse(response.read_body)  
puts data

返回数据示例:

[{"t":"2024-07-19 10:30","diff":"0.000","dea":"0.000","macd":"0.000","ema12":"10.31","ema26":"10.31"},{"t":"2024-07-19 11:30","diff":"0.002","dea":"0.000","macd":"0.003","ema12":"10.3131","ema26":"10.3115"},{"t":"2024-07-19 14:00","diff":"0.004","dea":"0.001","macd":"0.007","ema12":"10.3188","ema26":"10.3144"},{"t":"2024-07-19 15:00","diff":"0.008","dea":"0.003","macd":"0.011","ema12":"10.3267","ema26":"10.3185"},{"t":"2024-07-22 10:30","diff":"-0.003","dea":"0.001","macd":"-0.009","ema12":"10.3057","ema26":"10.3090"},{"t":"2024-07-22 11:30","diff":"-0.009","dea":"-0.001","macd":"-0.016","ema12":"10.2941","ema26":"10.3031"},{"t":"2024-07-22 14:00","diff":"-0.016","dea":"-0.004","macd":"-0.024","ema12":"10.2796","ema26":"10.2955"},{"t":"2024-07-22 15:00","diff":"-0.019","dea":"-0.007","macd":"-0.024","ema12":"10.2720","ema26":"10.2906"},{"t":"2024-07-23 10:30","diff":"-0.015","dea":"-0.008","macd":"-0.013","ema12":"10.2763","ema26":"10.2913"},{"t":"2024-07-23 11:30","diff":"-0.014","dea":"-0.009","macd":"-0.008","ema12":"10.2769","ema26":"10.2905"},{"t":"2024-07-23 14:00","diff":"-0.012","dea":"-0.010","macd":"-0.005","ema12":"10.2774","ema26":"10.2897"}]{"t":"2024-08-30 15:00","u":"10.57","d":"10.06","m":"10.32"}

返回的数据字段说明:

t代表:交易时间,短分时级别格式为YYYY-MM-DD HH:MM,日线级别为yyyy-MM-dd,diff代表:DIFF值,dea代表:DEA值,macd代表:MACD值,ema12代表:EMA(12)值,ema26代表:EMA(26)值

<think>好的,我需要帮助用户在backtrader中创建自定义的MACD和MA指标,并构建交易策略。首先,我应该回顾一下用户提供的引用内容,看看有没有相关的指导。 根据引用[1],用户提到需要创建一个继承自backtrader.Strategy的策略类,并在其中定义params和next方法。同时,可以实例化内置指标,但用户这次需要自定义指标。引用[3]中提到了使用MA5和MA10的交叉作为买卖信号,这可以作为参考,但用户现在需要的是自定义MACD和MA。 首先,自定义指标需要继承自backtrader.Indicator类。对于MA指标,用户可能想实现不同的移动平均类型,比如SMA、EMA等。MACD通常由EMA计算得出,包括DIF、DEA和MACD柱。所以,我需要分步骤说明如何创建这两个指标。 接着,在策略类中实例化这些自定义指标,并在next方法中编写交易逻辑,比如当MACD线上穿信号线时买入,下穿时卖出,同时结合MA的交叉信号。需要确保代码结构正确,比如正确使用lines、params,以及next函数的逻辑。 同时,用户可能需要知道如何将指标可视化,所以应该提到在cerebro中添加绘图功能。另外,参数优化部分可以提到通过修改params来调整指标周期,比如MA的周期或MACD的参数。 需要检查代码是否符合backtrader的规范,比如指标的定义是否正确,策略中是否正确调用指标,以及交易逻辑是否有错误。例如,自定义MACD需要定义DIF、DEA和histo线,而MA指标需要正确计算移动平均。 可能的问题点包括:指标计算是否正确,next方法中的逻辑是否准确触发买卖信号,以及如何整合多个指标的条件。需要确保每一步都清晰,并参考用户提供的引用内容,特别是关于策略类和指标实例化的部分。 最后,生成的相关问题应该围绕指标自定义、策略优化、参数调整和回测等方面,帮助用户进一步深入应用。</think>在Backtrader中创建自定义MACD和MA指标并构建交易策略,需遵循以下步骤: ### 一、创建自定义指标类 #### 1. 自定义移动平均线(MA) ```python class MyMA(bt.Indicator): lines = ('ma',) # 定义输出线名称 params = (('period', 30),) # 可调整参数 def __init__(self): self.lines.ma = bt.indicators.SMA( # 使用内置SMA实现 self.data.close, period=self.p.period ) ``` #### 2. 自定义MACD指标 ```python class MyMACD(bt.Indicator): lines = ('macd', 'signal', 'histo') # 定义三根输出线 params = ( ('period_me1', 12), # 快速EMA周期 ('period_me2', 26), # 慢速EMA周期 ('period_signal', 9), # 信号线EMA周期 ) def __init__(self): me1 = bt.indicators.EMA(self.data, period=self.p.period_me1) me2 = bt.indicators.EMA(self.data, period=self.p.period_me2) self.l.macd = me1 - me2 # DIF线 self.l.signal = bt.indicators.EMA(self.l.macd, period=self.p.period_signal) # DEA线 self.l.histo = self.l.macd - self.l.signal # MACD柱状图 ``` ### 二、构建交易策略类 ```python class MyStrategy(bt.Strategy): params = ( ('ma_period', 30), ('macd_fast', 12), ('macd_slow', 26), ('macd_signal', 9), ) def __init__(self): # 实例化自定义指标 self.my_ma = MyMA(self.data, period=self.p.ma_period) self.my_macd = MyMACD( self.data, period_me1=self.p.macd_fast, period_me2=self.p.macd_slow, period_signal=self.p.macd_signal ) def next(self): # 金叉条件:MACD上穿信号线且价格在MA上方 long_condition = ( self.my_macd.macd[0] > self.my_macd.signal[0] and self.data.close[0] > self.my_ma.ma[0] ) # 死叉条件:MACD下穿信号线或价格跌破MA short_condition = ( self.my_macd.macd[0] < self.my_macd.signal[0] or self.data.close[0] < self.my_ma.ma[0] ) if not self.position and long_condition: self.buy() # 开多仓 elif self.position and short_condition: self.close() # 平仓 ``` ### 三、执行回测(完整代码示例) ```python cerebro = bt.Cerebro() # 添加数据 data = bt.feeds.YahooFinanceData( dataname='AAPL', fromdate=dt.datetime(2020, 1, 1), todate=dt.datetime(2023, 12, 31) ) cerebro.adddata(data) # 添加策略 cerebro.addstrategy(MyStrategy) # 设置初始资金 cerebro.broker.setcash(100000.0) # 添加分析器 cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe') cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown') # 执行回测 results = cerebro.run() # 输出结果 print(f'最终资产价值: {cerebro.broker.getvalue():.2f}') print(f'夏普比率: {results[0].analyzers.sharpe.get_analysis()["sharperatio"]:.2f}') print(f'最大回撤: {results[0].analyzers.drawdown.get_analysis()["max"]["drawdown"]:.2f}%') # 可视化 cerebro.plot() ``` ### 策略逻辑说明 1. **指标组合**:通过MACD的金叉/死叉信号结合价格与MA的位置关系,实现双重过滤机制[^3] 2. **参数可调**:所有指标参数通过`params`元组开放调整接口[^1] 3. **风险控制**:通过平仓条件而非反向开仓来降低交易频率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值