企业微信

东方财富API的核心功能模块

东方财富API通过标准化接口提供金融数据服务,主要包含实时行情、历史数据、财务指标、交易接口四大功能模块。实时行情模块支持股票、期货合约的逐笔成交、盘口报价等高频数据获取,更新频率可达到秒级响应。历史数据模块覆盖A股全市场、商品期货、金融期货的历史K线数据,支持自定义时间周期(1分钟至月线)及复权因子调整。财务指标模块包含上市公司季报、年报数据,以及基于财报生成的杜邦分析、现金流预测等衍生指标。交易接口通过券商通道实现程序化下单,支持多账户管理及订单状态实时追踪。

股票市场数据获取与处理

实时行情获取

调用stock.get_realtime_quotes接口可获取沪深交易所全量股票的实时报价。该接口返回字段包含最新价、涨跌幅、成交量、委比等18项技术指标。以下代码演示如何筛选科创板股票并计算平均委比:


import pandas as pd

from efinance import stock

# 获取实时行情

quotes = stock.get_realtime_quotes()

# 筛选科创板股票

kcb_quotes = quotes[quotes['code'].str.startswith('688')]

# 计算平均委比

avg_weibi = kcb_quotes['weibi'].mean()

历史数据处理

使用stock.get_quote_history接口获取指定股票的历史K线数据。以下代码获取贵州茅台近5年周线数据并绘制布林带指标:

如何利用东方财富API实现股票期货数据深度挖掘与量化交易


import matplotlib.pyplot as plt

from efinance import stock

# 获取周线数据

df = stock.get_quote_history('600519', period='1w', end_date='20231231')

# 计算布林带

df['ma20'] = df['close'].rolling(20).mean()

df['std20'] = df['close'].rolling(20).std()

df['upper'] = df['ma20'] + 2*df['std20']

df['lower'] = df['ma20'] - 2*df['std20']

# 绘制图表

plt.figure(figsize=(12,6))

plt.plot(df['date'], df['close'], label='Close')

plt.plot(df['date'], df['upper'], 'r--', label='Upper')

plt.plot(df['date'], df['lower'], 'g--', label='Lower')

plt.legend()

plt.show()

财务指标分析

通过stock.get_finance_info接口获取上市公司财务数据。以下代码分析宁德时代近三年研发投入强度变化:


from efinance import stock

# 获取财务数据

finance = stock.get_finance_info('300750')

# 筛选利润表

income = finance['income']

# 提取研发费用与营业收入

rd_expense = income[income['item'] == '研发费用']['2021':'2023']

revenue = income[income['item'] == '营业收入']['2021':'2023']

# 计算研发占比

rd_ratio = (rd_expense.values / revenue.values) * 100

期货市场数据解析

合约管理

调用futures.get_contract_info接口获取商品期货合约参数。以下代码展示不同交易所主力合约切换规则:


from efinance import futures

# 获取合约列表

contracts = futures.get_contract_info()

# 按交易所分组

grouped = contracts.groupby('exchange')

# 输出主力合约规则

for exchange, group in grouped:

    print(f"{exchange}主力合约规则:")

    print(group['main_contract_rule'].iloc[0])

跨期套利分析

通过futures.get_spot_futures接口获取期现价差数据。以下代码计算铜期货跨期价差并绘制统计套利信号:


import numpy as np

from efinance import futures

# 获取沪铜主力与次主力数据

cu_data = futures.get_spot_futures('cu', main_contract='2401', sub_contract='2402')

# 计算价差序列

cu_data['spread'] = cu_data['main_price'] - cu_data['sub_price']

# 计算移动平均与标准差

cu_data['ma'] = cu_data['spread'].rolling(20).mean()

cu_data['std'] = cu_data['spread'].rolling(20).std()

# 生成交易信号

cu_data['signal'] = np.where(

    (cu_data['spread'] > cu_data['ma'] + 2*cu_data['std']), -1,

    np.where((cu_data['spread'] < cu_data['ma'] - 2*cu_data['std']), 1, 0)

)

量化交易策略开发

策略框架搭建

基于backtrader框架构建双均线策略,以下代码展示如何集成东方财富API数据:


import backtrader as bt

from efinance import stock

class DoubleMAStrategy(bt.Strategy):

    params = (('fast_period', 5), ('slow_period', 20))

    def __init__(self):

        self.data_close = self.datas[0].close

        self.sma_fast = bt.indicators.SMA(self.data_close, period=self.p.fast_period)

        self.sma_slow = bt.indicators.SMA(self.data_close, period=self.p.slow_period)

    def next(self):

        if not self.position:

            if self.sma_fast > self.sma_slow:

                self.buy()

        else:

            if self.sma_fast < self.sma_slow:

                self.close()

# 加载数据

data = stock.get_quote_history('sh', period='1d', end_date='20231231')

bt_data = bt.feeds.PandasData(dataname=data)

# 创建引擎

cerebro = bt.Cerebro()

cerebro.addstrategy(DoubleMAStrategy)

cerebro.adddata(bt_data)

cerebro.broker.setcash(1000000.0)

cerebro.run()

策略优化与回测

使用optunity库进行参数优化,以下代码对布林带策略参数进行网格搜索:


import optunity

from efinance import stock

import backtrader as bt

# 定义优化函数

def optimize_bollinger(window, width):

    class BollingerStrategy(bt.Strategy):

        params = (('window', int(window)), ('width', width))

        def __init__(self):

            self.bollinger = bt.indicators.BollingerBands(period=self.p.window, devfactor=self.p.width)

        def next(self):

            if not self.position and self.data.close[0] < self.bollinger.lines.bot[0]:

                self.buy()

            elif self.position and self.data.close[0] > self.bollinger.lines.top[0]:

                self.close()

    # 执行回测

    cerebro = bt.Cerebro()

    cerebro.addstrategy(BollingerStrategy)

    cerebro.adddata(data_feed)

    cerebro.broker.setcash(1000000.0)

    result = cerebro.run()

    return cerebro.broker.getvalue()

# 加载历史数据

data = stock.get_quote_history('sz', period='1d', end_date='20231231')

bt_data = bt.feeds.PandasData(dataname=data)

data_feed = cerebro.adddata(bt_data)

# 参数搜索

optimal_pars, details, _ = optunity.maximize(

    optimize_bollinger,

    num_evals=50,

    window=[5, 60],

    width=[1, 3]

)

风险控制与数据安全

风险管理模型

采用VaR模型计算组合风险敞口,以下代码展示基于历史模拟法的VaR计算:


import numpy as np

from efinance import stock

# 获取投资组合历史收益率

portfolio_returns = np.random.normal(0.001, 0.02, 1000)

# 计算95%置信水平VaR

var_95 = -np.percentile(portfolio_returns, 5)

# 计算CVaR

cvar_95 = -portfolio_returns[portfolio_returns < -var_95].mean()

print(f"日度VaR(95%): {var_95:.4f}")

print(f"日度CVaR(95%): {cvar_95:.4f}")

数据安全措施

实施API密钥动态管理策略,以下代码演示基于环境变量的密钥保护方案:


import os

from efinance import auth

# 从环境变量获取密钥

api_key = os.environ.get('EFINANCE_API_KEY')

secret_key = os.environ.get('EFINANCE_SECRET_KEY')

# 初始化认证

auth_client = auth.Auth(api_key, secret_key)

# 签名请求

signature = auth_client.generate_signature({

    'timestamp': 1620000000,

    'nonce': 'abc123'

})