使用 Akshare 下载国内的期货(主力连续)、股票和指数的历史行情数据

本文介绍如何使用 akshare 下载国内期货、股票和指数的历史行情数据。

Akshare 是一个丰富的金融数据查询的 Python 库,通过爬虫实现了大量的金融数据接口,非常便于我们日常分析研究使用。

本文将详细介绍如何使用 Akshare 下载期货、股票和指数数据,并提供完整的代码示例,以求大家能快速拿到数据少走弯路。

我最初是为了下载期货合约主要是主力连续合约的历史行情数据,用于回测分析,然后顺便延展到指数和股票的行情数据。

最终成果是封装一个定义如下的函数,即日线历史行情的数据下载函数。

history_bar(symbol, length=100)

安装 Akshare

请确保已安装 Akshare,如下命令安装:

pip install akshare

了解它的更多数据,可查看它的文档:akshare documentation

下载期货数据

我使用 akshare 的重要原因就是它提供了下载期货的主力或连续合约的历史数据。开始我想 tushare 实现,映射每天的主力合约并对应获取其历史数据和拼接,这个过程本身就比较繁琐。再就是 tushare 的频率限制严重,测试几次就没有额度了。

注:最近发现 tushare 其实也有直接主力和连续合约的数据,且数据质量更高更全面。

akshare 中的主力和连续合约的数据是从新浪财经下载的,它的 symbol 名称与标准的是不一致的,不过可以通过函数 futures_display_main_sina 拿到映射关系。具体我不演示了,我搞了一份表格,便于我平时查看。

如需查看,可访问 新浪期货名称关系表格

有了主力和连续合约的 symbol 名称,就可以使用 futures_main_sina 函数下载历史数据。

data = aks.futures_main_sina(
    symbol="C0",
    start_date="20230101"
)

如上的 C0 表示的是玉米主力合约。

我们可以定义一个函数,参数接受 symbol 名称和长度,输出结果其转换为易读的格式。

def future_history_bar(symbol, length=100):
    start_date = datetime.now() - timedelta(days=length * 2)
    data = aks.futures_main_sina(
        symbol=symbol, start_date=start_date.strftime("%Y%m%d")
    )
    data = data.rename(
        columns={
            "日期": "date",
            "开盘价": "open",
            "最高价": "high",
            "最低价": "low",
            "收盘价": "close",
            "成交量": "volume",
            "持仓量": "open_interest",
            "动态结算价": "settle_price",
        }
    )
    data["open"] = data["open"].astype(float)
    data["high"] = data["high"].astype(float)
    data["low"] = data["low"].astype(float)
    data["close"] = data["close"].astype(float)
    return data.iloc[-length:]

上面的参数和输出的定义看个人习惯,我比较习惯这样的使用方式,便于我计算指标。

下载股票数据

A 股股票数据可使用 stock_zh_a_hist 下载,它的输入参数包括股票代码、周期、复权方式和起始日期等参数。

data = aks.stock_zh_a_hist(
    symbol="000001",
    period="daily",
    adjust="qfq",
    start_date="20230101"
)

我们的习惯,一般默认前复权即可。

为了使用方便,同样可定义一个函数,易于使用:

def stock_history_bar(symbol, length=100):
    start_date = datetime.now() - timedelta(days=length * 2)
    data = aks.stock_zh_a_hist(
        symbol=symbol,
        period="daily",
        adjust="qfq",
        start_date=start_date.strftime("%Y%m%d"),
    )
    return data.rename(
        columns={
            "日期": "date",
            "股票代码": "symbol",
            "开盘": "open",
            "最高": "high",
            "最低": "low",
            "收盘": "close",
            "成交量": "volume",
        }
    )[
        [
            "date",
            "symbol",
            "open",
            "high",
            "low",
            "close",
            "volume",
        ]
    ].iloc[
        -length:
    ]

我们可以定义一个函数,下载特定指数的历史数据,并将其转换为更易读的格式:

下载指数数据

A 股指数数据可通过 index_zh_a_hist 函数实现。输入参数包括指数代码、周期和起始日期等参数。

data = aks.index_zh_a_hist(
    symbol="000001",
    period="daily",
    start_date="20230101",
    end_date="20231231"
)

将其实现为 history_bar 函数的形式,便于我的使用。如下所示:

