期货数据分析:Python 实战技术分享
引言
在金融市场中,期货分析对于投资者来说至关重要。Python 作为一种功能强大且易于使用的编程语言,在金融数据分析领域有着广泛的应用。本文将基于提供的 Python 代码,详细解读如何使用 Python 进行期货持仓数据的分析和可视化,帮助大家更好地理解期货市场中不同机构的持仓动态。
整体功能概述
这段代码的主要功能是从 SQLite 数据库中获取期货持仓数据,对数据进行处理和合并,然后通过不同的可视化方式展示三大家(东方财富(代客)、平安期货(代客)、徽商期货(代客))和五大机构(国泰君安(代客)、海通期货(代客)、中信期货(代客)、永安期货(代客)、东证期货(代客))在玻璃 FG 期货品种上的持仓情况。具体包括净持仓趋势曲线图、净持仓 K 线图以及综合持仓趋势图。
代码详细解读
1. 导入必要的库
import sqlite3
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
import pandas_market_calendars as mcal
from mplfinance.original_flavor import candlestick_ohlc
from get_zss_data import get_data_main
from read_zss_data import read_data_main
这里导入了多个库,其中 sqlite3
用于连接和操作 SQLite 数据库,pandas
用于数据处理,matplotlib
用于数据可视化,pandas_market_calendars
用于获取交易日历,candlestick_ohlc
用于绘制 K 线图。另外,get_zss_data
和 read_zss_data
是自定义模块,分别用于爬取最新数据和将数据入库。
2. 配置参数
DB_PATH = "futures_data.db"
CATEGORY = "玻璃FG" # 要分析的品种
# 三大家人
THREE_MAJOR = ['东方财富(代客)', '平安期货(代客)', '徽商期货(代客)']
# 五大机构
FIVE_MAJOR = ['国泰君安(代客)', '海通期货(代客)', '中信期货(代客)',
'永安期货(代客)', '东证期货(代客)']
定义了数据库路径、要分析的期货品种以及三大家和五大机构的名称。
3. 从数据库获取持仓数据
def fetch_holdings_data():
"""从数据库获取持仓数据"""
conn = sqlite3.connect(DB_PATH)
# 查询三大家数据
three_df = pd.read_sql(f"""
SELECT date,
SUM(trade_volume) AS trade_total,
SUM(long_position) AS long_total,
SUM(short_position) AS short_total
FROM holdings
WHERE category = '{CATEGORY}'
AND member_name IN ({','.join(['?'] * len(THREE_MAJOR))})
GROUP BY date
ORDER BY date
""", conn, params=THREE_MAJOR)
# 查询五大机构数据
five_df = pd.read_sql(f"""
SELECT date,
SUM(trade_volume) AS trade_total,
SUM(long_position) AS long_total,
SUM(short_position) AS short_total
FROM holdings
WHERE category = '{CATEGORY}'
AND member_name IN ({','.join(['?'] * len(FIVE_MAJOR))})
GROUP BY date
ORDER BY date
""", conn, params=FIVE_MAJOR)
conn.close()
return three_df, five_df
该函数通过 SQL 查询从数据库中获取三大家和五大机构在指定期货品种上的持仓数据,包括交易总量、多仓总量和空仓总量,并按日期分组排序。
4. 处理数据并合并
def process_data(three_df, five_df):
"""处理数据并合并"""
# 转换日期格式
three_df['date'] = pd.to_datetime(three_df['date'])
five_df['date'] = pd.to_datetime(five_df['date'])
# 获取中国金融期货交易所(NYSE)的交易日历
cffex = mcal.get_calendar('NYSE')
# 创建完整日期索引,只包含期货开盘日期
start_date = min(three_df['date'].min(), five_df['date'].min())
end_date = max(three_df['date'].max(), five_df['date'].max())
schedule = cffex.schedule(start_date=start_date, end_date=end_date)
all_dates = schedule.index
# 合并数据集
merged_df = pd.DataFrame(index=all_dates)
merged_df = merged_df.merge(
three_df.set_index('date'),
how='left',
left_index=True,
right_index=True
).merge(
five_df.set_index('date'),
how='left',
left_index=True,
right_index=True,
suffixes=('_three', '_five')
)
# 填充缺失值
merged_df.fillna(0, inplace=True)
# 计算净持仓
merged_df['net_position_three'] = merged_df['long_total_three'] - merged_df['short_total_three']
merged_df['net_position_five'] = merged_df['long_total_five'] - merged_df['short_total_five']
return merged_df
该函数首先将日期列转换为 datetime
类型,然后获取指定日期范围内的交易日历,创建完整的日期索引。接着将三大家和五大机构的数据合并到一个 DataFrame 中,并填充缺失值。最后计算三大家和五大机构的净持仓。
5. 绘制净持仓趋势曲线图
def plot_net_position_trend(merged_df):
"""绘制净持仓趋势曲线图"""
plt.figure(figsize=(14, 7))
# 设置默认字体为 SimHei(黑体)或 Microsoft YaHei(微软雅黑)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 或者 'Microsoft YaHei'
# 解决负号显示问题(可选)
plt.rcParams['axes.unicode_minus'] = False
# 三大家净持仓趋势
plt.plot(
merged_df.index,
merged_df['long_total_three'] - merged_df['short_total_three'],
label='三大家人净持仓趋势',
color='#2ca02c',
linewidth=2
)
# 五大机构净持仓趋势
plt.plot(
merged_df.index,
merged_df['long_total_five'] - merged_df['short_total_five'],
label='五大机构净持仓趋势',
color='#8c564b',
linewidth=2
)
# 图表装饰
plt.title(f'{CATEGORY} 期货净持仓趋势分析', fontsize=14, pad=20)
plt.xlabel('日期', fontsize=12)
plt.ylabel('净持仓量(手)', fontsize=12)
plt.grid(True, alpha=0.3)
# 绘制 y=0 的虚线
plt.axhline(y=0, color='gray', linestyle='--', linewidth=1)
# 设置日期格式
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.AutoDateLocator())
plt.gcf().autofmt_xdate()
# 添加图例
plt.legend(fontsize=12)
# 显示图表
plt.tight_layout()
plt.show()
该函数使用 matplotlib
绘制三大家和五大机构的净持仓趋势曲线图,并进行图表装饰,包括设置标题、坐标轴标签、网格线、日期格式和图例等。
6. 主程序
if __name__ == "__main__":
# 爬取最新数据
get_data_main()
# 数据入库
read_data_main()
# 获取数据
three_df, five_df = fetch_holdings_data()
# 处理数据
merged_df = process_data(three_df, five_df)
# 绘制图表
plot_net_position_trend(merged_df)
主程序首先调用 get_data_main
函数爬取最新数据,然后调用 read_data_main
函数将数据入库。接着获取持仓数据,处理数据并合并,最后绘制净持仓趋势曲线图。
其他可视化函数
除了绘制净持仓趋势曲线图,代码中还提供了绘制净持仓 K 线图和综合持仓趋势图的函数:
plot_net_position_kline(merged_df)
:绘制净持仓 K 线图,展示三大家和五大机构的净持仓情况。plot_trend(merged_df)
:绘制综合持仓趋势图,展示三大家和五大机构的多仓、空仓、净持仓和累计持仓趋势。
7. 运行效果
总结
通过以上代码,我们可以清晰地看到如何使用 Python 进行期货持仓数据的分析和可视化。从数据获取、处理到可视化,每个步骤都有详细的代码实现。这些可视化图表可以帮助投资者更好地理解期货市场中不同机构的持仓动态,为投资决策提供参考。
希望本文的技术分享能对大家有所帮助,让大家在期货数据分析领域有更深入的了解和实践。
以上就是根据代码编写的技术分享文章,你可以根据实际情况进行调整和补充。