resample() 或 merge() 的类别。K_last、D_last 初始化为 50,再按日递推。601398.xlsx 计算 KDJ。下列说法正确的是? A. 文件保存的是幸福银行 2024 年 1 月 2 日至 8 月 30 日的收盘、最高和最低价,用 pd.read_excel('601398.xlsx', index_col=0) 读入 B. 文件是 renshu.csv,列名为会计、保险、外语 C. 必须用 read_csv 读取,且不能设置 index_col D. 列名必须是温度、滚动平均 答案:A 解析: 语料给出文件名、标的、日期区间和三列价格,以及 read_excel(..., index_col=0)。B 是 4.5 的人数表示例,D 是 4.7.4 移动窗口示例列名。import pandas as pd
stockData = pd.DataFrame({
'收盘': [10.0, 14.0, 12.0],
'最高': [12.0, 14.0, 13.0],
'最低': [8.0, 10.0, 10.0]
}, index=pd.date_range('2024-01-02', periods=3, freq='D'))
n = 2
low_n = stockData['最低'].rolling(window=n, min_periods=1).min()
high_n = stockData['最高'].rolling(window=n, min_periods=1).max()
rsv = (stockData['收盘'] - low_n) / (high_n - low_n) * 100
print(float(rsv.iloc[0]))
A. 50.0 B. 100.0 C. 0.0 D. 25.0 答案:A 解析: 第一日窗口只有当天:Ln=8,Hn=12,Cn=10。RSV=(10-8)÷(12-8)×100=50。B 是第二日 RSV;D 把乘数 100 误写成 50。
stockData['最低'].rolling(window=n, min_periods=1).min() 得到最近 n 天最低价 B. stockData['最高'].rolling(window=n, min_periods=1).max() 得到最近 n 天最高价 C. window 指定窗口大小,min_periods 指定最少观测数 D. 应当用 resample('W').max() 代替滚动窗口来计算 RSV 答案:ABC 解析: A、B、C 与课程 kdj 及对 rolling 的说明一致。resample() 属于 4.7.3 按日历频率分箱,不是 n 日滚动最值,故 D 错误。kdj 函数会 return 一个新数据框,传入的 stockData 保持不变。 答案:× 解析: 函数把 K、D、J 写回传入的数据框,return 后没有返回值。调用方式是 stockData = pd.read_excel(...) 再 kdj(stockData),最后 print(stockData[['K','D','J']]),靠就地修改得到结果。import pandas as pd
import numpy as np
stockData = pd.DataFrame({
'收盘': [10.0, 14.0, 12.0],
'最高': [12.0, 14.0, 13.0],
'最低': [8.0, 10.0, 10.0]
}, index=pd.date_range('2024-01-02', periods=3, freq='D'))
n = 2
low_n = stockData['最低'].rolling(window=n, min_periods=1).min()
high_n = stockData['最高'].rolling(window=n, min_periods=1).max()
rsv = (stockData['收盘'] - low_n) / (high_n - low_n) * 100
K_last = 50
D_last = 50
for i in range(2):
K_last = (2 / 3) * K_last + (1 / 3) * rsv.iloc[i]
D_last = (2 / 3) * D_last + (1 / 3) * K_last
print(round(float(rsv.iloc[1]), 1))
print(round(float(rsv.iloc[2]), 1))
print(round(float(K_last), 2))
A. 100.0,50.0,66.67 B. 100.0,66.7,66.67 C. 50.0,50.0,50.0 D. 100.0,50.0,50.0 答案:A 解析: 第二日 2 日窗口:最低 8、最高 14、收盘 14,RSV=100。第三日窗口:最低 10、最高 14、收盘 12,RSV=(12-10)÷(14-10)×100=50。若误用当日最高 13,会得到约 66.7(选项 B)。K 从 50 起:第一日 RSV=50 仍为 50;第二日 K=2/3×50+1/3×100=66.67。D 把 K 停在初值 50。
【简答题·中】请写出完整可运行代码:构造与第 7 题相同的三行价格数据框,按 n=2、min_periods=1 计算 RSV 并打印。说明 RSV 公式中 Cn、Ln、Hn 的含义,并给出三日 RSV。
答案:
import pandas as pd
stockData = pd.DataFrame({
'收盘': [10.0, 14.0, 12.0],
'最高': [12.0, 14.0, 13.0],
'最低': [8.0, 10.0, 10.0]
}, index=pd.date_range('2024-01-02', periods=3, freq='D'))
n = 2
low_n = stockData['最低'].rolling(window=n, min_periods=1).min()
high_n = stockData['最高'].rolling(window=n, min_periods=1).max()
rsv = (stockData['收盘'] - low_n) / (high_n - low_n) * 100
print(rsv)
当日 RSV=(Cn-Ln)÷(Hn-Ln)×100。Cn 为第 n 日收盘价,Ln 为 n 日内最低价,Hn 为 n 日内最高价。三日 RSV 依次为 50、100、50。 解析: 评分要点:① 列名为收盘、最高、最低;② 写出 rolling(...).min()/.max() 再套 RSV 公式;③ 能解释 Cn、Ln、Hn;④ 三日结果 50、100、50。只用当日最高最低算第三日、或改用 resample(),应扣分。
【简答题·难】结合课程 kdj 程序,回答:(1)从原始价格到 K、D、J 的计算顺序与三条公式;(2)为什么 rolling 要写 min_periods=1,若省略会怎样;(3)K、D 为何用循环加 at[],J 却可以直接列运算;(4)函数为什么几乎不使用参数 m1、m2,调用后又怎样看到结果。
答案: (1)先 RSV,再 K、D,最后 J。RSV=(收盘-n 日最低)÷(n 日最高-n 日最低)×100;K=2/3×前一日 K+1/3×当日 RSV;D=2/3×前一日 D+1/3×当日 K;无前值时 K、D 取 50;J=3×K-2×D。 (2)min_periods=1 让不足 n 日的前几天仍用已有数据计算。省略则默认需满窗口,前 n-1 日 RSV 为 NaN,随后 K、D、J 会连锁为空。 (3)K、D 依赖前一日取值,必须按行递推,并用 at[行标签, 列名] 写入单个元素;J 只依赖当日已算好的 K、D,可用序列一次算出。 (4)默认 m1=3、m2=3 对应公式里的 1/3 与 2/3,课程实现直接写成 2/3、1/3。函数就地改写 stockData,return 无返回值,故先 read_excel 再 kdj(stockData),最后打印 [['K','D','J']]。 解析: 评分要点:① 顺序与四条公式(含初值 50)正确;② 能说明 min_periods 与 NaN 连锁;③ 能区分递推写入与列运算;④ 能说明就地修改与调用方式。把 J 写成 3D-2K、或把 KDJ 说成 resample(),不得满分。