怎么用python获得所有A股区间每日之收盘价?
请教如何用python获得以下数据?
数据1:
条件:20日内股价创90日新高,即D-19日-D日内,收盘价创D-59至D日新高(设为max90),且D日1-P/MAX90< =5%。
输出数据:过去一年内,当日符合条件的个股家数/当日交易的个股总数
数据2:
条件:当日收盘价P> MA60
输出数据:过去一年内,当日符合条件的个股家数/当日交易的个股总数
如果不会写复杂的程序,用python获得所有A股区间每日之收盘价也行。那样导到excel里面另外计算也行。
问题描述
解决方案
在JoinQuant(聚宽)量化平台的研究环境(Jupyter Notebook)中,你可以非常方便地使用Python和Pandas库来获取全市场A股的收盘价,并进行向量化计算。这种方法不仅代码简洁,而且运行速度快,最后还可以直接导出为Excel或CSV文件。
以下是完整的代码实现,你可以直接将其复制到聚宽的投资研究模块中运行。
完整Python代码实现
import pandas as pd
import numpy as np
from jqdata import *
import datetime
# 1. 设定时间范围
# 假设我们要计算过去一年的数据(约250个交易日)
# 因为需要计算90日新高和60日均线,我们需要往前多取至少90个交易日的数据作为计算基础
end_dt = datetime.date.today().strftime('%Y-%m-%d')
start_dt = (datetime.date.today() - datetime.timedelta(days=500)).strftime('%Y-%m-%d')
# 2. 获取所有A股代码
# 获取当前上市的所有股票代码
stocks = list(get_all_securities(['stock']).index)
print(f'共获取到 {len(stocks)} 只股票,开始拉取数据...')
# 3. 获取区间内所有股票的每日收盘价
# 为了防止内存溢出或超时,我们只取 'close' 字段
# panel=False 返回长表格式,我们需要将其转换为宽表(行是日期,列是股票代码)
df_raw = get_price(stocks, start_date=start_dt, end_date=end_dt, frequency='daily', fields=['close'], panel=False)
df_close = df_raw.pivot(index='time', columns='code', values='close')
print('数据拉取完成,开始计算指标...')
# 4. 计算每日交易的个股总数(当日收盘价不为空的股票数量)
total_traded = df_close.notna().sum(axis=1)
# ---------------- 数据2:当日收盘价P > MA60 ----------------
# 计算60日均线
ma60 = df_close.rolling(window=60).mean()
# 判断收盘价是否大于60日均线
cond2 = df_close > ma60
# 计算符合条件的比例
ratio2 = cond2.sum(axis=1) / total_traded
# ---------------- 数据1:20日内创90日新高,且距离最高价不到5% ----------------
# 计算90日最高价和20日最高价
max90 = df_close.rolling(window=90).max()
max20 = df_close.rolling(window=20).max()
# 条件A:20日内创90日新高 (即过去20天的最高价等于过去90天的最高价)
cond1_a = (max20 == max90)
# 条件B:D日收盘价距离90日最高价不超过5% (即 P / MAX90 >= 0.95)
cond1_b = (df_close / max90 >= 0.95)
# 综合条件
cond1 = cond1_a & cond1_b
# 计算符合条件的比例
ratio1 = cond1.sum(axis=1) / total_traded
# 5. 汇总结果
result = pd.DataFrame({
'Total_Traded_Stocks': total_traded,
'P_gt_MA60_Ratio': ratio2,
'NewHigh90_Ratio': ratio1
})
# 截取最近一年的数据(约250个交易日)
result = result.tail(250)
# 打印前几行查看结果
print(result.head())
# 6. 导出到CSV文件 (可以在聚宽左侧文件目录中找到并下载到本地Excel打开)
result.to_csv('market_indicators.csv')
print('计算完成,结果已保存为 market_indicators.csv')
代码原理解析
- 数据获取 (
get_price):我们使用get_price函数一次性获取了所有A股在指定时间段内的收盘价。通过pivot操作,我们将数据转换成了以日期为索引、股票代码为列的二维矩阵(DataFrame)。这种格式非常适合进行全市场的批量计算。 - 向量化计算 (
rolling):Pandas 的rolling(window=N)函数可以非常高效地计算移动平均(mean())和移动最高价(max())。我们不需要写任何for循环去遍历每一只股票和每一天,Pandas 会在底层用C语言级别的速度帮你算好全市场的数据。 - 逻辑判断:
- 数据2:直接用
df_close > ma60即可得到一个全是 True/False 的矩阵。 - 数据1:“20日内创90日新高”在数学上等价于“过去20天的最高价 == 过去90天的最高价”。“距离最高价不到5%”等价于
收盘价 / 90日最高价 >= 0.95。
- 数据2:直接用
- 比例计算:将 True/False 矩阵按行求和(
sum(axis=1)),就得到了每天符合条件的股票家数。除以每天有收盘价的股票总数,即得到比例。 - 导出Excel:使用
to_csv()将结果保存为CSV文件。在聚宽的研究环境中运行完毕后,你可以在左侧的文件树中找到market_indicators.csv,右键点击下载到本地,用Excel打开即可进行后续分析。