等级: 新手上路
- 注册:
- 2025-1-12
- 曾用名:
|
from PythonApi import *
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.colors as mcolors
import mplfinance as mpf
# ----------------------初始化函数------------------------
def init(context):
# 在 context 中保存全局变量
context.s1 = "SZ000001" # 平安银行股票代码
context.stock_data = pd.DataFrame() # 初始化用于存储数据的全局变量
context.liquidity_data = pd.DataFrame() # 初始化流动换手率数据的全局变量
# ----------------------数据更新函数------------------------
def handle_bar(context):
# 假设平台提供实时或历史数据更新,数据切片更新触发此逻辑
code = context.s1 # 获取股票代码
num = 1000 # 设定需要的数据条数
# 模拟从实时数据接口获取股票数据,假设提供一个列表结构
price_data = handle_bar_data(
code, num, ['open', 'high', 'low', 'close', 'volume']
) # 替换为实际提供数据的API调用
# 将获取的数据转换为DataFrame
股票数据 = pd.DataFrame(
price_data, columns=['开盘价', '最高价', '最低价', '收盘价', '成交量']
)
# 计算中心测度价格并保留两位小数
股票数据['中心测度价格'] = (
股票数据[['开盘价', '最高价', '最低价', '收盘价']].mean(axis=1).round(2)
)
# 假设 `handle_bar_data` 返回数据包含日期,作为索引
股票数据['日期'] = pd.to_datetime(price_data.index).strftime('%Y-%m-%d')
# 将成交量手转换为实际成交量
股票数据['成交量'] = 股票数据['成交量'] * 100
# ----------------------创建数据透视表------------------------
数据透视表 = pd.pivot_table(
股票数据,
values='成交量',
index=['中心测度价格'],
columns=['日期'],
aggfunc='sum',
fill_value=0,
)
数据透视表 = 数据透视表.sort_index(ascending=False)
# ----------------------获取流动换手率数据------------------------
# 假设平台支持获取流动换手率数据的实时更新
流动换手率_data = handle_bar_data(code, num, ['HSL.HSL']) # 替换为实际API调用
流动换手率数据 = pd.DataFrame(流动换手率_data, columns=['HSL.HSL'])
# ----------------------计算首日未交易筹码------------------------
# 计算首日总成交量
首日总成交量 = 数据透视表.iloc[:, 0].sum()
# 获取首日流通股换手率
首日流通股换手率 = 流动换手率数据.iloc[0]['HSL.HSL'] / 100 # 确保换手率为小数
# 计算流通股总股本
流通股总股本 = 首日总成交量 / 首日流通股换手率
# 初始化筹码分布表
筹码分布表 = pd.DataFrame(index=数据透视表.index)
# 设置发行价并计算首日未交易筹码
发行价 = 10.64 # 根据实际情况设置发行价
筹码分布表[数据透视表.columns[0]] = 数据透视表.iloc[:, 0]
筹码分布表.loc[发行价, 数据透视表.columns[0]] = (
流通股总股本 - 首日总成交量
if 发行价 not in 筹码分布表.index
else 筹码分布表.loc[发行价, 数据透视表.columns[0]]
+ 流通股总股本
- 首日总成交量
)
# ----------------------筹码分布更新迭代------------------------
for i in range(1, 数据透视表.shape[1]):
当前日期 = 数据透视表.columns
前一天日期 = 数据透视表.columns[i - 1]
当前换手率 = 流动换手率数据.iloc[i - 1]['HSL.HSL'] * 0.01
当前筹码分布 = 筹码分布表[前一天日期] * (1 - 当前换手率)
当天交易数据 = 数据透视表[当前日期]
筹码分布表[当前日期] = 当前筹码分布.add(当天交易数据, fill_value=0)
# 筹码分布表取整
筹码分布表 = 筹码分布表.round(0).astype(int)
# ----------------------生成热力图和K线图------------------------
# 生成降维筹码分布表(此处省略具体代码,可参考前述逻辑)
降维筹码分布表 = pd.DataFrame() # 假设已降维
# 设置热力图参数
vmin_value = 流通股总股本 * 0.004
vmax_value = 流通股总股本 * 0.016
colors = ["black", "#005D5A", "#8c8500", "#962511"]
cmap = mcolors.LinearSegmentedColormap.from_list("custom_cmap", colors)
# 绘制热力图
fig, ax1 = plt.subplots(figsize=(12, 8))
sns.heatmap(
降维筹码分布表, cmap=cmap, annot=False, fmt="d", vmin=vmin_value, vmax=vmax_value, ax=ax1
)
# K线图绘制(使用mplfinance)
kline_data = 股票数据[['开盘价', '最高价', '最低价', '收盘价', '成交量']]
kline_data.rename(
columns={
'开盘价': 'Open',
'最高价': 'High',
'最低价': 'Low',
'收盘价': 'Close',
'成交量': 'Volume',
},
inplace=True,
)
ax2 = ax1.twinx()
mpf.plot(
kline_data,
ax=ax2,
type='candle',
volume=False,
style='charles',
)
plt.title(f"{code} 筹码分布与价格走势")
plt.show()
|
|