楼主: xingjingguan
2767 22

[问答] 交易自动化的最短学习路径是什么样的? [推广有奖]

  • 8关注
  • 0粉丝

已卖:28份资源

学科带头人

19%

还不是VIP/贵宾

-

威望
0
论坛币
4247 个
通用积分
39.4616
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
24435 点
帖子
788
精华
0
在线时间
3216 小时
注册时间
2024-9-2
最后登录
2025-12-16

楼主
xingjingguan 发表于 2024-9-6 12:28:34 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有自己的交易策略,Python自学了基础语法。现在想把策略,给量化回测和自动执行,但是不知如何下手?
感觉网上很多量化交易课程,跟自己又不匹配。又是机器学习、又是平台搭建的,感觉也用不到那么深,只想把已有想法回测和执行。
有哪位前辈可以给出个学习路径吗?






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:自动化 python 量化交易 机器学习 交易策略 Python 量化 交易

已有 1 人评分论坛币 收起 理由
happy_287422301 + 100 鼓励积极发帖讨论

总评分: 论坛币 + 100   查看全部评分

持续改进策略中...,欢迎指教

沙发
xingjingguan 发表于 2024-9-6 23:15:20
有懂代码的指点下吗?  想实现策略,哪些内容必学,哪些内容了解,哪些不用看?让我的学习少些弯路,谢谢好心人

藤椅
xingjingguan 发表于 2024-9-10 10:45:01
自己先做个基本路径。
一、先了解各主要平台,找到适合的软件。软件须符合:①可以多回测,免费最好;②能资金管理,显示系统评价指标;③代码隐私安全。
二、学习平台的使用方法,从先模仿案例编写,了解整理系统结构。
三、编写自己策略,历史回测,优化。
四、模拟盘实时行情测试,发现问题,解决问题,优化流程。
五、实盘测试。
已有 1 人评分论坛币 收起 理由
happy_287422301 + 40 鼓励积极发帖讨论

总评分: 论坛币 + 40   查看全部评分

板凳
赵安豆 发表于 2024-12-5 16:42:25
对于你的情况,想要将已有的交易策略实现自动化并且进行量化回测,我建议你可以按照以下步骤来逐步深入:

1. **理解量化交易平台**:首先了解一下主流的量化交易平台如Backtrader、PyAlgoTrade、Zipline等。选择一个平台(初学者推荐Backtrader),这个平台可以将你的交易逻辑转换为可执行代码,并且提供历史数据进行回测。

2. **学习使用所选平台**:在GitHub上找一些基础教程和示例,学习如何用Python结合所选的量化交易平台写策略。理解数据获取、策略编写、订单处理和分析报告生成的过程。

3. **实现你的交易策略**:基于你已经有的想法,将它们转化为可执行的代码逻辑。比如,如果是一个均线交叉策略,你需要定义短期和长期均线,以及当两条均线相交时买入或卖出的条件。

4. **回测与优化**:使用历史数据进行回测,看看你的策略在过去的表现如何。注意观察回测报告中的关键指标如夏普比率、最大回撤等,对策略进行必要的调整以优化性能。

5. **实盘交易准备**:在你确信策略效果并且风险管理得当的情况下,可以考虑将策略应用到实盘中。开始时建议使用小资金量进行测试,逐步增加风险敞口。

6. **持续学习与改进**:市场是不断变化的,你需要持续关注策略的表现,并根据市场情况调整优化。

为了加速这个过程,你可以寻找一些实际案例和项目来模仿或参考,同时保持对新知识的好奇心,比如学习更多关于风险管理、数据分析以及高级算法的知识。记住,量化交易是一个需要不断实践和学习的过程,祝你好运!

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



报纸
xingjingguan 发表于 2025-1-9 08:55:39
从初学到精深的通用路径:
①概览:先熟悉本领域知识的框架。忽略细节,掌握主干;
②拆解:从主干,逐步拆解细化,直至分割成最基本的概念或动作;
③练习:练习最基本的动作,直至熟练;
④内化:再把最基本的概念或动作,反复练习,直至内化到无需思考,即遵循施展的程度;
⑤组合:把基本概念,两两组合起来练习直至内化,再依次三个一组、四个一组......直至整个框架内化。

地板
xingjingguan 发表于 2025-3-4 14:58:24
学习步骤总结:
①学习知识。了解并记忆交易系统的规则。
②学习理念。理解规则背后的理念,优缺点,适用范围。
③反复练习。

7
xingjingguan 发表于 2025-3-28 10:08:49
具体实践步骤:
①获取数据。    我是使用tushare获取数据,注册就可以免费使用,简单浏览下文档。    {目标:会获取数据。还不会就问ai,抄答案。}
②选择量化交易框架。
    目前我选择Backtrader,熟悉官方文档,同时模仿示例运行。复制示例——》直接运行——》理解报错(ai辅助)——》修改,然后就是【运行——》报错——》修改】一直循环,直到不报错为止。
    {目标:示例运行不报错。理解困难就问ai,解释了看不懂就抄ai,抄了还错继续问ai为什么错。}
