记录9净利润断层

我有一个Excel表格“披露日期”,第一行是名称,第二行开始都是数据。第一列是“”证券代码,第二列是“”证券名称,第三列是“”申万行业。从第四列开始都是定期报告(包括一季报,中报和三季报)的披露日期,从2015年的一季报到2025年的中报。名称分别是“定期报告实际披露日期[报告期]2015一季”这样的(但为了防止出错,你后面这些列写代码的时候可以不写名称,共有32列就对了。),然后具体的形式是2017-08-27这样的,但是有一些股票在有些年份没有数据,显示的是“--”。然后帮我写一个Python代码,进行一个净利润断层投资组合的回测。我的组合构建是这样的:每年的5月1日,9月1日,11月1日进行调仓,所选择的投资组合为该公司的该季度财报披露日期的下一个交易日股票价格高开的那些股票,等权重构建投资组合。比如5月1日就是根据一季报的情况构建组合,9月1日根据中报构建组合,11月1日根据三季报构建组合。然后比较我的投资组合的累计收益率和全A的收益率,画一个折线图比较。然后关于每只股票所需要的前收盘价和开盘价,还有全a的前收盘价开盘价等信息,你可以通过牌子调用免费的库来获取,比如akshare。我的pandas版本是 1.5.3, numpy是1.24.3,akshare版本是1.17.49.你记得指定使用这几个版本,然后用兼容的语言,避免我刚才问你的问题
最新发布
09-13
报错:KeyError: &#39;monthly_return&#39; 代码:import os import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime, timedelta import warnings warnings.filterwarnings(&#39;ignore&#39;) # 设置中文字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;, &#39;Arial Unicode MS&#39;, &#39;DejaVu Sans&#39;] plt.rcParams[&#39;axes.unicode_minus&#39;] = False class MultiFactorArbitrageStrategy: def __init__(self, data_path: str, start_date: str = &#39;2014-01-01&#39;, end_date: str = &#39;2024-12-31&#39;): """ 多因子多空套利策略 Args: data_path: 数据文件路径 start_date: 回测开始日期 end_date: 回测结束日期 """ self.data_path = data_path self.start_date = pd.to_datetime(start_date) self.end_date = pd.to_datetime(end_date) self.data = None self.factor_data = None self.strategy_results = None # 策略参数 self.window_size = 6 # 6个月滚动窗口 self.top_n = 20 # 选股数量 self.short_n = 20 # 做空数量 self.rebalance_freq = &#39;M&#39; # 月度调仓 def load_and_preprocess_data(self): """加载和预处理数据""" print("正在加载数据...") self.data = pd.read_csv(self.data_path, low_memory=False) # 处理重复列 if self.data.columns.duplicated().any(): self.data = self.data.loc[:, ~self.data.columns.duplicated()] # 转换日期格式 self.data[&#39;TradingMonth&#39;] = pd.to_datetime(self.data[&#39;TradingMonth&#39;]) # 过滤时间范围 self.data = self.data[ (self.data[&#39;TradingMonth&#39;] >= self.start_date) & (self.data[&#39;TradingMonth&#39;] <= self.end_date) ].copy() # 确保数据按时间和股票代码排序 self.data = self.data.sort_values([&#39;TradingMonth&#39;, &#39;Stkcd&#39;]).reset_index(drop=True) # 删除重复数据 self.data = self.data.drop_duplicates(subset=[&#39;TradingMonth&#39;, &#39;Stkcd&#39;], keep=&#39;first&#39;) print(f"数据加载完成,共 {len(self.data)} 条记录") print(f"时间范围: {self.data[&#39;TradingMonth&#39;].min()} 到 {self.data[&#39;TradingMonth&#39;].max()}") print(f"股票数量: {self.data[&#39;Stkcd&#39;].nunique()}") def calculate_financial_factors(self, group: pd.DataFrame) -> dict: """计算财务因子""" factors = {} available_columns = set(group.columns) # 财务指标映射 financial_indicators = { &#39;roe&#39;: [&#39;ROE&#39;, &#39;roe&#39;, &#39;净资产收益率&#39;], &#39;roa&#39;: [&#39;ROA&#39;, &#39;roa&#39;, &#39;总资产收益率&#39;], &#39;gross_profit_margin&#39;: [&#39;GrossProfitMargin&#39;, &#39;gross_profit_margin&#39;, &#39;毛利率&#39;], &#39;net_profit_margin&#39;: [&#39;NetProfitMargin&#39;, &#39;net_profit_margin&#39;, &#39;净利率&#39;], &#39;asset_turnover&#39;: [&#39;AssetTurnover&#39;, &#39;asset_turnover&#39;, &#39;总资产周转率&#39;], &#39;current_ratio&#39;: [&#39;CurrentRatio&#39;, &#39;current_ratio&#39;, &#39;流动比率&#39;], &#39;debt_to_equity&#39;: [&#39;DebtToEquity&#39;, &#39;debt_to_equity&#39;, &#39;资产负债率&#39;], &#39;revenue_growth&#39;: [&#39;RevenueGrowth&#39;, &#39;revenue_growth&#39;, &#39;营业收入增长率&#39;], &#39;profit_growth&#39;: [&#39;ProfitGrowth&#39;, &#39;profit_growth&#39;, &#39;净利润增长率&#39;], &#39;pe_ratio&#39;: [&#39;PERatio&#39;, &#39;pe_ratio&#39;, &#39;市盈率&#39;], &#39;pb_ratio&#39;: [&#39;PBRatio&#39;, &#39;pb_ratio&#39;, &#39;市净率&#39;], &#39;ps_ratio&#39;: [&#39;PSRatio&#39;, &#39;ps_ratio&#39;, &#39;市销率&#39;] } for factor_name, possible_columns in financial_indicators.items(): found_column = None for col in possible_columns: if col in available_columns: found_column = col break if found_column: try: value = group[found_column].mean() if not pd.isna(value) and value != 0: factors[factor_name] = value except: pass return factors def calculate_technical_factors(self, group: pd.DataFrame) -> dict: """计算技术因子""" factors = {} try: # 价格相关因子 if &#39;Clsprc&#39; in group.columns: close = group[&#39;Clsprc&#39;] high = group[&#39;Hiprc&#39;] if &#39;Hiprc&#39; in group.columns else close low = group[&#39;Loprc&#39;] if &#39;Loprc&#39; in group.columns else close # 移动平均线 for window in [5, 10, 20, 60]: ma = close.rolling(window=window).mean().iloc[-1] if not pd.isna(ma): factors[f&#39;ma{window}&#39;] = ma # MACD exp1 = close.ewm(span=12, adjust=False).mean() exp2 = close.ewm(span=26, adjust=False).mean() macd = exp1 - exp2 signal = macd.ewm(span=9, adjust=False).mean() if not pd.isna(macd.iloc[-1]): factors[&#39;macd&#39;] = macd.iloc[-1] if not pd.isna(signal.iloc[-1]): factors[&#39;macd_signal&#39;] = signal.iloc[-1] # RSI delta = close.diff() gain = (delta.where(delta > 0, 0)).rolling(window=14).mean() loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean() rs = gain / loss rsi = 100 - (100 / (1 + rs.iloc[-1])) if not pd.isna(rsi): factors[&#39;rsi&#39;] = rsi # 布林带 bb_middle = close.rolling(window=20).mean().iloc[-1] if not pd.isna(bb_middle): factors[&#39;bb_middle&#39;] = bb_middle std = close.rolling(window=20).std().iloc[-1] if not pd.isna(std): factors[&#39;bb_upper&#39;] = bb_middle + 2 * std factors[&#39;bb_lower&#39;] = bb_middle - 2 * std # 收益率相关因子 returns = close.pct_change() factors[&#39;return_mean&#39;] = returns.mean() factors[&#39;return_std&#39;] = returns.std() factors[&#39;return_skew&#39;] = returns.skew() factors[&#39;return_kurt&#39;] = returns.kurtosis() # 价格位置 factors[&#39;price_position&#39;] = (close.iloc[-1] - low.min()) / (high.max() - low.min()) except Exception as e: pass return factors def calculate_market_factors(self, group: pd.DataFrame) -> dict: """计算市场因子""" factors = {} try: # 市值因子 if &#39;Dsmvtll&#39; in group.columns: market_value = group[&#39;Dsmvtll&#39;].mean() if not pd.isna(market_value): factors[&#39;market_value&#39;] = market_value factors[&#39;log_market_value&#39;] = np.log(market_value) # 成交量因子 if &#39;Dnvaltrd&#39; in group.columns: volume = group[&#39;Dnvaltrd&#39;] factors[&#39;volume_mean&#39;] = volume.mean() factors[&#39;volume_std&#39;] = volume.std() factors[&#39;volume_ratio&#39;] = volume.iloc[-1] / volume.mean() if volume.mean() > 0 else 1 # 波动率因子 if &#39;Clsprc&#39; in group.columns: returns = group[&#39;Clsprc&#39;].pct_change() factors[&#39;volatility&#39;] = returns.std() * np.sqrt(252) # 年化波动率 except Exception as e: pass return factors def calculate_all_factors(self): """计算所有因子""" print("正在计算因子...") results = [] grouped_data = self.data.groupby([&#39;TradingMonth&#39;, &#39;Stkcd&#39;]) for (trading_month, stkcd), group in grouped_data: factor_values = { &#39;TradingMonth&#39;: trading_month, &#39;Stkcd&#39;: stkcd } # 计算各类因子 financial_factors = self.calculate_financial_factors(group) technical_factors = self.calculate_technical_factors(group) market_factors = self.calculate_market_factors(group) factor_values.update(financial_factors) factor_values.update(technical_factors) factor_values.update(market_factors) results.append(factor_values) self.factor_data = pd.DataFrame(results) # 处理缺失值 factor_cols = [col for col in self.factor_data.columns if col not in [&#39;TradingMonth&#39;, &#39;Stkcd&#39;]] self.factor_data[factor_cols] = self.factor_data[factor_cols].fillna(method=&#39;ffill&#39;).fillna(method=&#39;bfill&#39;) # 标准化因子 for col in factor_cols: if self.factor_data[col].std() > 0: self.factor_data[col] = (self.factor_data[col] - self.factor_data[col].mean()) / self.factor_data[col].std() print(f"因子计算完成,共 {len(factor_cols)} 个因子") print(f"因子数据形状: {self.factor_data.shape}") def dynamic_factor_selection(self, date: pd.Timestamp, window_months: int = 6) -> list: """动态因子选择""" # 获取历史数据窗口 start_date = date - pd.DateOffset(months=window_months) historical_data = self.factor_data[ (self.factor_data[&#39;TradingMonth&#39;] >= start_date) & (self.factor_data[&#39;TradingMonth&#39;] < date) ] if len(historical_data) == 0: return [] # 计算因子与未来收益的相关性 factor_cols = [col for col in historical_data.columns if col not in [&#39;TradingMonth&#39;, &#39;Stkcd&#39;]] # 计算未来1个月收益 historical_data = historical_data.sort_values([&#39;Stkcd&#39;, &#39;TradingMonth&#39;]) historical_data[&#39;future_return&#39;] = historical_data.groupby(&#39;Stkcd&#39;)[&#39;TradingMonth&#39;].shift(-1) # 计算因子重要性(基于与未来收益的相关性) factor_importance = {} for factor in factor_cols: try: correlation = historical_data[factor].corr(historical_data[&#39;future_return&#39;]) if not pd.isna(correlation): factor_importance[factor] = abs(correlation) except: factor_importance[factor] = 0 # 选择最重要的因子 sorted_factors = sorted(factor_importance.items(), key=lambda x: x[1], reverse=True) selected_factors = [factor for factor, importance in sorted_factors[:20]] # 选择前20个因子 return selected_factors def calculate_stock_scores(self, date: pd.Timestamp, selected_factors: list) -> pd.DataFrame: """计算股票评分""" current_data = self.factor_data[self.factor_data[&#39;TradingMonth&#39;] == date].copy() if len(current_data) == 0 or len(selected_factors) == 0: return pd.DataFrame() # 计算综合评分 score = 0 for factor in selected_factors: if factor in current_data.columns: # 对于某些因子,负值可能更好(如估值因子) if factor in [&#39;pe_ratio&#39;, &#39;pb_ratio&#39;, &#39;ps_ratio&#39;, &#39;debt_to_equity&#39;]: score -= current_data[factor] else: score += current_data[factor] current_data[&#39;score&#39;] = score return current_data.sort_values(&#39;score&#39;, ascending=False) def calculate_returns(self, date: pd.Timestamp, positions: dict) -> float: """计算策略收益""" next_month = date + pd.DateOffset(months=1) current_prices = self.data[self.data[&#39;TradingMonth&#39;] == date][[&#39;Stkcd&#39;, &#39;Clsprc&#39;]].set_index(&#39;Stkcd&#39;)[&#39;Clsprc&#39;] next_prices = self.data[self.data[&#39;TradingMonth&#39;] == next_month][[&#39;Stkcd&#39;, &#39;Clsprc&#39;]].set_index(&#39;Stkcd&#39;)[&#39;Clsprc&#39;] total_return = 0 for stkcd, position in positions.items(): if stkcd in current_prices.index and stkcd in next_prices.index: current_price = current_prices[stkcd] next_price = next_prices[stkcd] if current_price > 0: stock_return = (next_price - current_price) / current_price total_return += position * stock_return return total_return / len(positions) if positions else 0 def run_backtest(self): """运行回测""" print("开始回测...") # 获取所有调仓日期 rebalance_dates = pd.date_range( start=self.factor_data[&#39;TradingMonth&#39;].min() + pd.DateOffset(months=self.window_size), end=self.factor_data[&#39;TradingMonth&#39;].max(), freq=self.rebalance_freq ) backtest_results = [] current_positions = {} for date in rebalance_dates: # 动态因子选择 selected_factors = self.dynamic_factor_selection(date) if len(selected_factors) == 0: continue # 计算股票评分 scored_stocks = self.calculate_stock_scores(date, selected_factors) if len(scored_stocks) == 0: continue # 选择多空股票 long_stocks = scored_stocks.head(self.top_n)[&#39;Stkcd&#39;].tolist() short_stocks = scored_stocks.tail(self.short_n)[&#39;Stkcd&#39;].tolist() # 更新持仓 new_positions = {} for stock in long_stocks: new_positions[stock] = 1.0 / self.top_n # 等权重 for stock in short_stocks: new_positions[stock] = -1.0 / self.short_n # 等权重做空 # 计算换手率 turnover = 0 if current_positions: all_stocks = set(current_positions.keys()) | set(new_positions.keys()) for stock in all_stocks: old_pos = current_positions.get(stock, 0) new_pos = new_positions.get(stock, 0) turnover += abs(new_pos - old_pos) turnover /= 2 # 计算收益 if current_positions: monthly_return = self.calculate_returns(date, current_positions) else: monthly_return = 0 # 记录结果 backtest_results.append({ &#39;date&#39;: date, &#39;monthly_return&#39;: monthly_return, &#39;turnover&#39;: turnover, &#39;long_count&#39;: len(long_stocks), &#39;short_count&#39;: len(short_stocks), &#39;selected_factors&#39;: selected_factors[:5], # 记录前5个因子 &#39;long_stocks&#39;: long_stocks[:10], # 记录前10只做多股票 &#39;short_stocks&#39;: short_stocks[:10] # 记录前10只做空股票 }) current_positions = new_positions self.strategy_results = pd.DataFrame(backtest_results) # 计算累计收益 self.strategy_results[&#39;cumulative_return&#39;] = (1 + self.strategy_results[&#39;monthly_return&#39;]).cumprod() print(f"回测完成,共 {len(self.strategy_results)} 个调仓周期") def calculate_performance_metrics(self) -> dict: """计算策略绩效指标""" if self.strategy_results is None or len(self.strategy_results) == 0: return {} returns = self.strategy_results[&#39;monthly_return&#39;].values cumulative_returns = self.strategy_results[&#39;cumulative_return&#39;].values # 年化收益率 total_return = cumulative_returns[-1] - 1 years = len(returns) / 12 annual_return = (1 + total_return) ** (1 / years) - 1 # 年化波动率 annual_volatility = np.std(returns) * np.sqrt(12) # 夏普比率 risk_free_rate = 0.03 # 假设无风险利率为3% sharpe_ratio = (annual_return - risk_free_rate) / annual_volatility if annual_volatility > 0 else 0 # 最大回撤 peak = np.maximum.accumulate(cumulative_returns) drawdown = (cumulative_returns - peak) / peak max_drawdown = np.min(drawdown) # 胜率 win_rate = np.sum(returns > 0) / len(returns) # 平均换手率 avg_turnover = self.strategy_results[&#39;turnover&#39;].mean() # 卡玛比率 calmar_ratio = annual_return / abs(max_drawdown) if max_drawdown != 0 else 0 metrics = { &#39;annual_return&#39;: annual_return, &#39;annual_volatility&#39;: annual_volatility, &#39;sharpe_ratio&#39;: sharpe_ratio, &#39;max_drawdown&#39;: max_drawdown, &#39;win_rate&#39;: win_rate, &#39;avg_turnover&#39;: avg_turnover, &#39;calmar_ratio&#39;: calmar_ratio, &#39;total_return&#39;: total_return, &#39;total_months&#39;: len(returns) } return metrics def plot_performance(self): """绘制策略绩效图表""" if self.strategy_results is None: print("没有回测结果可供绘图") return # 创建子图 fig, axes = plt.subplots(2, 2, figsize=(15, 12)) fig.suptitle(&#39;多因子多空套利策略回测结果&#39;, fontsize=16, fontweight=&#39;bold&#39;) # 1. 累计收益率 axes[0, 0].plot(self.strategy_results[&#39;date&#39;], self.strategy_results[&#39;cumulative_return&#39;], linewidth=2, color=&#39;blue&#39;, label=&#39;策略累计收益&#39;) axes[0, 0].axhline(y=1, color=&#39;red&#39;, linestyle=&#39;--&#39;, alpha=0.5, label=&#39;基准线&#39;) axes[0, 0].set_title(&#39;累计收益率&#39;) axes[0, 0].set_xlabel(&#39;日期&#39;) axes[0, 0].set_ylabel(&#39;累计收益率&#39;) axes[0, 0].legend() axes[0, 0].grid(True, alpha=0.3) # 2. 月度收益率分布 axes[0, 1].hist(self.strategy_results[&#39;monthly_return&#39;], bins=30, alpha=0.7, color=&#39;green&#39;, edgecolor=&#39;black&#39;) axes[0, 1].axvline(x=0, color=&#39;red&#39;, linestyle=&#39;--&#39;, alpha=0.7, label=&#39;零收益线&#39;) axes[0, 1].set_title(&#39;月度收益率分布&#39;) axes[0, 1].set_xlabel(&#39;月度收益率&#39;) axes[0, 1].set_ylabel(&#39;频次&#39;) axes[0, 1].legend() axes[0, 1].grid(True, alpha=0.3) # 3. 回撤曲线 cumulative_returns = self.strategy_results[&#39;cumulative_return&#39;].values peak = np.maximum.accumulate(cumulative_returns) drawdown = (cumulative_returns - peak) / peak axes[1, 0].fill_between(self.strategy_results[&#39;date&#39;], drawdown, 0, alpha=0.3, color=&#39;red&#39;, label=&#39;回撤&#39;) axes[1, 0].plot(self.strategy_results[&#39;date&#39;], drawdown, color=&#39;red&#39;, linewidth=1) axes[1, 0].set_title(&#39;回撤曲线&#39;) axes[1, 0].set_xlabel(&#39;日期&#39;) axes[1, 0].set_ylabel(&#39;回撤率&#39;) axes[1, 0].legend() axes[1, 0].grid(True, alpha=0.3) # 4. 换手率 axes[1, 1].plot(self.strategy_results[&#39;date&#39;], self.strategy_results[&#39;turnover&#39;], linewidth=1, color=&#39;orange&#39;, label=&#39;换手率&#39;) axes[1, 1].axhline(y=self.strategy_results[&#39;turnover&#39;].mean(), color=&#39;red&#39;, linestyle=&#39;--&#39;, alpha=0.7, label=f&#39;平均换手率: {self.strategy_results["turnover"].mean():.2%}&#39;) axes[1, 1].set_title(&#39;换手率变化&#39;) axes[1, 1].set_xlabel(&#39;日期&#39;) axes[1, 1].set_ylabel(&#39;换手率&#39;) axes[1, 1].legend() axes[1, 1].grid(True, alpha=0.3) plt.tight_layout() plt.savefig(&#39;策略绩效图.png&#39;, dpi=300, bbox_inches=&#39;tight&#39;) plt.show() # 绘制持仓情况 self.plot_holdings() def plot_holdings(self): """绘制持仓情况""" if self.strategy_results is None: return # 统计持仓股票 all_long_stocks = [] all_short_stocks = [] for _, row in self.strategy_results.iterrows(): all_long_stocks.extend(row[&#39;long_stocks&#39;]) all_short_stocks.extend(row[&#39;short_stocks&#39;]) # 统计股票出现频次 long_freq = pd.Series(all_long_stocks).value_counts().head(20) short_freq = pd.Series(all_short_stocks).value_counts().head(20) # 绘制持仓频次图 fig, axes = plt.subplots(1, 2, figsize=(16, 8)) fig.suptitle(&#39;策略持仓股票频次统计&#39;, fontsize=16, fontweight=&#39;bold&#39;) # 做多股票频次 axes[0].barh(range(len(long_freq)), long_freq.values, color=&#39;green&#39;, alpha=0.7) axes[0].set_yticks(range(len(long_freq))) axes[0].set_yticklabels(long_freq.index) axes[0].set_title(&#39;做多股票频次 (Top 20)&#39;) axes[0].set_xlabel(&#39;出现频次&#39;) axes[0].invert_yaxis() # 做空股票频次 axes[1].barh(range(len(short_freq)), short_freq.values, color=&#39;red&#39;, alpha=0.7) axes[1].set_yticks(range(len(short_freq))) axes[1].set_yticklabels(short_freq.index) axes[1].set_title(&#39;做空股票频次 (Top 20)&#39;) axes[1].set_xlabel(&#39;出现频次&#39;) axes[1].invert_yaxis() plt.tight_layout() plt.savefig(&#39;持仓情况图.png&#39;, dpi=300, bbox_inches=&#39;tight&#39;) plt.show() def print_performance_summary(self): """打印策略绩效摘要""" metrics = self.calculate_performance_metrics() if not metrics: print("无法计算绩效指标") return print("\n" + "="*60) print("多因子多空套利策略绩效摘要") print("="*60) print(f"回测期间: {self.start_date.strftime(&#39;%Y-%m-%d&#39;)} 至 {self.end_date.strftime(&#39;%Y-%m-%d&#39;)}") print(f"总调仓次数: {metrics[&#39;total_months&#39;]}") print(f"总收益率: {metrics[&#39;total_return&#39;]:.2%}") print(f"年化收益率: {metrics[&#39;annual_return&#39;]:.2%}") print(f"年化波动率: {metrics[&#39;annual_volatility&#39;]:.2%}") print(f"夏普比率: {metrics[&#39;sharpe_ratio&#39;]:.3f}") print(f"最大回撤: {metrics[&#39;max_drawdown&#39;]:.2%}") print(f"胜率: {metrics[&#39;win_rate&#39;]:.2%}") print(f"平均换手率: {metrics[&#39;avg_turnover&#39;]:.2%}") print(f"卡玛比率: {metrics[&#39;calmar_ratio&#39;]:.3f}") print("="*60) # 打印最新持仓情况 if len(self.strategy_results) > 0: latest_result = self.strategy_results.iloc[-1] print(f"\n最新调仓日期: {latest_result[&#39;date&#39;].strftime(&#39;%Y-%m-%d&#39;)}") print(f"做多股票数量: {latest_result[&#39;long_count&#39;]}") print(f"做空股票数量: {latest_result[&#39;short_count&#39;]}") print(f"主要因子: {latest_result[&#39;selected_factors&#39;]}") print(f"做多股票: {latest_result[&#39;long_stocks&#39;][:5]}...") print(f"做空股票: {latest_result[&#39;short_stocks&#39;][:5]}...") def run_strategy(self): """运行完整策略""" print("开始运行多因子多空套利策略...") # 1. 加载数据 self.load_and_preprocess_data() # 2. 计算因子 self.calculate_all_factors() # 3. 运行回测 self.run_backtest() # 4. 计算绩效指标 metrics = self.calculate_performance_metrics() # 5. 打印结果 self.print_performance_summary() # 6. 绘制图表 self.plot_performance() print("策略运行完成!") def main(): """主函数""" # 创建策略实例 strategy = MultiFactorArbitrageStrategy( data_path=&#39;/Users/diligence/PycharmProjects/mt_fx/merge_data/datafile/m_data/n_mdata1.csv&#39;, start_date=&#39;2014-01-01&#39;, end_date=&#39;2024-12-31&#39; ) # 运行策略 strategy.run_strategy() if __name__ == "__main__": main()
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值