量化交易系统开发-实时行情自动化交易-3.4.1.4.A股衍生数据

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

接下来聊聊基于A股API获取衍生数据。

衍生数据(Derived Data)是通过对原始市场数据进行深度加工和计算得到的,如技术指标、资金流向、波动率等,这些数据对于深入分析市场动向、设计交易策略具有重要作用。在 A 股自动化交易系统中,利用公开的 API 获取并计算衍生数据可以帮助更好地进行策略分析和决策支持。以下是通过 Python 编写的代码示例,利用 A 股公开 API 获取衍生数据的详细开发内容。

1. 获取原始数据并计算技术指标

技术指标是最常见的衍生数据之一,例如移动平均线(MA)、相对强弱指数(RSI)、布林带(Bollinger Bands)等,这些指标有助于识别市场趋势和交易机会。以下示例演示了如何通过东方财富 API 获取 K 线数据并计算移动平均线和 RSI。

复制代码
import requests
import pandas as pd
import numpy as np

def get_eastmoney_klines(stock_code, market_type='0', kline_type='101', limit=100):
    """
    获取东方财富 A 股的 K 线数据。

    :param stock_code: 股票代码,例如 '600519' 表示贵州茅台
    :param market_type: 市场类型,'0' 表示沪市,'1' 表示深市
    :param kline_type: K 线类型,'101' 表示日 K 线
    :param limit: 获取的 K 线数据数量
    :return: K 线数据的 pandas DataFrame
    """
    url = f"http://push2his.eastmoney.com/api/qt/stock/kline/get"
    params = {
        "secid": f"{market_type}.{stock_code}",
        "fields1": "f1,f2,f3,f4,f5,f6",
        "fields2": "f51,f52,f53,f54,f55,f56",
        "klt": kline_type,
        "fqt": "1",
        "end": "20500101",
        "lmt": limit,
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        klines = data.get("data", {}).get("klines", [])
        kline_list = [kline.split(",") for kline in klines]
        df = pd.DataFrame(kline_list, columns=["日期", "开盘价", "收盘价", "最高价", "最低价", "成交量"])
        df = df.astype({"开盘价": 'float', "收盘价": 'float', "最高价": 'float', "最低价": 'float', "成交量": 'int'})
        return df
    else:
        raise Exception(f"Error fetching K line data: {response.status_code}")

# 获取贵州茅台(600519)的 K 线数据
df_klines = get_eastmoney_klines("600519")

# 计算移动平均线(MA)
df_klines["MA_5"] = df_klines["收盘价"].rolling(window=5).mean()
df_klines["MA_10"] = df_klines["收盘价"].rolling(window=10).mean()

# 计算相对强弱指数(RSI)
def calculate_rsi(data, window=14):
    delta = data.diff(1)
    gain = np.where(delta > 0, delta, 0)
    loss = np.where(delta < 0, -delta, 0)
    avg_gain = pd.Series(gain).rolling(window=window).mean()
    avg_loss = pd.Series(loss).rolling(window=window).mean()
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

df_klines["RSI_14"] = calculate_rsi(df_klines["收盘价"])
print(df_klines)

在这个示例中,我们首先通过调用东方财富的 API 获取了指定股票的 K 线数据,并计算了 5 日和 10 日的移动平均线(MA),以及 14 日的相对强弱指数(RSI)。这些技术指标可以帮助识别市场的超买或超卖状态,以及价格趋势。

2. 资金流向的计算

资金流向是衡量市场中资金流入和流出的重要指标,用于判断市场的买卖力量和趋势。在 A 股市场中,资金流向通常通过分析大单买入和大单卖出来计算。

以下示例展示了如何计算资金流向。

复制代码
def get_eastmoney_fund_flow(stock_code, market_type='0'):  
    """
    获取东方财富 A 股的资金流向数据。

    :param stock_code: 股票代码,例如 '600519'
    :param market_type: 市场类型,'0' 表示沪市,'1' 表示深市
    :return: 资金流向数据 DataFrame
    """
    url = f"http://push2.eastmoney.com/api/qt/stock/details/get"
    params = {
        "secid": f"{market_type}.{stock_code}",
        "fields1": "f1,f2,f3,f4,f5",
        "fields2": "f51,f52,f53,f54,f55",
        "pos": "-1",
        "lmt": 100,
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        trades = data.get("data", {}).get("details", [])
        trade_list = [trade.split(",") for trade in trades]
        df = pd.DataFrame(trade_list, columns=["时间", "成交价格", "成交量", "买卖方向", "成交金额"])
        df = df.astype({"成交价格": 'float', "成交量": 'int', "成交金额": 'float'})
        # 根据买卖方向计算资金流向
        df["资金流向"] = df.apply(lambda row: row["成交金额"] if row["买卖方向"] == '买盘' else -row["成交金额"], axis=1)
        return df
    else:
        raise Exception(f"Error fetching fund flow data: {response.status_code}")

# 获取贵州茅台(600519)的资金流向数据
df_fund_flow = get_eastmoney_fund_flow("600519")
print(df_fund_flow)

在该示例中,通过东方财富的 API 获取每笔交易的数据,并根据买卖方向计算出资金流向。如果是买盘,资金流向为正,表示资金流入;如果是卖盘,资金流向为负,表示资金流出。

3. 波动率的计算

波动率是衡量股票价格变动剧烈程度的重要指标。以下示例展示了如何通过获取 K 线数据计算股票的历史波动率。

复制代码
# 计算历史波动率
import numpy as np

def calculate_historical_volatility(data, window=20):
    """
    计算股票的历史波动率。

    :param data: 股票收盘价数据
    :param window: 波动率计算的窗口期
    :return: 历史波动率
    """
    log_returns = np.log(data / data.shift(1))
    volatility = log_returns.rolling(window=window).std() * np.sqrt(252)  # 年化波动率
    return volatility

# 计算贵州茅台的 20 日历史波动率
df_klines["Volatility_20"] = calculate_historical_volatility(df_klines["收盘价"])
print(df_klines[["日期", "收盘价", "Volatility_20"]])

在此示例中,通过计算股票收盘价的对数收益率,然后在滚动窗口上计算标准差得到历史波动率,并将其年化。这可以帮助交易者理解价格的剧烈程度,从而评估风险。

相关推荐
意图共鸣13 分钟前
意图共鸣科技《认知智能白皮书》——感知与执行分离:认知架构(CA)如何重塑大模型底层结构
人工智能·架构
等一个人的@15 分钟前
让数据自己开口:数睿通智库新增智能问数模块
人工智能·自然语言处理
ZGi.ai16 分钟前
人工审查节点:让自动化工作流多一步人工把关
运维·人工智能·自动化·人机协同·智能体工作流·人工审查
风吹夏回39 分钟前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
王莎莎-MinerU1 小时前
MinerU 深度技术解析:从架构原理到生产部署的全面指南
css·人工智能·自然语言处理·架构·ocr·个人开发
盘古信息IMS1 小时前
盘古信息IMS V6 8.0重磅发布:以薪火AI数智平台点燃离散制造数智化引擎
大数据·人工智能·制造
weilaieqi11 小时前
从音响制造到AI家庭娱乐生态:不见不散AI智能K歌音响亮相第二十届深圳国际金融博览会
人工智能·制造·娱乐
小熊Coding1 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
企服AI产品测评局1 小时前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
运维·数据库·人工智能·ai·chatgpt·自动化
Jiude1 小时前
AI 写代码太快之后,团队协作反而更难了
人工智能·架构·github