def index_history_bar(symbol, length=100):
    start_date = (datetime.now() - timedelta(days=length * 2)).strftime("%Y%m%d")
    end_date = datetime.now().strftime("%Y%m%d")
    data = aks.index_zh_a_hist(
        symbol=symbol,
        period="daily",
        start_date=start_date,
        end_date=end_date,
    )
    return data.rename(
        columns={
            "日期": "date",
            "开盘": "open",
            "最高": "high",
            "最低": "low",
            "收盘": "close",
            "成交量": "volume",
        }
    )[
        [
            "date",
            "open",
            "high",
            "low",
            "close",
            "volume",
        ]
    ].iloc[
        -length:
    ]

现在,我们就已经有了三种不同交易品种的历史数据获取方法。

主函数

最后,还可以定义一个主函数,根据输入的类型下载相应的历史数据:

def history_bar(symbol, length=100, equity_type="stock"):
    if equity_type == "stock":
        return stock_history_bar(symbol, length=length)
    elif equity_type == "future":
        return future_history_bar(symbol, length=length)
    elif equity_type == "index":
        return index_history_bar(symbol, length=length)
    else:
        raise ValueError(f"Unsupported equity type: {equity_type}")

现在,是不是使用起来就非常方便了。

示例使用

通过以下示例演示如何调用这些函数来获取不同品种的历史行情数据:

获取上证数据数据:

symbol = "000001"  # 上证指数
length = 100
equity_type = "index"
data = history_bar(symbol, length, equity_type)
print(data)

获取平安银行数据:

symbol = "000001"  # 平安银行
length = 100
equity_type = "stock"
data = history_bar(symbol, length, equity_type)
print(data)

获取甲醇行情数据:

symbol = "MA0"  # 甲醇主连
length = 100
equity_type = "stock"
data = history_bar(symbol, length, equity_type)
print(data)

通过以上代码,现在就有了轻松下载股票、指数和期货历史数据的能力。这为数据分析提供了有力的支持。

history_bars 的代码请查看 hist_data.py

现在有了数据,就可以实现任何其他我们像实现的事情,如计算指标发送告警,绘制图表,如果有交易 API 接口,可直接报单,不过这个前提是有了好的策略。

指标计算

简单演示下指标计算,如 rsi 上穿 30 可能表示短期价格有反弹,就可以发个报警,增加对这个标的的观察。

指标计算可用 talib 实现,如下所示:

import talib
data = history_bar("000001", length=100, equity_type="stock")
rsi = talib.RSI(data['close'].values)

rsi0 = rsi[-1]
rsi1 = rsi[-2]

crossover = rsi0 > 30 and rsi1 < 30
if crossover:
  print("触发报警条件")

希望本文对您有所帮助。如果有任何问题或建议,欢迎随时联系我。

使用akshare获取期货数据,你可以按照以下步骤进行操作: 1. 首先,你需要安装akshare库。你可以在Python环境中使用以下命令安装它: ``` pip install akshare ``` 2. 导入akshare库: ```python import akshare as ak ``` 3. 使用`get_hist_futures()`函数来获取期货数据。该函数的参数包括品种代码、合约代码、开始日期和结束日期。例如,要获取2015年沪深300股指期货数据,你可以使用以下代码: ```python futures_data = ak.get_hist_futures("cffex.if", "IF1501.CFFEX", start_date="20150101", end_date="20151231") ``` 这将返回一个DataFrame对象,其中包含了日期、开盘价、最高价、最低价、收盘价和成交量等数据。 4. 你还可以根据需要将数据保存到数据库中。例如,如果要保存到MySQL数据库中,可以使用以下代码: ```python import pymysql # 建立数据库连接 conn = pymysql.connect(host='localhost', user='your_username', password='your_password', db='your_database') cursor = conn.cursor() # 将DataFrame数据逐行插入数据库 for index, row in futures_data.iterrows(): sql = "INSERT INTO futures_data (date, open, high, low, close, volume) VALUES (%s, %s, %s, %s, %s, %s)" values = (index.strftime('%Y-%m-%d'), row['open'], row['high'], row['low'], row['close'], row['volume']) cursor.execute(sql, values) # 提交并关闭数据库连接 conn.commit() cursor.close() conn.close() ``` 替换代码中的`your_username`、`your_password`和`your_database`为你自己的数据库信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波罗学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值