③策略编写。
    先从最简单的策略开始,比如双均线。初期仅把精力放在开仓上,其他不管,只要求运行不报错。如果难度不大,再逐步加入止损,出场,仓位,过滤等步骤;觉得困难,就只把开仓完成。总而言之,先写出一个能运行的策略,甚至不要求策略完整。
    {目标:实现开仓信号。你知道的,聪明人用ai}
④回测。
    尝试绘制回测曲线,如果上一步策略编写时遇到困难,把开仓信号实现后就可以开始回测,尝试绘制累计净值曲线,有余力绘制行情曲线,信号标识,仓位变化,最大回撤......。这里回测不是为了看信号是否盈利,而是为了把功能走通。主要打一个,学不会就跳过。能绘制出净值曲线,量化框架就完成了。
    {目标:绘制净值曲线。ai}
⑤增加零件,完善系统。
    之前缺的步骤一个个补上,比如止损,止盈,加仓减仓,风险控制... 此阶段仍不管是否盈利。
    {目标:交易系统逐步完整。}
⑥分析回测结果。净值是否大于1,波动性,夏普比率,交易次数,滑点手续费...

到这里其实已经入门了,简单写下后续方向吧。经典策略实现,仓位调整测试,理解策略适用范围,多策略组合,多市场分散;

