news 2026/9/21 21:37:40

股票如何赚钱全解析:附完整示例代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
股票如何赚钱全解析:附完整示例代码

股票如何赚钱全解析:附完整示例代码

配置环境就卡半天,这种崩溃感我太懂了。刚想写个脚本跑数据,结果依赖包冲突、Python版本不对,折腾两小时还是报错。别急,今天这篇【股票如何赚钱】的深度拆解,直接给你一套能跑通的【完整示例】。

很多中小施工企业的老板问我:搞了这么多信息化系统,怎么没见着真金白银?其实,用编程思维看股市,和管项目逻辑是一样的:都是资源分配、风险控制和收益最大化。但传统散户靠“感觉”,我们用代码靠“数据”。

概念速懂:代码思维下的投资逻辑

在写第一行代码前,先对齐认知。所谓的“股票如何赚钱”,本质是解决两个问题:买卖时点判断风险控制

对于非技术背景的老板,你可能觉得这离你很远。但换个角度想,你管工地时,是不是要监控混凝土浇筑进度?是不是要预警材料超耗?股市量化交易就是把这种“监控”和“预警”自动化。

核心指标只有三个,也是后续代码要处理的:

  1. 均线 (MA):趋势的基准线。5日、20日均线是短期和中期成本的平均。
  2. 成交量 (Volume):资金的体温计。无量上涨是假突破,放量下跌是恐慌出逃。
  3. RSI (相对强弱指数):超买超卖信号。数值高于70通常意味着过热,低于30意味着超跌。

这套逻辑不玄学,全是数学公式。接下来我们把它翻译成计算机能听懂的指令。

环境准备:拒绝卡半天的标准流程

大部分教程在这里劝退读者,因为环境配置是个大坑。我直接给出一套在 Windows 10/11 和 Mac 上验证过的稳定方案。

第一步:创建独立虚拟环境 千万不要在系统全局 Python 里装库!这是90%报错的根源。打开终端(CMD 或 Terminal),执行:

# 创建名为 stock_demo 的虚拟环境
python -m venv stock_env# 激活环境 (Windows)
stock_env\Scripts\activate# 激活环境 (Mac/Linux)
source stock_env/bin/activate

第二步:安装核心依赖 我们需要 pandas 处理数据,akshare 获取A股数据(国内免费、无需Token,比 Tushare 方便),matplotlib 画图。

pip install pandas akshare matplotlib

注意akshare 接口偶尔会变动。如果安装后调用报错,去它的 GitHub 官方源码仓库 查看最新 Issue,通常社区会有修复方案。这是排查问题的第一步,别死磕本地代码。

第三步:验证环境 输入以下代码,如果打印出日期,说明环境OK:

import pandas as pd
print(pd.__version__)

如果这一步还卡住,检查你的 Python 版本。建议 3.8 - 3.11 之间。太新或太旧都有兼容性问题。

核心语法:数据获取与清洗

拿到数据只是第一步,脏数据会毁掉你的策略。A股数据有几个特点:复权价格、停牌日期、缺失值。

我们用 akshare 获取贵州茅台(600519)近一年的日线数据。

import akshare as ak
import pandas as pd# 获取日线数据,start_date 和 end_date 格式为 YYYYMMDD
df = ak.stock_zh_a_hist(symbol="600519",period="daily",start_date="20230101",end_date="20240101",adjust="qfq"  # 前复权,计算收益率必须用这个
)# 查看数据头部
print(df.head())

关键点解释

  • adjust="qfq":前复权。如果不加这个,遇到分红除权,你的K线图会出现断崖式下跌,导致计算错误。
  • 数据列名通常是中文(如“开盘”、“收盘”、“成交量”),后续计算时需注意列名匹配。

接下来,计算核心指标。这里展示 RSI 的计算逻辑,这是判断“超买超卖”的关键。

def calculate_rsi(df, period=14):"""计算 RSI 指标:param df: 包含 'close' 列的 DataFrame:param period: 周期,通常取 14:return: 带有 'rsi' 列的新 DataFrame"""# 1. 计算价格变动delta = df['close'].diff()# 2. 分离上涨和下跌up = delta.where(delta > 0, 0)down = -delta.where(delta < 0, 0)# 3. 计算指数移动平均 (EMA)# ewm(span=period) 是 pandas 计算 EMA 的标准方法up_avg = up.ewm(com=period-1, min_periods=period).mean()down_avg = down.ewm(com=period-1, min_periods=period).mean()# 4. 计算 RS 和 RSIrs = up_avg / down_avgrsi = 100 - (100 / (1 + rs))df['rsi'] = rsireturn df# 执行计算
df = calculate_rsi(df)
print(df[['close', 'rsi']].tail())

