Files
obsidian-vault/05 投资交易/我的第一个策略优化记录(二、脚本结构优化).md
2026-06-23 00:24:32 +08:00

5.7 KiB
Raw Permalink Blame History

#量化交易 #策略研究 #技术指标 #Python学习 #DeepSeek


我是Python的初学者。对于我的这个脚本还有哪些从程序结构上优化的空间比如建立函数建立类class甚至建立我自己的模块用来引用这样让我可以更加专注主程序本身的逻辑开发。这是我自己写的第一个脚本请给我提出优化的建议。谢谢。


以下是针对您的Python脚本在程序结构上的优化建议旨在提升代码的模块化、可读性和可维护性让您更专注于核心逻辑开发


🧱 一、模块化拆分(核心优化)​

将脚本按功能拆分为独立模块,通过import调用:

  1. 数据获取模块 data_fetcher.py

    # data_fetcher.py
    import ccxt
    def fetch_klines(exchange, symbol, interval, limit=1000):
        return exchange.fetch_ohlcv(symbol, interval, limit=limit)
    
  2. 数据处理模块 data_processor.py

    # data_processor.py
    import talib
    def calculate_indicators(df):
        df['MA5'] = talib.MA(df['close'], timeperiod=5)
        return df
    
  3. 交易执行模块 trade_executor.py

    # trade_executor.py
    def place_order(exchange, symbol, side, price, quantity):
        return exchange.create_order(symbol, 'limit', side, quantity, price)
    
  4. 主程序模块 main.py

    # main.py
    from data_fetcher import fetch_klines
    from data_processor import calculate_indicators
    from trade_executor import place_order
    
    def main():
        # 主逻辑调用各模块函数
        klines = fetch_klines(exchange, 'ETH/USDT', '1m')
        processed_data = calculate_indicators(klines)
        place_order(...)
    

⚙️ 二、函数设计优化

遵循 单一职责原则PEP8规范

# 优化前:混合功能的长函数
def process_data():
    # 获取数据 + 计算指标 + 日志记录...

# 优化后:拆分为原子函数
def fetch_data() -> pd.DataFrame: ...
def calculate_rsi(data: pd.DataFrame) -> pd.Series: ...
def log_transaction(action: str): ...

关键原则

  1. 函数不超过20行嵌套≤3层

  2. 参数≤4个复杂参数用字典封装

  3. 添加类型注解和文档字符串:

    def calculate_macd(data: pd.DataFrame, 
                      fast: int=12, 
                      slow: int=26) -> tuple:
        """
        计算MACD指标
        :param data: 包含收盘价的数据框
        :return: (macd, signal, hist)
        """
    

🧬 三、类的应用(面向对象优化)​

封装交易实体为类,提升状态管理能力:

# trader.py
class CryptoTrader:
    def __init__(self, api_key: str, api_secret: str):
        self.exchange = self._init_exchange(api_key, api_secret)
        self.strategy = RSIStrategy()  # 策略可替换

    def _init_exchange(self, key, secret):
        return ccxt.binance({'apiKey': key, 'secret': secret})
    
    def execute_trade(self, symbol: str):
        data = self.fetch_data(symbol)
        signal = self.strategy.generate_signal(data)
        if signal == "BUY":
            self.place_order(...)

优势

  • 封装交易所连接、策略、执行逻辑
  • 支持策略热替换(如MACDStrategy替换RSIStrategy
  • 状态管理更清晰(持仓、余额等)

📊 四、异常处理与日志体系

结构化异常处理

# 模块化异常处理
class DataFetchError(Exception): ...
class OrderExecuteError(Exception): ...

try:
    data = fetch_data()
except ccxt.NetworkError as e:
    raise DataFetchError(f"网络错误: {str(e)}")

日志分级管理

# 在单独模块 logger_config.py 中配置
import logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[logging.FileHandler('trading.log'), logging.StreamHandler()]
)

🧩 五、主程序结构优化

# main.py
if __name__ == "__main__":
    trader = CryptoTrader(API_KEY, API_SECRET)
    while True:
        try:
            trader.monitor_market("ETH/USDT")
        except KeyboardInterrupt:
            logger.info("用户退出程序")
            break
        except Exception as e:
            logger.critical(f"主循环崩溃: {e}", exc_info=True)
            time.sleep(60)  # 冷却后重启

🔧 六、其他优化技巧

  1. 配置文件分离
    创建config.py存储API密钥、交易对等参数
  2. 依赖管理
    requirements.txt记录依赖库
  3. 单元测试
    为关键模块添加测试(如test_strategies.py
  4. 类型检查
    使用mypy检查类型注解

📦 优化后项目结构

crypto_trading/
├── core/
│   ├── trader.py         # 交易主类
│   ├── strategies.py     # 策略实现RSI/MACD
├── utils/
│   ├── data_fetcher.py
│   ├── data_processor.py
│   ├── logger_config.py
├── config.py             # 配置文件
├── main.py               # 主入口
└── tests/
    └── test_strategies.py

优化价值

  • 新功能开发只需修改单一模块
  • 策略替换只需更换trader.strategy属性 🔄
  • 异常隔离:数据故障不会中断交易循环 🛡️
  • 团队协作时各模块可并行开发 👥

通过模块化、类封装和函数原子化,您的脚本将具备工业级代码的扩展性和可维护性,让您更专注于核心交易逻辑的创新!