8
xingjingguan 发表于 2025-4-30 09:56:03
目前实现了最简单的回测:双均线策略。简陋但框架完整。
自己的源码分享给自学者参考
  1. import os
  2. import tushare as ts
  3. import backtrader as bt
  4. import matplotlib.pyplot as plt
  5. import pandas as pd

  6. # 设置 Tushare 的 API Token,需提前设置环境变量
  7. tushare_api_token = os.getenv('TUSHARE_API_TOKEN')
  8. if not tushare_api_token:
  9.     raise ValueError("TUSHARE_API_TOKEN environment variable is not set.")
  10. ts.set_token(tushare_api_token)
  11. pro = ts.pro_api()

  12. # 获取测试数据
  13. data = pro.daily(ts_code='000001.SZ', start_date='20010101', end_date='20231231')  

  14. # 将数据转换为 Backtrader 可用的格式,并确保数据类型正确
  15. data['trade_date'] = pd.to_datetime(data['trade_date'])
  16. data.set_index('trade_date', inplace=True)
  17. data[['open', 'high', 'low', 'close', 'vol']] = data[['open', 'high', 'low', 'close', 'vol']].astype(float)

  18. # 清洗数据:检查并处理缺失值
  19. data.dropna(inplace=True)

  20. # 确保数据按时间顺序排列
  21. data.sort_index(inplace=True)

  22. # 创建 Cerebro 引擎
  23. cerebro = bt.Cerebro()

  24. # 添加数据到引擎中
  25. data_feed = bt.feeds.PandasData(dataname=data,
  26.                                 open='open',
  27.                                 high='high',
  28.                                 low='low',
  29.                                 close='close',
  30.                                 volume='vol'
  31.                                   )
  32. cerebro.adddata(data_feed)

  33. # 添加初始资金
  34. cerebro.broker.setcash(100000.0)

  35. # 设置交易佣金
  36. cerebro.broker.setcommission(commission=0.001)

  37. # 打印并记录初始金额
  38. print(f'初始金额: {cerebro.broker.getvalue():.2f}')
  39. starting_portfolio_value = cerebro.broker.getvalue()

  40. # 定义双均线策略
  41. class DMAStrategy(bt.Strategy):
  42.     params = (('fast_period', 10), ('slow_period', 50),('position_ratio',0.2))

  43.     def __init__(self):
  44.         self.data_close = self.datas[0].close
  45.         self.order = None
  46.         
  47.         # 计算快速和慢速移动平均线
  48.         fast_ma = bt.indicators.SimpleMovingAverage(self.data_close, period=self.params.fast_period)
  49.         slow_ma = bt.indicators.SimpleMovingAverage(self.data_close, period=self.params.slow_period)
  50.         
  51.         # 计算交叉信号
  52.         self.buy_signal = bt.indicators.CrossOver(fast_ma, slow_ma)
  53.         
  54.         
  55.     def next(self):
  56.         if self.order:
  57.             return

  58.         if not self.position:
  59.             if self.buy_signal > 0:
  60.                 print(f'BUY SIGNAL GENERATED at {self.datetime.date()}')
  61.                 self.share_size = int(self.broker.get_cash() / self.data.close[0] / 100) * 100 * self.params.position_ratio
  62.                 self.order = self.buy(size=self.share_size)
  63.             
  64.         else:
  65.             if self.buy_signal < 0:
  66.                 print(f'SELL SIGNAL GENERATED at {self.datetime.date()}')
  67.                 self.order = self.sell(size=self.position.size)


  68.     def notify_order(self, order):
  69.         if order.status in [order.Submitted, order.Accepted]:
  70.             return

  71.         if order.status in [order.Completed]:
  72.             if order.isbuy():
  73.                 print(f'BUY EXECUTED, Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}')
  74.             elif order.issell():
  75.                 print(f'SELL EXECUTED, Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}')
  76.             self.bar_executed = len(self)

  77.         elif order.status in [order.Canceled, order.Margin, order.Rejected]:
  78.             print('Order Canceled/Margin/Rejected')

  79.         self.order = None

  80. # 添加策略到引擎中
  81. cerebro.addstrategy(DMAStrategy)

  82. # 添加分析器
  83. cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
  84. cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
  85. cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharperatio', riskfreerate=0.03)
  86. cerebro.addanalyzer(bt.analyzers.SQN, _name='sqn')
  87. cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trade_analyzer')

  88. # 运行回测并储存结果
  89. results = cerebro.run()
  90. strat = results[0]

  91. # 获取交易统计数据
  92. trader_data = strat.analyzers.trade_analyzer.get_analysis()

  93. #计算胜率、平均盈亏比、回报率
  94. win_rate = trader_data.won.total / trader_data.total.closed if trader_data.total.closed != 0 else 0
  95. average_pnl_ratio = (trader_data.won.pnl.average / abs(trader_data.lost.pnl.average)) if trader_data.lost.total != 0 else float('inf')
  96. total_return = trader_data.pnl.net.total / starting_portfolio_value * 100

  97. # 打印最终金额和分析结果
  98. print(f'总价值: {cerebro.broker.getvalue():.2f}')
  99. print(f'总回报率: {total_return:.2f}%')
  100. print(f'当前DrawDown: {strat.analyzers.drawdown.get_analysis()["drawdown"]:.2f}%')
  101. print(f'最大DrawDown: {strat.analyzers.drawdown.get_analysis()["max"]["drawdown"]:.2f}%')
  102. print(f'复合Returns: {strat.analyzers.returns.get_analysis()["rtot"]:.5f}%')
  103. print(f'年化Returns: {strat.analyzers.returns.get_analysis()["rnorm100"]:.5f}%')
  104. print(f"夏普比率: {strat.analyzers.sharperatio.get_analysis()['sharperatio']:.4f}")
  105. print(f'SQN: {strat.analyzers.sqn.get_analysis()["sqn"]:.2f}')
  106. print(f'交易次数: {strat.analyzers.sqn.get_analysis()["trades"]}')

  107. # 打印胜率、平均盈亏比、连胜/输次数
  108. print(f'交易胜率: {win_rate:.2%}')
  109. print(f'平均盈亏比: {average_pnl_ratio:.2f}')
  110. print(f'最长连胜:{trader_data.streak.won.longest}次')
  111. print(f'最长连输:{trader_data.streak.lost.longest}次')

  112. # 绘制结果
  113. fig = cerebro.plot(style='bar')[0][0]
  114. fig.savefig('backtest_result.png')  # 保存图表到文件
  115. plt.show()  
复制代码
已有 1 人评分经验 收起 理由
cheetahfly + 50 精彩帖子

总评分: 经验 + 50   查看全部评分

9
xingjingguan 发表于 2025-4-30 10:48:40
策略10日均线上穿50日均线(参数随便选的),仓位20%,回测结果如下:
总价值: 198011.19
总回报率: 98.01%
当前DrawDown: 9.98%
最大DrawDown: 17.44%
复合Returns: 0.68315%
年化Returns: 3.22908%
夏普比率: 0.0506
SQN: 1.02
交易次数: 62
交易胜率: 30.65%
平均盈亏比: 4.26
最长连胜:3次
最长连输:7次

backtest_result.png

已有 1 人评分经验 收起 理由
cheetahfly + 50 精彩帖子

总评分: 经验 + 50   查看全部评分

10
xingjingguan 发表于 2025-5-15 10:23:27
从时间跨度足够(24年),交易样本足够(62次交易),98%的回报率,这三个维度可以看出:策略是具备长期适应性、和明显正优势的;
从胜率(30.65%)盈亏比(4.26)看,符合典型的趋势策略特征:低胜率高盈亏比;
从净值曲线和股票行情对比来看,大趋势大利润,小趋势小利润,盘整期间小亏;
综上得出结论:即使这是一个烂大街的公开策略,但仍是一个正期望策略。对交易有理解的人,可以进行优化修改,使之变成一个满足自己需要的交易系统。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-16 18:53