fix: 新浪/腾讯5min K线数据源补全amount字段,修复资金流向数据缺失
This commit is contained in:
@@ -243,8 +243,9 @@ def fetch_5min_kline_sina(code):
|
|||||||
l = float(row.get('low', 0))
|
l = float(row.get('low', 0))
|
||||||
c = float(row.get('close', 0))
|
c = float(row.get('close', 0))
|
||||||
v = int(float(row.get('volume', 0)))
|
v = int(float(row.get('volume', 0)))
|
||||||
|
amt = float(row.get('amount', 0))
|
||||||
|
|
||||||
rows.append((code, dt, o, h, l, c, v, 0.0, 0.0))
|
rows.append((code, dt, o, h, l, c, v, amt, 0.0))
|
||||||
return rows if rows else None
|
return rows if rows else None
|
||||||
|
|
||||||
except (IndexError, KeyError, ValueError):
|
except (IndexError, KeyError, ValueError):
|
||||||
@@ -366,7 +367,8 @@ def fetch_5min_kline_tencent(code):
|
|||||||
dt = datetime(today.year, today.month, today.day, h, m, 0)
|
dt = datetime(today.year, today.month, today.day, h, m, 0)
|
||||||
except (ValueError, IndexError):
|
except (ValueError, IndexError):
|
||||||
continue
|
continue
|
||||||
min_data.append((dt, price, vol))
|
amt = float(parts[3]) if len(parts) > 3 else 0.0
|
||||||
|
min_data.append((dt, price, vol, amt))
|
||||||
|
|
||||||
if not min_data:
|
if not min_data:
|
||||||
return None
|
return None
|
||||||
@@ -375,26 +377,30 @@ def fetch_5min_kline_tencent(code):
|
|||||||
# 5分钟窗口: 09:30-09:35, 09:35-09:40, ...
|
# 5分钟窗口: 09:30-09:35, 09:35-09:40, ...
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
bars = defaultdict(list)
|
bars = defaultdict(list)
|
||||||
for dt, price, vol in min_data:
|
for dt, price, vol, amt in min_data:
|
||||||
# 5分钟窗口起始时间
|
# 5分钟窗口起始时间
|
||||||
minute = dt.minute
|
minute = dt.minute
|
||||||
bar_min = (minute // 5) * 5
|
bar_min = (minute // 5) * 5
|
||||||
bar_dt = dt.replace(minute=bar_min, second=0)
|
bar_dt = dt.replace(minute=bar_min, second=0)
|
||||||
bars[bar_dt].append((price, vol))
|
bars[bar_dt].append((price, vol, amt))
|
||||||
|
|
||||||
rows = []
|
rows = []
|
||||||
prev_vol = 0
|
prev_vol = 0
|
||||||
|
prev_amt = 0
|
||||||
for bar_dt in sorted(bars.keys()):
|
for bar_dt in sorted(bars.keys()):
|
||||||
ticks = bars[bar_dt]
|
ticks = bars[bar_dt]
|
||||||
o = ticks[0][0] # 第一个价格
|
o = ticks[0][0] # 第一个价格
|
||||||
c = ticks[-1][0] # 最后一个价格
|
c = ticks[-1][0] # 最后一个价格
|
||||||
h = max(p for p, _ in ticks)
|
h = max(p for p, _, _ in ticks)
|
||||||
l = min(p for p, _ in ticks)
|
l = min(p for p, _, _ in ticks)
|
||||||
# 腾讯的volume是累积值,取窗口最后的 - 窗口最前的之前
|
# 腾讯的volume和amount是累积值,取窗口最后的 - 前一窗口最后的
|
||||||
last_vol = ticks[-1][1]
|
last_vol = ticks[-1][1]
|
||||||
bar_vol = last_vol - prev_vol if prev_vol > 0 else ticks[-1][1]
|
bar_vol = last_vol - prev_vol if prev_vol > 0 else ticks[-1][1]
|
||||||
prev_vol = last_vol
|
prev_vol = last_vol
|
||||||
rows.append((code, bar_dt, o, h, l, c, max(0, bar_vol), 0.0, 0.0))
|
last_amt = ticks[-1][2]
|
||||||
|
bar_amt = last_amt - prev_amt if prev_amt > 0 else ticks[-1][2]
|
||||||
|
prev_amt = last_amt
|
||||||
|
rows.append((code, bar_dt, o, h, l, c, max(0, bar_vol), max(0, bar_amt), 0.0))
|
||||||
|
|
||||||
return rows if rows else None
|
return rows if rows else None
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user