这段代码是可运行的。ewm 函数是指数加权移动平均,比简单移动平均更灵敏,能更快反映近期价格变化。

完整代码示例:构建一个简易策略

现在,我们把逻辑串起来。策略很简单:RSI < 30 且 收盘价 > 20日均线,买入;RSI > 70 且 收盘价 < 20日均线,卖出。

这是一个典型的“超跌反弹+趋势确认”策略。

import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt
import numpy as npdef run_strategy(symbol="600519"):# 1. 获取数据print(f"正在获取 {symbol} 数据...")df = ak.stock_zh_a_hist(symbol=symbol,period="daily",start_date="20230101",end_date="20240101",adjust="qfq")# 2. 重命名列,方便使用df.columns = ['date', 'open', 'close', 'high', 'low', 'volume', 'turnover', 'amplitude', 'pct_chg', 'chg']df['date'] = pd.to_datetime(df['date'])df.set_index('date', inplace=True)# 3. 计算指标df['ma20'] = df['close'].rolling(window=20).mean()df['rsi'] = calculate_rsi(df, period=14)['rsi']# 4. 生成信号# 初始状态:无持仓df['signal'] = 0# 买入条件:RSI < 30 且 Close > MA20# 卖出条件:RSI > 70 且 Close < MA20# 注意:实际交易中,信号是离散的,这里简化为逻辑判断for i in range(len(df)):if i == 0:continue# 状态机逻辑:# 如果之前没买,且满足买入条件,则标记为买入(1)# 如果之前买了(signal=1),且满足卖出条件,则标记为卖出(-1)if df['signal'].iloc[i-1] == 0:if df['rsi'].iloc[i] < 30 and df['close'].iloc[i] > df['ma20'].iloc[i]:df.loc[df.index[i], 'signal'] = 1elif df['signal'].iloc[i-1] == 1:if df['rsi'].iloc[i] > 70 and df['close'].iloc[i] < df['ma20'].iloc[i]:df.loc[df.index[i], 'signal'] = -1else:# 保持之前状态,或者重置为0如果逻辑失效df.loc[df.index[i], 'signal'] = df['signal'].iloc[i-1]# 5. 计算策略收益# 简化处理:假设信号当天收盘买入/卖出df['returns'] = df['close'].pct_change()df['strategy_returns'] = df['signal'] * df['returns'].shift(1)# 累计收益df['cumulative_return'] = (1 + df['strategy_returns']).cumprod()df['buy_and_hold'] = (1 + df['returns']).cumprod()# 6. 可视化plt.figure(figsize=(12, 6))plt.plot(df['cumulative_return'], label='Strategy')plt.plot(df['buy_and_hold'], label='Buy & Hold', alpha=0.7)plt.title(f'Strategy Performance for {symbol}')plt.legend()plt.grid(True)plt.show()# 输出统计信息final_return = df['cumulative_return'].iloc[-1] - 1bh_return = df['buy_and_hold'].iloc[-1] - 1print(f"策略总收益率: {final_return:.2%}")print(f"持有总收益率: {bh_return:.2%}")return df# 运行策略
if __name__ == "__main__":result_df = run_strategy("600519")

代码逐行解析

  • 状态机逻辑:这是最容易出错的地方。必须判断“上一次”的状态。如果上次是0(空仓),才看买入条件;如果上次是1(持仓),才看卖出条件。否则会出现“一边买一边卖”的逻辑漏洞。
  • shift(1):这是量化交易的灵魂。今天的收益,是由昨天的持仓决定的。shift(1) 将信号滞后一天,避免“未来函数”作弊。如果你不写这个,你的回测收益会虚高得离谱,因为你在用今天的收盘信号去赚今天的钱,这在现实中是不可能的。
  • cumprod:复利计算。收益不是相加,是相乘。10% + 10% 不等于 20%,而是 21%。

常见报错与避坑指南

在跑上面代码时,你可能会遇到这些坑,我直接给出解决方案。

