AI量化知识树

获取港股日线行情数据

由bq5bun29创建,最终由small_q 被浏览 75 用户

根据模版构建可视化线性策略

1.首先选取需要的线性策略组成部分:

2.修改特征

在m2输入特征内修改表达式特征并使表达式过滤条件为空中输入DISTINCT instrument并且修改数据库为cnhk_stock_bar1d从而提取出港股专用字段且只提取股票信息。 使用Distinct是因为只需要提取出股票信息。

修改表达式 修改数据表

提取时间信息

\

3.提取数据

并在m4数据抽取中选取提取数据需要的时间信息(如图所示)

代码部分

1.Import(导入)代码中需要使用的数据库

1.Import(导入)代码中需要使用的数据库

import numpy as np
import pandas as pd
import dai

\

2.获取股票代码列表

# 获取股票代码列表
inst = dai.DataSource("cnhk_stock_instruments").read_bdb(as_type=pd.DataFrame, partition_filter={
    "date": ("2005-01-01", "2024-05-31")
}, columns=["instrument"])["instrument"].unique()
inst = list(inst)
inst

这段代码使用 dai.DataSource("cnhk_stock_instruments") 创建一个数据源对象,并调用 read_bdb 方法从数据源中读取数据。参数设置如下:

  • \
         as_type=pd.DataFrame: 指定读取的数据将以 pandas.DataFrame 的形式返回。
    
  • partition_filter: 用于过滤数据的条件,这里设置的条件是日期范围从 2005-01-01 到 2024-05-31。
  • \
    columns: 指定要读取的列,这里只读取 instrument 列。
    

读取的数据被转换为 pandas.DataFrame,然后通过 ["instrument"] 选择 instrument 列的数据,并通过 .unique() 方法获取这一列中所有独特的值。

  • 将结果转换为列表:inst = list(inst)
  • 将获取的独特股票代码转换为 Python 列表。
  • 显示获取的股票代码列表:inst

3.获取股票历史数据

# 初始化空的 DataFrame
df = pd.DataFrame({})
flag = True


# 循环读取每个股票的历史数据
for ins in inst:
    datas = dai.DataSource("cnhk_stock_bar1d").read_bdb(
        as_type=pd.DataFrame, 
        partition_filter={
            "date": ("2014-01-01", "2018-01-01"),
        }, 
        columns=["date", "close", "instrument"],  # 确保包含所有必要的字段
        filters={"instrument": ins}  # 根据股票代码过滤
    )
    
    # 检查 datas 是否为空或者是否包含 'close' 列
    if type(datas)!=type(None) and not datas.empty and 'close' in datas.keys():        
        df[ins] = datas['close']
        if flag:
            df['Date'] = datas['date']
            flag = False

# 设置 DataFrame 的索索为日期并移除 'Date' 列
df.set_index('Date', inplace=True)
df.head()初始化空的 DataFrame

df = pd.DataFrame({})

flag = True

这段代码创建了一个空的 pandas DataFrame,用来存储之后从数据源中获取的股票数据。flag 变量用于确保日期列仅在第一次迭代时添加到 DataFrame 中。

  • 循环读取每个股票的历史数据:

    这段代码遍历 inst 列表中的每一个股票代码(ins),并从数据源 cnhk_stock_bar1d 中读取每个股票的历史数据。具体参数如下:

    • as_type=pd.DataFrame: 将读取的数据转换为 pandas DataFrame。

    • partition_filter: 过滤数据的日期范围为 2014-01-01 到 2018-01-01。

    • columns: 指定要读取的列,包括 date、close 和 instrument。

    • filters: 根据股票代码进行过滤。

  • 检查 datas 是否为空或者是否包含 ‘close’ 列

if type(datas) != type(None) and not datas.empty and 'close' in datas.keys():

这段代码检查读取的数据 datas 是否为空或者是否包含 close 列。如果满足条件,将 datas 中的 close 列数据添加到 df 中,以 ins(股票代码)作为列名。同时,如果 flag 为 True,将 datas 中的 date 列数据添加到 df 中并设置 flag 为 False,确保日期列只添加一次。

  • 设置 DataFrame 的索引为日期并移除 ‘Date’ 列

df.set_index('Date', inplace=True)

df.head()

  • 这段代码将 df 的索引设置为 Date 列,并移除 Date 列。inplace=True 表示在原地进行操作,不返回新的 DataFrame。最后,通过 df.head() 显示 DataFrame 的前几行数据。

这段代码的目的是将多个股票的历史收盘价数据合并到一个 DataFrame 中,以便进一步分析和处理。

4.删除有空值的产品

#删除有空值的产品
for k in empty:
    df.pop(k)
np.shape(df)删除包含空值的列:

for k in empty:
    df.pop(k)	
  • 删除包含空值的列:

这段代码遍历 empty 列表中的每一列名,并使用 df.pop(k) 删除对应的列。

  • 输出 DataFrame 的形状:

print(np.shape(df))

  • 使用 np.shape(df) 输出 df 的形状,即行数和列数。

这段代码首先从数据源中读取股票数据,并将其合并到一个 DataFrame 中,然后删除所有包含空值的列,最后输出处理后的 DataFrame 的形状。

https://bigquant.com/codesharev2/84457887-07ea-4598-b869-4247cf285f6b

\

{link}