用Python的sorted函数和集合运算,5分钟搞定股票数据多维度交叉分析
·
用Python内置工具5分钟实现股票数据多维度交叉分析
金融数据分析往往给人留下需要复杂工具和专业库的印象,但Python内置的sorted函数和集合运算就能完成许多基础而实用的分析任务。对于刚接触数据分析的开发者或对量化分析感兴趣的程序员来说,掌握这些基础工具的组合应用,可以快速实现股票数据的清洗、排序和交叉分析,而无需依赖专业的金融分析库。
1. 数据准备与基础分析
在开始分析之前,我们需要准备股票数据并理解基础指标的计算方法。假设我们已经从数据源获取了CSV格式的股票交易数据,包含日期、开盘价、最高价、最低价、收盘价和成交量等字段。
import numpy as np
# 定义列索引常量
DATE = 0
OPEN = 1
HIGH = 2
LOW = 3
CLOSE = 4
VOLUME = 5
def load_stock_data(filepath):
"""加载股票CSV数据,跳过表头"""
return np.genfromtxt(filepath, delimiter=',', skip_header=1)
计算股票涨跌幅是基础分析的第一步,公式为:(最新收盘价-最早收盘价)/最早收盘价*100。我们可以用NumPy轻松实现:
def calculate_uplift(data):
"""计算股票涨跌幅百分比"""
first_close = data[0, CLOSE]
last_close = data[-1, CLOSE]
return round((last_close - first_close) / first_close * 100, 2)
2. 使用sorted函数进行高效排序
Python的sorted函数是数据分析中的利器,它支持自定义排序规则,能够灵活应对各种排序需求。在股票分析中,我们经常需要对股票按不同指标进行排序。
2.1 基础排序:按单一指标
最简单的排序是按涨跌幅或成交量等单一指标排序:
stocks = [
{'code': '600000', 'uplift': 5.2, 'volume': 450000},
{'code': '600004', 'uplift': -3.1, 'volume': 320000},
# ...更多股票数据
]
# 按涨跌幅降序排序
sorted_by_uplift = sorted(stocks, key=lambda x: x['uplift'], reverse=True)
# 按成交量升序排序
sorted_by_volume = sorted(stocks, key=lambda x: x['volume'])
2.2 多条件排序:主次排序键
当主要排序指标相同时,我们可以指定次要排序条件:
# 先按涨跌幅降序,涨跌幅相同时按成交量降序
sorted_stocks = sorted(stocks,
key=lambda x: (x['uplift'], x['volume']),
reverse=True)
2.3 自定义排序函数
对于更复杂的排序需求,可以定义专门的排序函数:
def complex_sort_key(stock):
"""综合涨跌幅和成交量的复合排序键"""
return (stock['uplift'] * 0.7 + stock['volume'] / 1000000 * 0.3)
sorted_complex = sorted(stocks, key=complex_sort_key, reverse=True)
3. 集合运算实现多维度交叉分析
集合运算可以帮助我们快速找出股票数据中的交集、并集和差集,实现多维度交叉分析。
3.1 基础集合运算
假设我们已经得到了涨幅前10和成交量前10的股票列表:
top_uplift = ['600000', '600004', '600006', '600008', '600009',
'600010', '600011', '600012', '600015', '600016']
top_volume = ['600000', '600006', '600018', '600019', '600028',
'600029', '600030', '600031', '600036', '600048']
我们可以进行以下分析:
# 涨幅和成交量都在前10的股票
both_top = sorted(set(top_uplift) & set(top_volume))
# 涨幅或成交量在前10的股票
either_top = sorted(set(top_uplift) | set(top_volume))
# 涨幅前10但成交量不在前10的股票
uplift_only = sorted(set(top_uplift) - set(top_volume))
# 涨幅和成交量不同时在前10的股票
not_both = sorted(set(either_top) - set(both_top))
3.2 多维度交叉分析函数
将上述分析封装成函数,便于复用:
def cross_analyze(top_a, top_b):
"""执行两组股票代码的交叉分析"""
set_a = set(top_a)
set_b = set(top_b)
return {
'both': sorted(set_a & set_b),
'either': sorted(set_a | set_b),
'a_only': sorted(set_a - set_b),
'not_both': sorted((set_a | set_b) - (set_a & set_b))
}
4. 实战:完整股票分析流程
结合sorted函数和集合运算,我们可以构建一个完整的股票分析流程。
4.1 数据加载与预处理
def load_multiple_stocks(file_list):
"""加载多支股票数据并计算基础指标"""
stock_stats = []
for file in file_list:
data = load_stock_data(f'datas/{file}')
stats = {
'code': file[:6], # 提取股票代码
'uplift': calculate_uplift(data),
'volume': round(data[:, VOLUME].sum(), 2),
'high': round(data[:, HIGH].max(), 2),
'low': round(data[:, LOW].min(), 2)
}
stock_stats.append(stats)
return stock_stats
4.2 获取各维度Top 10
def get_top_10(stats, key):
"""获取指定指标的前10名股票"""
return [s['code'] for s in sorted(stats,
key=lambda x: x[key],
reverse=key != 'low')[:10]]
4.3 执行交叉分析
def analyze_stocks(file_list):
"""执行完整的股票分析流程"""
# 加载并预处理数据
stats = load_multiple_stocks(file_list)
# 获取各维度Top 10
top_uplift = get_top_10(stats, 'uplift')
top_volume = get_top_10(stats, 'volume')
top_high = get_top_10(stats, 'high')
top_low = get_top_10(stats, 'low')
# 交叉分析
uplift_volume = cross_analyze(top_uplift, top_volume)
uplift_high = cross_analyze(top_uplift, top_high)
uplift_low = cross_analyze(top_uplift, top_low)
return {
'uplift_volume': uplift_volume,
'uplift_high': uplift_high,
'uplift_low': uplift_low
}
5. 分析结果可视化与应用
虽然本文聚焦Python内置工具的应用,但我们可以简单地将分析结果可视化,更直观地展示数据关系。
5.1 文本展示分析结果
def display_results(analysis):
"""以友好格式展示分析结果"""
print("涨幅与成交量交叉分析:")
print(f"两者均在前10: {analysis['uplift_volume']['both']}")
print(f"任一在前10: {analysis['uplift_volume']['either']}")
print(f"仅涨幅前10: {analysis['uplift_volume']['a_only']}")
print(f"不同时在前10: {analysis['uplift_volume']['not_both']}")
# 同样展示其他维度的分析结果...
5.2 实际应用场景
这些分析结果可以应用于:
- 发现"量价齐升"的潜力股(涨幅和成交量都在前10)
- 识别"无量上涨"的股票(涨幅前10但成交量不在前10)
- 找出"高价高增长"股票(涨幅和最高价都在前10)
- 筛选"低价超跌"股票(跌幅和最低价都在前10)
# 示例:找出量价齐升的股票
potential_stocks = analysis['uplift_volume']['both']
print(f"量价齐升的潜力股: {potential_stocks}")
通过组合不同的排序和集合运算,我们可以灵活地挖掘股票数据中的各种有价值信息,而这一切仅需Python的内置功能即可实现,无需依赖复杂的第三方库。这种方法特别适合快速验证想法或构建简单的分析工具。
更多推荐
所有评论(0)