1. KeyError: 'close'

  • 原因akshare 返回的列名可能是中文,或者版本更新导致列名变化。
  • 解决:在获取数据后,先 print(df.columns) 检查。如果是中文,统一重命名:
    df.rename(columns={'收盘': 'close', '成交量': 'volume'}, inplace=True)
    

2. RuntimeWarning: Mean of empty slice

  • 原因rolling(window=20) 在前19天没有足够数据计算均线,产生 NaN。
  • 解决:在计算信号前,删除 NaN 行:
    df.dropna(subset=['ma20', 'rsi'], inplace=True)
    

3. 数据获取超时或为空

  • 原因:网络波动或 akshare 接口限制。
  • 解决:增加重试机制,或更换数据源。如果是小盘股,数据可能缺失较多,建议先测试大盘蓝筹股(如600519, 000001)。

4. 图表中文显示乱码

  • 原因:Matplotlib 默认字体不支持中文。
  • 解决
    plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows
    # plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # Mac
    plt.rcParams['axes.unicode_minus'] = False
    

小结与进阶方向

通过这套【完整示例】,你应该已经能跑通一个最基础的量化策略了。但请记住,回测赚钱不等于实盘赚钱

这个策略忽略了滑点、手续费、以及流动性风险。在实际操作中,尤其是对于中小施工企业这种资金量级,风险控制永远排在收益前面

下一步你可以尝试:

  1. 加入止损机制:亏损超过5%强制平仓。
  2. 多因子模型:不仅仅看 RSI 和 MA,加入 MACD、布林带等指标进行投票。
  3. 参数优化:使用网格搜索,找到最佳的 RSI 阈值(比如是 30 还是 35?)和均线周期(20 还是 25?)。

技术是工具,不是水晶球。代码能帮你剔除情绪,但无法预测黑天鹅。

这个知识点你面试被问过吗?或者你在实际跑代码时遇到了什么奇葩报错?留言说说,我看看能帮你避个坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 21:37:18

520高清图解原理:3分钟搞定代码跑不通的调试难题

520高清图解原理:3分钟搞定代码跑不通的调试难题 复制来的代码跑不通不知道怎么调,是不是你也遇到过这种崩溃时刻?明明照着教程敲,报错信息却像天书一样看不懂。其实问题往往出在对底层机制的理解缺失上。今天咱们不聊虚的,直接通过 图解原理…

作者头像 李华
网站建设 2026/9/21 21:36:32

面试总被问 DLCO 原理?这份 5 点避坑指南让你稳拿高薪

面试总被问 DLCO 原理?这份 5 点避坑指南让你稳拿高薪 面试官:“讲讲 DLCO 的内存管理原理,为什么你的模型加载这么慢?” 你:“呃……它是动态库加载优化?还是某种特定的通信协议?我……” 那一刻,空气凝固了。这不是你一个人的尴尬,而是无数后端与高性能计算开发者的共同噩梦。 很多人对…

作者头像 李华
网站建设 2026/9/21 21:36:27

亲疏有别:大厂面试中权限控制的5个致命坑,新手避坑指南

亲疏有别:大厂面试中权限控制的5个致命坑,新手避坑指南 配置环境就卡半天,代码跑不通,面试被问懵?别急,这往往是你对“亲疏有别”理解太浅。在编程语境下,“亲疏有别”并非人情世故,而是指 系统对内部核心逻辑与外部输入数据、对高权限操作与低权限查询之间,必须建立严格的隔离与校验机制 。…

作者头像 李华
网站建设 2026/9/21 21:36:20

3b搜手写实现全解:告别配置卡壳,30分钟跑通搜索

3b搜手写实现全解:告别配置卡壳,30分钟跑通搜索 配置环境就卡半天,是不是你的常态?装个依赖报错,改个配置又崩,时间全耗在环境里,代码一行没写。别再被那些黑盒工具绑架了,今天咱们直接 手写实现 一个核心搜索功能,用 Python…

作者头像 李华
网站建设 2026/9/21 21:36:08

搞定分子生物学试题源码解析:3步调通报错代码

搞定分子生物学试题源码解析:3步调通报错代码 刚拿到一套分子生物学试题的自动化判分脚本,是不是打开终端一跑,满屏红色的 Traceback?那种“复制来的代码跑不通不知道怎么调”的绝望感,我懂。别慌,这通常是环境依赖或者数据格式没对齐导致的。今天咱们不整虚的,直接上 源码解析…

作者头像 李华