当前位置: 首页 > news >正文

Python自动化获取雅虎/Stooq行情+蒙特卡洛模拟投资组合收益分布

本文还有配套的精品资源,点击获取

简介:直接运行main.py,自动从Yahoo Finance和Stooq拉取股票、ETF等日频收盘价数据,读取portFolio.中定义的持仓成分与权重,计算对数收益率并构建协方差矩阵;基于多变量正态分布假设,执行10000次蒙特卡洛抽样模拟,生成未来N期(默认252交易日)组合收益路径,输出预期年化收益、年化波动率、VaR值及收益分布直方图;全程无需手动下载数据或调整参数,依赖库为requests、pandas、numpy、matplotlib;注意确保本地网络可访问finance.yahoo.com和stooq.com,实际使用只需关注main.py和portFolio.两个文件,其他如.gitignore、.idea、requirements.txt等为开发辅助配置。

1. 这不是“又一个”金融分析脚本,而是一套可落地的组合压力测试工作流

我做量化工具开发和实盘组合管理有八年多,从最早手动下载Excel、用Excel做协方差矩阵,到后来写VBA宏、再迁移到Python,踩过的坑比跑过的回测还多。这套“Python自动化获取雅虎/Stooq行情+蒙特卡洛模拟投资组合收益分布”的工具,不是为炫技写的玩具代码,而是我在给三个高净值客户做季度组合复盘时,反复迭代出的最小可行工作流(MVP)。它解决的不是“能不能算”,而是“能不能在周一早上九点前,把带分布图的组合风险简报发给客户”。

核心关键词——蒙特卡洛模拟、雅虎财经API、Stooq数据、投资组合分析、Python金融——每一个都不是孤立存在:雅虎财经提供美股、港股、部分ETF的高频、免费、结构化日频数据;Stooq补足了雅虎缺失的关键标的,比如德国DAX成分股、日本TOPIX指数基金、波兰WIG20、甚至部分中国A股的港股通标的(如腾讯控股0700.HK在Stooq有更长的历史复权数据);两者结合,才能覆盖一个真正全球化配置组合所需的底层资产池。而蒙特卡洛模拟在这里的意义,远不止于画一张漂亮的直方图——它是在不依赖单一均值-方差假设的前提下,对组合未来一年(252交易日)可能遭遇的所有路径进行“穷举式压力采样”。你看到的VaR(95%置信水平下最大可能亏损),不是基于正态分布尾部的理论推导,而是从一万个真实模拟路径中直接数出来的第500个最差结果。

这个工具包最务实的设计在于“零干预启动”:你只需要维护好portFolio.json这个文件,里面用纯JSON定义你的持仓——股票代码、权重、是否需要复权、预期持有期(天数),其他全部交给main.py。它不会要求你去注册API Key,不会弹出浏览器让你手动登录,也不会因为某只股票在雅虎上找不到就整个流程崩掉(它会自动降级到Stooq重试)。我把它部署在一台老Mac mini上,每周日凌晨三点自动运行,生成PDF报告邮件发给我,五年来没出过一次网络超时导致的中断。如果你正在用Excel管理组合、靠券商APP看净值曲线、或者还在用“历史最大回撤”这种静态指标做决策,那么这套东西就是为你准备的——它不改变你的投资逻辑,只是把模糊的风险感知,变成可量化的概率分布。

2. 整体设计思路与关键取舍:为什么是雅虎+Stooq,而不是其他数据源?

2.1 数据源选型:免费、稳定、覆盖广的三角平衡

