3、Python基础回顾:变量与数据类型、控制流(if/for/while)、函数定义、列表与字典操作
说实话,很多做金融的朋友一听到「编程」两个字就头大。我特别理解。当年我带团队做量化交易系统时,有个同事是华尔街回来的交易员,数学底子极好,但看到 Python 代码就发怵。后来我花了半天时间,就给他讲了今天要聊的这几个基础概念。结果他第二天就开始自己写策略回测了。
Python 在金融领域这么流行,说白了就三个原因:上手快、库多、社区活跃。你不需要成为计算机专家,只需要掌握最核心的 20% 语法,就能解决 80% 的金融数据处理问题。今天我们就来啃这 20%。
核心观点:金融建模中,80% 的代码量集中在数据准备和清洗上。变量、控制流、函数、列表和字典,就是处理这些数据的四把瑞士军刀。
3.1 变量与数据类型:金融数据的基石
变量是什么?说白了就是给数据贴个标签。你想想看,在 Excel 里你要引用某个单元格,得记住它的坐标,比如 B2、C3。但在 Python 里,你可以给任何数据起个名字,比如 stock_price、trade_volume,多直观。
Python 是动态类型语言,这意味着你不需要像 Java 那样提前声明「这个变量是整数还是字符串」。我刚开始用 Python 时觉得这太爽了,但后来踩过坑——有一次我把股票代码当成了整数处理,结果代码跑出来全是错的。嗯,这里要注意:股票代码「000001」是字符串,不是数字。
| 数据类型 | 示例 | 金融场景 |
|---|---|---|
| int(整数) | volume = 10000 |
成交量、持仓量 |
| float(浮点数) | price = 12.58 |
股价、收益率 |
| str(字符串) | code = '600519' |
股票代码、公司名称 |
| bool(布尔值) | is_trading = True |
交易状态、条件判断 |
我的小技巧:处理金融数据时,我习惯用 type() 函数先检查一下数据类型。比如 type(price) 返回 <class 'float'>,确认无误后再往下写。这能省掉很多调试时间。
# 实战:计算股票收益率
open_price = 10.5 # 开盘价
close_price = 11.2 # 收盘价
return_rate = (close_price - open_price) / open_price
print(f"今日收益率:{return_rate:.2%}") # 输出:今日收益率:6.67%
3.2 控制流:让代码学会做决策
控制流就是让代码「动脑子」。没有控制流的代码,就像一条笔直的高速公路,只能一直往前开。但金融世界里哪有那么多直线?
3.2.1 if 条件判断
if 语句说白了就是「如果...就...」。我在做风控系统时,if 语句用得最多。比如判断是否触发止损线:
current_price = 98.5
stop_loss = 100.0
if current_price < stop_loss:
print("触发止损!立即平仓")
elif current_price < stop_loss * 1.05:
print("接近止损线,请关注")
else:
print("持仓正常")
我曾经踩过的坑:在 Python 里,if 0、if None、if '' 都会被当作 False 处理。有一次我写 if trade_volume: 来判断成交量是否为零,结果成交量刚好是 0 时,代码直接跳过了后续处理。后来我改成 if trade_volume is not None and trade_volume > 0:,才彻底解决。
3.2.2 for 循环:批量处理数据
金融数据通常是一批一批的。比如你要计算过去 30 天的平均收益率,难道要手动算 30 次?用 for 循环,几行代码搞定。
# 计算过去5天的平均收盘价
closing_prices = [10.2, 10.5, 10.3, 10.8, 10.6]
total = 0
for price in closing_prices:
total += price
average = total / len(closing_prices)
print(f"5日均价:{average:.2f}")
你想想看,如果数据量是 1000 条,甚至 100 万条,for 循环的优势就体现出来了。我个人习惯在循环里加个计数器,方便调试时定位问题。
3.2.3 while 循环:条件驱动
while 循环和 for 循环的区别在于:for 循环知道要循环多少次,while 循环不知道。比如模拟交易直到资金耗尽:
balance = 100000 # 初始资金10万
trade_count = 0
while balance > 0:
# 模拟一次交易,随机盈亏
import random
profit = random.uniform(-5000, 5000)
balance += profit
trade_count += 1
print(f"第{trade_count}次交易后余额:{balance:.2f}")
print("交易结束,资金已耗尽")
重要提醒:while 循环一定要有终止条件,否则会变成死循环。我见过有人写 while True: 忘了加 break,结果程序跑了一整夜。嗯,别问我怎么知道的。
3.3 函数定义:把代码装进盒子里
函数是什么?就是把一段逻辑封装起来,给它起个名字,以后想用就调用这个名字。为什么要这么做?因为金融分析中,很多操作是重复的——计算收益率、计算波动率、数据清洗……每次都写一遍同样的代码,太傻了。
def calculate_sharpe_ratio(returns, risk_free_rate=0.03):
"""
计算夏普比率
:param returns: 收益率列表
:param risk_free_rate: 无风险利率,默认3%
:return: 夏普比率
"""
import statistics
avg_return = statistics.mean(returns)
std_dev = statistics.stdev(returns)
sharpe = (avg_return - risk_free_rate) / std_dev
return sharpe
# 使用函数
daily_returns = [0.01, 0.02, -0.005, 0.015, 0.008]
ratio = calculate_sharpe_ratio(daily_returns)
print(f"夏普比率:{ratio:.2f}")
写函数时,我建议你养成写文档字符串(docstring)的习惯。就是函数定义下面那三个引号括起来的内容。为什么?因为三个月后你回头看自己的代码,很可能已经忘了这个函数是干嘛的。我吃过这个亏,真的。
我的习惯:每个函数只做一件事。如果一个函数超过 20 行,我就考虑拆分成更小的函数。这样调试起来特别方便,哪个环节出问题,直接定位到对应的函数就行。
3.4 列表与字典:金融数据的容器
列表和字典是 Python 里最常用的两种数据结构。列表像有序的抽屉柜,每个抽屉有编号(索引)。字典像带标签的储物箱,每个箱子有个名字(键)。
3.4.1 列表操作
列表在金融里最常见的用途就是存储时间序列数据。比如某只股票连续 5 天的收盘价:
# 创建列表
prices = [10.2, 10.5, 10.3, 10.8, 10.6]
# 增
prices.append(10.9) # 添加第6天数据
prices.insert(0, 10.0) # 在开头插入数据
# 删
prices.pop() # 删除最后一个
prices.remove(10.3) # 删除指定值
# 改
prices[0] = 10.1 # 修改第一个元素
# 查
max_price = max(prices)
min_price = min(prices)
print(f"最高价:{max_price},最低价:{min_price}")
3.4.2 字典操作
字典在金融里更适合存储「键值对」数据。比如一只股票的各种属性:
# 创建字典
stock_info = {
"code": "600519",
"name": "贵州茅台",
"price": 1888.0,
"pe_ratio": 35.6,
"market_cap": 23700 # 单位:亿
}
# 增
stock_info["dividend_yield"] = 0.015 # 股息率
# 删
del stock_info["pe_ratio"] # 删除市盈率字段
# 改
stock_info["price"] = 1900.0 # 更新价格
# 查
print(f"股票名称:{stock_info['name']}")
print(f"当前市值:{stock_info['market_cap']}亿")
# 遍历字典
for key, value in stock_info.items():
print(f"{key}: {value}")
实战技巧:我经常用列表嵌套字典的方式来管理投资组合。比如:
portfolio = [
{"code": "600519", "shares": 100, "buy_price": 1800},
{"code": "000858", "shares": 200, "buy_price": 120},
{"code": "601318", "shares": 150, "buy_price": 65}
]
# 计算总持仓市值
total_value = 0
for stock in portfolio:
total_value += stock["shares"] * stock["buy_price"]
print(f"总持仓成本:{total_value:.2f}元")
好了,Python 基础回顾就到这里。这些内容看起来简单,但金融建模中 90% 的操作都离不开它们。你不需要一次性全部记住,写代码时多查查文档,慢慢就熟练了。记住:代码是写给人看的,顺便让机器执行。写得清晰、易读,比写得「炫技」重要得多。