在金融数据领域,“免费”“稳定”“覆盖广”是个经典的不可能三角。彭博、Refinitiv的数据质量无可挑剔,但年费动辄数万美元;聚宽、掘金等国内平台对A股支持好,但对欧洲小盘股、新兴市场ETF支持薄弱;Alpha Vantage虽免费,但调用频率限制严苛(每分钟5次),且美股数据延迟达15分钟,无法用于日频回测。我们最终锁定Yahoo Finance + Stooq,是经过三年实盘验证的最优解:

  • Yahoo Finance:优势在于其yfinance库封装成熟、社区维护活跃、数据清洗逻辑透明(比如自动处理拆股、分红复权)。它对美股、港股、主要ETF(SPY、QQQ、IEFA)的支持几乎是行业标准。但短板也很明显:对东欧、拉美、非洲市场的覆盖近乎空白;部分小盘股(如波兰PKO Bank Polski,代码PKO.WA)只有最近3年数据;且自2023年起,其反爬策略升级,直接HTTP请求会返回403,必须通过yfinance库的Session机制绕过。

  • Stooq:这是一个被严重低估的宝藏站点。它由波兰华沙大学金融系维护,数据完全免费、无调用限制、支持CSV直接下载。最关键的是,它对欧洲、亚洲(含大量港股通标的)、拉丁美洲市场的覆盖远超雅虎。比如德国蓝筹股西门子(SIEMENS.DE)、日本丰田(7203.T)、巴西石油(PETR4.SA),在Stooq上都有超过20年的日频复权数据。它的缺点是接口原始——没有RESTful API,只能靠解析HTML表格或拼接CSV下载链接(如https://stooq.com/q/d/l/?s=siemens.de&i=d),且不提供实时行情,但对日频组合分析而言,这恰恰是优势:数据更干净,没有交易所快照的瞬时噪声。

提示:我们的工具包采用“主备双通道”策略。main.py首先尝试用yfinance拉取所有标的;若失败(HTTP 404或空数据),则自动提取代码后缀(如将AAPL转为aapl.us0700.HK转为0700.hk),构造Stooq CSV下载URL并重试。这种设计让组合里混入一只波兰国债ETF(如DBXG.DE)或一只越南VN30指数基金(VN30.VN)时,整个流程依然健壮。

2.2 蒙特卡洛建模:为什么坚持多变量正态分布,而非更“高级”的GARCH或Copula?

这里有个关键认知误区:很多人以为蒙特卡洛模拟越复杂越好,一定要用GARCH拟合波动率簇、用Copula建模尾部相关性。但在实盘组合管理中,过度复杂的模型反而会引入更多参数风险。我们坚持使用多变量正态分布,理由非常实际:

  1. 样本外稳定性优先:一个包含10只股票的组合,其收益率协方差矩阵需要至少1000个交易日(约4年)数据才能可靠估计。如果强行用GARCH,每个序列需单独拟合6个以上参数,10只股票就是60+个参数,而样本量只有1000,极易过拟合。实测表明,在滚动窗口回测中,简单协方差矩阵的20日预测误差,比GARCH(1,1)低12%。

  2. 计算效率决定实用性:10000次模拟,每次抽样需计算10维向量的矩阵乘法。用numpy.random.multivariate_normal,单次抽样耗时约0.8ms;若换成Copula抽样(需先拟合边缘分布、再估计相关性矩阵、最后逆变换),单次耗时飙升至15ms以上。10000次就是150秒 vs 8秒——这意味着你从“等一杯咖啡的时间”变成“等一顿午饭的时间”,极大降低迭代频率。

  3. 监管与沟通成本:当向客户解释“为什么组合有15%概率亏损超8%”时,说“我们基于过去5年收益率的联合分布做了1万次随机采样”比“我们用t-Copula拟合了边缘t分布和Kendall秩相关矩阵”更容易被理解。在财富管理场景中,模型的可解释性,有时比绝对精度更重要。

注意:我们并非忽略肥尾风险。在输出结果中,除了正态假设下的VaR,还会额外计算历史模拟VaR(直接从过去1000个交易日收益率中取第50小值)作为对照。两者差异超过3%时,会在报告中标红提示:“注意:正态假设可能低估尾部风险”。

2.3 架构设计:为什么是“端到端单文件”,而非模块化工程?

看到目录里只有main.pyportFolio.json两个核心文件,你可能会疑惑:这不符合软件工程最佳实践。但这是刻意为之的“反工程化”设计。原因有三:

  • 降低使用门槛:我的客户里有资深CIO,也有刚毕业的FOF基金经理助理。前者要的是结果,后者要的是能快速上手修改。如果拆成data_fetcher/risk_model/reporting/三个包,光是环境配置和路径导入就能劝退一半人。main.py一个文件,python main.py直接跑,符合“所见即所得”的直觉。

  • 规避版本碎片化:金融数据接口更新频繁。2023年雅虎改版后,yfinance库从0.1.75升级到0.2.28,Ticker.history()方法签名变了三次。如果模块化,每次升级都要改多个文件;而单文件结构,所有适配逻辑集中在一处,维护成本直线下降。

  • 便于审计与交付:当客户法务要求审查代码时,交出一个不到500行的main.py,比交出一个带12个.py文件的包更清晰。所有数据流向(拉取→清洗→计算→模拟→绘图)都在一个视觉平面上,没有隐藏的import链。

当然,这不意味着牺牲可维护性。我们在main.py内部用清晰的分段注释(# === DATA FETCHING ===# === RISK MODELING ===)和函数式风格组织逻辑,确保每一环节职责单一。后续若需扩展(如加入期权Gamma风险),只需在对应分段下添加几行代码,无需重构架构。

3. 核心细节解析与实操要点:从JSON配置到直方图生成的全链路

3.1portFolio.json:用最简JSON定义你的世界

这个文件是整个流程的“输入契约”,它的结构决定了你能分析什么。我们不采用YAML或Excel,因为JSON是程序员、分析师、甚至Excel Power Query都能直接读写的通用格式。一个典型配置如下:

{ "portfolio_name": "Global Equity Core", "holding_period_days": 252, "assets": [ { "symbol": "AAPL", "weight": 0.15, "source": "yahoo", "adjustment": "auto" }, { "symbol": "SIEMENS.DE", "weight": 0.12, "source": "stooq", "adjustment": "dividend_only" }, { "symbol": "0700.HK", "weight": 0.08, "source": "auto", "adjustment": "full" } ] }
  • symbol:必须是目标数据源识别的代码。雅虎用AAPLTSLA;Stooq用aapl.ustsla.ussiemens.de0700.hk。工具包内置了代码标准化映射表(如.HK自动转.hk.DE.de),避免用户手动转换。

  • weight:权重总和必须严格等于1.0。程序启动时会校验,若为0.999或1.001,会自动归一化并打印警告:“权重已自动归一化,原始和=0.999”。

  • source:指定首选数据源。“yahoo”强制走雅虎,“stooq”强制走Stooq,“auto”则按前述主备策略。实测发现,对港股通标的(如0700.HK),Stooq的数据长度比雅虎多出7年,因此设为auto是最优选择。

  • adjustment:复权方式,这是影响收益计算准确性的关键。“auto”由程序根据数据源智能判断(雅虎默认full,Stooq默认dividend_only);“full”包含拆股和分红;“dividend_only”仅调整分红;“none”不复权(仅用于测试)。强烈建议所有权益类资产设为full,否则长期持有收益会被严重低估。

实操心得:我曾遇到一个客户,其组合里有一只巴西REIT(HGLG11.SA),在雅虎上只有2020年后的数据。他最初设为"source": "yahoo",导致协方差矩阵因数据长度不一致而计算失败。改成"auto"后,程序自动切换到Stooq,获取到2015年至今的完整序列,问题迎刃而解。这个教训让我在main.py里加了一条硬规则:当任意资产数据长度<1000交易日时,强制触发备用源重试。

3.2 数据拉取与清洗:如何应对“403 Forbidden”和“空数据”?

网络请求是整个流程最脆弱的环节。main.py的拉取模块不是简单调用yf.Ticker(symbol).history(),而是构建了一个带状态机的重试引擎:

  1. 第一阶段:雅虎主通道
    - 使用yfinanceTicker对象,但禁用其默认的session,改用自定义requests.Session(),并设置headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'}模拟真实浏览器,规避基础反爬。
    - 设置timeout=30backoff_factor=1,最多重试3次。若返回空DataFrame或ValueError: No data found,进入第二阶段。

  2. 第二阶段:Stooq降级通道
    - 将符号标准化:AAPLaapl.us0700.HK0700.hkSIEMENS.DEsiemens.de
    - 拼接CSV下载URL:https://stooq.com/q/d/l/?s={symbol}&i=di=d表示日频)。
    - 使用requests.get()下载,若HTTP状态码非200,记录错误并跳过该资产(不影响整体流程)。
    - 对下载的CSV进行清洗:删除首行说明、处理日期列(Stooq日期格式为YYYY-MM-DD,与pandas兼容)、将Close列转为数值,缺失值用前向填充(ffill)。

  3. 第三阶段:数据对齐与截断
    - 所有资产数据统一索引为datetime64[ns],并按日期升序排列。
    - 取所有资产交集日期(df.index.intersection(...)),确保协方差矩阵计算时每个时间点都有全部资产的价格。
    - 截取最近1000个交易日(约4年),既保证统计显著性,又避免过长历史包含无效信息(如疫情前的低波动率时期)。

注意:Stooq的CSV下载有时会返回“服务器繁忙”页面(HTML),而非CSV。我们的代码会检查响应头Content-Type,若为text/html,则判定为失败,不尝试解析,直接跳过。这个细节让工具包在东南亚网络环境下也能稳定运行。

3.3 收益率计算与协方差矩阵构建:对数收益为何不可替代?

从价格到收益,是金融建模的第一道门槛。我们严格使用对数收益率(Log Return),公式为:r_t = ln(P_t / P_{t-1})。原因有三:

  • 时间可加性:持有N天的总收益等于每日对数收益之和,ln(P_N/P_0) = Σ ln(P_t/P_{t-1})。这使得蒙特卡洛模拟中,N期路径的收益可直接由N个单日抽样累加得到,数学上简洁且无近似误差。

  • 对称性:+10%涨和-10%跌的对数收益分别为ln(1.1)≈0.0953ln(0.9)≈-0.1054,幅度接近,符合直觉。而简单收益率(P_t/P_{t-1}-1)在下跌时会产生不对称偏差。

  • 统计性质优良:中心极限定理下,对数收益率更接近正态分布,尤其在日频尺度上。我们对100只美股过去10年的对数收益做Shapiro-Wilk检验,87%通过p>0.05,而简单收益率仅63%通过。

协方差矩阵构建步骤:
1. 将各资产对数收益率序列组成矩阵R(形状:[n_days, n_assets])。
2. 计算样本协方差矩阵Σ = cov(R),使用np.cov(R.T, ddof=1)ddof=1为无偏估计)。
3. 对角线元素即各资产方差,开方得标准差;非对角线元素为协方差,除以各自标准差得相关系数。

提示:协方差矩阵必须是半正定(Positive Semi-Definite),否则蒙特卡洛抽样会失败。我们加入了Cholesky分解校验:若np.linalg.cholesky(Σ)抛出LinAlgError,则用sklearn.covariance.EllipticEnvelope进行稳健协方差估计,并打印警告:“检测到协方差矩阵非正定,已启用稳健估计”。

3.4 蒙特卡洛模拟:10000次抽样的技术实现与内存优化

模拟的核心是numpy.random.multivariate_normal,但它有陷阱。直接调用multivariate_normal(mean, cov, size=10000)会生成一个[10000, n_assets]的数组,若组合有20只股票,内存占用高达10000×20×8字节=1.6MB,看似不大,但后续计算组合收益时需做矩阵乘法,易引发OOM。

我们的优化方案是分块抽样(Chunked Sampling)
- 将10000次模拟分为100块,每块100次。
- 每块内,用multivariate_normal抽样,立即计算该块内所有路径的组合收益(weights @ sample.T),然后丢弃原始抽样,只保留收益向量。
- 最终拼接100个收益向量,得到[10000, holding_period_days]的收益路径矩阵。

这样内存峰值从1.6MB降至0.16MB,且CPU缓存更友好。实测在8GB内存的树莓派4上也能流畅运行。

模拟逻辑伪代码:

# 假设 weights 是 [n_assets] 向量,cov_matrix 是 [n_assets, n_assets] # mean_returns 是 [n_assets] 向量(各资产日均对数收益) for chunk in range(100): # 抽样100次,得到 [100, n_assets] 的日收益矩阵 daily_returns_chunk = np.random.multivariate_normal( mean=mean_returns, cov=cov_matrix, size=100 ) # 计算组合日收益:[100, 1] = [100, n_assets] @ [n_assets, 1] portfolio_daily_returns = daily_returns_chunk @ weights.reshape(-1, 1) # 累积为N期路径:对每条路径,累加N天 paths_chunk = np.cumsum(portfolio_daily_returns, axis=1) all_paths.append(paths_chunk) # 合并所有块 full_paths = np.vstack(all_paths) # shape: [10000, N]

实操心得:早期版本我用scipy.stats.multivariate_normal.rvs,结果发现其随机数生成器与numpy不兼容,导致不同机器上结果不可复现。改为numpy.random.Generator(推荐)后,加上np.random.default_rng(seed=42),确保每次运行结果一致,这对回测审计至关重要。

4. 实操过程与核心环节实现:从命令行到PDF报告的完整旅程

4.1 环境准备与依赖安装:一行命令搞定

工具包的requirements.txt极其精简,只包含四个核心依赖:

yfinance==0.2.28 pandas==2.2.2 numpy==1.26.4 matplotlib==3.8.4

为什么不用scikit-learnstatsmodels?因为它们的功能(如稳健协方差)已被我们用原生numpy实现,避免引入不必要的依赖链。安装只需一行:

pip install -r requirements.txt

关键提醒yfinance0.2.28是目前最稳定的版本。新版本(如0.2.30)修复了某些港股代码解析bug,但也引入了对requests库的更高要求,可能导致旧系统报错。我们锁死版本,确保跨平台一致性。

4.2 首次运行:main.py的全流程输出解读

当你执行python main.py,控制台会逐阶段打印日志,这是调试和信任的基础:

=== STARTING PORTFOLIO ANALYSIS === Loading portfolio config from portFolio.json... Found 3 assets: AAPL (15.0%), SIEMENS.DE (12.0%), 0700.HK (8.0%) --- DATA FETCHING --- Fetching AAPL from yahoo... OK (1002 days) Fetching SIEMENS.DE from stooq... OK (2156 days) Fetching 0700.HK from auto... OK (1892 days) Aligning dates... OK (1000 common days) --- RISK MODELING --- Calculating log returns... OK Building covariance matrix... OK (semi-definite check PASSED) --- MONTE CARLO SIMULATION --- Running 10000 simulations for 252 days... DONE (42.3s) --- REPORTING --- Generating histogram... OK Saving report to report_Global_Equity_Core_20240520.pdf... OK === ANALYSIS COMPLETE ===

每一步的OKDONE后面都跟着关键指标(天数、耗时),让你一眼看出瓶颈在哪。比如若Fetching XXX from yahoo...卡住超过30秒,就知道是网络问题;若Building covariance matrix...后显示FAILED (not semi-definite),就知道要检查数据质量。

4.3 输出报告:一张图读懂组合风险

最终生成的PDF报告(如report_Global_Equity_Core_20240520.pdf)包含三页:

  • 第一页:核心统计摘要
  • 预期年化收益:E[r] * 252 * 100(%)
  • 年化波动率:std(r) * sqrt(252) * 100(%)
  • VaR (95%):模拟路径中第500个最差的期末收益(即损失最大值)
  • CVaR (95%):最差500条路径的平均期末收益(衡量尾部风险深度)

  • 第二页:收益分布直方图

  • X轴:期末累计收益(%),范围自动设定为[min-2%, max+2%]
  • Y轴:频次(10000次模拟中的出现次数)。
  • 红色竖线:预期收益(均值)。
  • 蓝色竖线:VaR (95%)位置。
  • 图表标题明确标注:“Monte Carlo Simulation (10,000 paths, 252 days)”。

  • 第三页:敏感性分析(可选)

  • 若组合中某资产权重变动±5%,对VaR的影响热力图。
  • 这部分代码在main.py中被注释掉,需手动取消注释启用,避免新手被信息淹没。

提示:直方图的bin数量我们固定为50。太少(如10)会掩盖分布形态;太多(如200)会产生噪声。50是经100次不同组合测试后,视觉清晰度与统计平滑度的最佳平衡点。

4.4 参数定制化:如何修改模拟次数和持有期?

虽然main.py默认10000次模拟、252天,但这两个参数绝非写死。它们来自portFolio.json的顶层字段:

{ "portfolio_name": "Global Equity Core", "holding_period_days": 252, "n_simulations": 10000, "assets": [ ... ] }

只需修改n_simulations5000,下次运行就会只做5000次,耗时减半。同样,将holding_period_days改为60,即可模拟一个季度(约60交易日)的风险。这种设计让用户无需碰Python代码,就能完成深度定制。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

5.1 网络访问失败:requests.exceptions.ConnectionError

现象:控制台报错ConnectionError: HTTPSConnectionPool(host='query1.finance.yahoo.com', port=443): Max retries exceeded...

原因与解决
-本地DNS污染:尤其在国内网络,finance.yahoo.com域名可能被劫持。解决方案:在/etc/hosts(Mac/Linux)或C:\Windows\System32\drivers\etc\hosts(Windows)中添加:
184.105.247.195 query1.finance.yahoo.com 184.105.247.195 download.finance.yahoo.com
IP地址可通过nslookup query1.finance.yahoo.com获取最新值。

  • 代理干扰:若系统设置了HTTP代理,requests会继承,导致连接雅虎失败。在main.py开头添加:
    python import os os.environ['NO_PROXY'] = 'finance.yahoo.com,stooq.com'

  • 防火墙拦截:企业网络常屏蔽境外域名。此时应强制走Stooq:将portFolio.json中所有资产的"source"设为"stooq",并确保Stooq域名未被屏蔽(其服务器在波兰,封锁较少)。

5.2 数据长度不一致:ValueError: operands could not be broadcast together

现象:程序在Aligning dates...后崩溃,报ValueError

原因:某只股票(如新上市的IPO)在雅虎上只有300天数据,而其他股票有1000天,取交集后只剩300天,不足以支撑协方差计算(通常要求>500天)。

解决
-短期方案:在portFolio.json中,为该资产添加"min_days": 300字段,程序会将其数据向前填充(用首日价格),凑够1000天。
-长期方案:在main.py的对齐逻辑中,加入“动态最小长度”算法:计算所有资产数据长度的中位数,以此为基准截取,而非硬性1000天。

5.3 直方图空白或异常:matplotlib后端问题

现象:PDF生成成功,但直方图页是空白,或X轴标签重叠成一条黑线。

原因matplotlib在无GUI环境(如服务器、Docker)下,默认Agg后端不支持字体渲染。

解决
- 在main.py顶部添加:
python import matplotlib matplotlib.use('Agg') # 强制使用非交互后端 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['DejaVu Sans', 'Arial', 'simhei'] # 中文字体回退
- 若仍乱码,下载simhei.ttf(黑体)到项目目录,添加:
python plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['font.sans-serif'] = ['simhei']

5.4 权重和不为1:UserWarning: Portfolio weights sum to 0.999

现象:控制台警告权重和非1.0,但程序继续运行。

原因:浮点数精度误差。如0.15 + 0.12 + 0.08在二进制中可能为0.34999999999999998

解决:这是正常现象,程序已内置归一化。但若警告中显示0.85,则说明JSON中权重写错了(如漏了小数点),需人工修正。

5.5 模拟结果波动大:为什么两次运行VaR相差5%?

现象:连续运行两次main.py,VaR值从-12.3%变为-17.1%

原因:蒙特卡洛本质是随机抽样,10000次虽大,但仍有抽样误差。VaR(95%)对应第500个最差结果,其标准误约为σ / sqrt(N),其中σ是收益分布标准差。

解决
-增加模拟次数:将n_simulations设为50000,VaR标准误降低至原来的sqrt(5)≈2.2倍。
-使用分层抽样(Stratified Sampling):在main.py中,将10000次抽样分为100组,每组100次,确保每组都覆盖收益分布的各个分位数,再合并结果。这能将VaR估计方差降低40%,且不增加总计算量。

最后分享一个小技巧:在main.py末尾,添加一行print(f"Seed used: {seed}"),其中seed是随机数生成器的种子。这样每次运行你都知道用了哪个种子,若想复现某次特定结果(比如那次VaR为-17.1%的极端情况),只需在代码中固定seed=12345,就能100%重现。这是我给客户的“审计后门”,他们很看重这一点。

本文还有配套的精品资源,点击获取

简介:直接运行main.py,自动从Yahoo Finance和Stooq拉取股票、ETF等日频收盘价数据,读取portFolio.中定义的持仓成分与权重,计算对数收益率并构建协方差矩阵;基于多变量正态分布假设,执行10000次蒙特卡洛抽样模拟,生成未来N期(默认252交易日)组合收益路径,输出预期年化收益、年化波动率、VaR值及收益分布直方图;全程无需手动下载数据或调整参数,依赖库为requests、pandas、numpy、matplotlib;注意确保本地网络可访问finance.yahoo.com和stooq.com,实际使用只需关注main.py和portFolio.两个文件,其他如.gitignore、.idea、requirements.txt等为开发辅助配置。


本文还有配套的精品资源,点击获取

http://www.gsyq.cn/news/1451385.html

相关文章:

  • 高中生科研实习:如何平衡热情与技能,在前沿科技项目中脱颖而出
  • Claude Code官方文档精华梳理(一)——定位、快速开始、核心概念、最佳实践(单个使用)
  • LitCAD:免费开源CAD软件终极指南,10分钟学会专业绘图
  • 让AI画个军棋棋盘,结果折腾了一整天
  • 保姆级教程:在Nvidia Jetson Orin(Ubuntu 20.04)上配置NoMachine远程桌面,含ARM64版deb包下载
  • 告别软件模拟!STM32F103硬件I2C驱动OLED屏实战(附标准库源码)
  • 手机端AI编程:KimiClaw和马维斯到底哪家强
  • 告别卡顿!用ArcGIS Pro 3的批处理功能高效转换超大OSGB模型为SLPK
  • 2026年质量好的门墙柜/定制门墙柜系统优质公司推荐 - 品牌宣传支持者
  • 深入Synopsys DesignWare PCIe IP:iATU地址匹配与BAR匹配实战配置详解(附避坑点)
  • 2026年知名的苏州薄膜ALD/ALD技术/ALD工艺开发公司对比推荐 - 品牌宣传支持者
  • AI模型注册平台选型难题:3类典型失败案例+4步标准化整合落地法
  • 智能驾驶NOA全解析:从技术原理到产业未来
  • 2026年5月观澜权威人流手术医院探寻
  • 2026年比较好的ALD设备/苏州光伏ALD稳定供货厂家推荐 - 行业平台推荐
  • 工业质检实战:用YOLOv8+DCNv4搞定NEU-DET钢材缺陷检测,mAP提升3个点
  • 保姆级教程:手把手教你用Canmv IDE给K210开发板烧录.bin和.kmodel文件到Flash
  • 黑马点评笔记千年后的大总结
  • 2026年质量好的农业机械力传感器/航空航天力传感器/苏州机器人力传感器/自动化设备力传感器优质厂家汇总推荐 - 行业平台推荐
  • 深入解析JetBrains Maple Mono字体合成架构与实现原理
  • 山东大学项目实训个人纪实(6)——降低唇形同步延迟及性能需求
  • ECG情绪识别避坑指南:WESAD和DREAMER数据集实战中的5个常见问题与解决
  • 深度解析:YouTube 自动标注 AI 生成内容背后的技术博弈与架构演进
  • 决策树特征选择实战:用信息增益帮你挑出‘好’特征(以鸢尾花数据集为例)
  • 从 inactive 到 runtime object,ABAP 开发对象激活机制的实战理解
  • 茄子快传与 WeTransfer 差距在哪?Bending Spoons 收购后 WeTransfer 月流水涨至 400 万+美元
  • Translumo:如何在3分钟内掌握Windows实时屏幕翻译的终极技巧
  • 导师骂你PPT逻辑乱?这个网站,自动帮你把论文变答辩神器
  • 告别旧版!Vitis Unified IDE 2023.2 保姆级配置指南:从OpenCV到Vision库,手把手搞定HLS开发环境
  • 零信任架构下AI视频分析平台落地全链路(2024最新NIST SP 800-207+ISO/IEC 27001双标验证)