{"id":3589,"date":"2026-03-11T08:59:08","date_gmt":"2026-03-11T00:59:08","guid":{"rendered":"http:\/\/xuebuwan.com\/wp\/archives\/3589"},"modified":"2026-03-23T17:20:33","modified_gmt":"2026-03-23T09:20:33","slug":"backtrader%e5%85%a5%e9%97%a8%ef%bc%9a%e4%b8%93%e4%b8%9a%e7%9a%84%e9%87%8f%e5%8c%96%e5%9b%9e%e6%b5%8b%e6%a1%86%e6%9e%b6","status":"publish","type":"post","link":"http:\/\/xuebuwan.com\/wp\/?p=3589","title":{"rendered":"Backtrader\u5165\u95e8\uff1a\u4e13\u4e1a\u7684\u91cf\u5316\u56de\u6d4b\u6846\u67b6"},"content":{"rendered":"<h2>\ud83d\udcca \u4ec0\u4e48\u662f Backtrader\uff1f<\/h2>\n<p><strong>Backtrader<\/strong>\u662fPython\u91cc\u6700\u6d41\u884c\u7684\u91cf\u5316\u56de\u6d4b\u6846\u67b6\uff0c\u53ef\u4ee5\uff1a<\/p>\n<ul>\n<li>\ud83d\udcc8 \u5386\u53f2\u6570\u636e\u56de\u6d4b<\/li>\n<li>\ud83d\udcb0 \u6a21\u62df\u5b9e\u76d8\u4ea4\u6613<\/li>\n<li>\ud83d\udcca \u5206\u6790\u7b56\u7565\u8868\u73b0<\/li>\n<li>\ud83d\udd27 \u53c2\u6570\u4f18\u5316<\/li>\n<\/ul>\n<h2>\ud83d\udc68\u200d\ud83d\udcbb \u5b89\u88c5<\/h2>\n<pre><code>pip install backtrader<\/code><\/pre>\n<h2>\ud83d\udcdd \u7b2c\u4e00\u4e2a\u7b56\u7565<\/h2>\n<pre><code>import backtrader as bt\n\n# \u7ee7\u627fbt.Strategy\nclass MyStrategy(bt.Strategy):\n\n    def __init__(self):\n        # \u8ba1\u7b975\u65e5\u548c20\u65e5\u5747\u7ebf\n        self.ma5 = bt.indicators.SimpleMovingAverage(\n            self.data.close, period=5)\n        self.ma20 = bt.indicators.SimpleMovingAverage(\n            self.data.close, period=20)\n\n        # \u91d1\u53c9\u6b7b\u53c9\u4fe1\u53f7\n        self.crossover = bt.indicators.CrossOver(self.ma5, self.ma20)\n\n    def next(self):\n        # \u91d1\u53c9\u4e70\u5165\n        if self.crossover &gt; 0:\n            self.buy()\n\n        # \u6b7b\u53c9\u5356\u51fa\n        elif self.crossover <\/code><\/pre>\n<h2>\ud83d\ude80 \u8fd0\u884c\u56de\u6d4b<\/h2>\n<pre><code>import backtrader as bt\n\n# \u521b\u5efa\u5927\u8111\ncerebro = bt.Cerebro()\n\n# \u6dfb\u52a0\u7b56\u7565\ncerebro.addstrategy(MyStrategy)\n\n# \u52a0\u8f7d\u6570\u636e\uff08\u9700\u8981\u5148\u4e0b\u8f7d\u6570\u636e\uff09\ndata = bt.feeds.PandasData(dataname=df)\ncerebro.adddata(data)\n\n# \u8bbe\u7f6e\u521d\u59cb\u8d44\u91d1\ncerebro.broker.setcash(100000)\n\n# \u8fd0\u884c\ncerebro.run()\n\n# \u6700\u7ec8\u8d44\u91d1\nprint(f&quot;\u6700\u7ec8\u8d44\u91d1: {cerebro.broker.getvalue():.2f}&quot;)<\/code><\/pre>\n<h2>\ud83d\udca1 \u5b8c\u6574\u4f8b\u5b50<\/h2>\n<pre><code>import backtrader as bt\nimport akshare as ak\nimport pandas as pd\n\n# \u83b7\u53d6\u6570\u636e\ndf = ak.stock_zh_a_hist(symbol=&quot;600519&quot;, adjust=&quot;qfq&quot;)\ndf = df[[&quot;\u65e5\u671f&quot;, &quot;\u5f00\u76d8&quot;, &quot;\u6700\u9ad8&quot;, &quot;\u6700\u4f4e&quot;, &quot;\u6536\u76d8&quot;, &quot;\u6210\u4ea4\u91cf&quot;]]\ndf.columns = [&quot;datetime&quot;, &quot;open&quot;, &quot;high&quot;, &quot;low&quot;, &quot;close&quot;, &quot;volume&quot;]\ndf[&quot;datetime&quot;] = pd.to_datetime(df[&quot;datetime&quot;])\ndf = df.set_index(&quot;datetime&quot;)\n\n# \u8f6c\u4e3aBacktrader\u683c\u5f0f\ndata = bt.feeds.PandasData(dataname=df)\n\n# \u53cc\u5747\u7ebf\u7b56\u7565\nclass MaCrossStrategy(bt.Strategy):\n    params = ((&quot;ma1&quot;, 5), (&quot;ma2&quot;, 20),)\n\n    def __init__(self):\n        self.ma1 = bt.indicators.SimpleMovingAverage(\n            self.data.close, period=self.params.ma1)\n        self.ma2 = bt.indicators.SimpleMovingAverage(\n            self.data.close, period=self.params.ma2)\n        self.crossover = bt.indicators.CrossOver(self.ma1, self.ma2)\n\n    def next(self):\n        if self.crossover &gt; 0:\n            self.buy()\n        elif self.crossover <\/code><\/pre>\n<h2>\ud83d\udcca \u5206\u6790\u5de5\u5177<\/h2>\n<pre><code># \u6dfb\u52a0\u5206\u6790\u5668\ncerebro.addanalyzer(bt.analyzers.SharpeRatio, _name=&quot;sharpe&quot;)\ncerebro.addanalyzer(bt.analyzers.DrawDown, _name=&quot;dd&quot;)\n\n# \u8fd0\u884c\nresults = cerebro.run()\n\n# \u67e5\u770b\u7ed3\u679c\nsharpe = results[0].analyzers.sharpe.get_analysis()\nprint(f&quot;\u590f\u666e\u6bd4\u7387: {sharpe[sharperatio]}&quot;)\n\ndd = results[0].analyzers.dd.get_analysis()\nprint(f&quot;\u6700\u5927\u56de\u64a4: {dd[max][drawdown]}%&quot;)<\/code><\/pre>\n<h2>\u26a0\ufe0f \u6ce8\u610f\u4e8b\u9879<\/h2>\n<ul>\n<li>\ud83d\udcca \u6570\u636e\u9700\u8981\u6b63\u786e\u683c\u5f0f<\/li>\n<li>\ud83d\udca1 \u5efa\u8bae\u5148\u5728\u6a21\u62df\u6570\u636e\u4e0a\u6d4b\u8bd5<\/li>\n<li>\ud83d\udd27 \u6ce8\u610f<strong>\u8fc7\u62df\u5408<\/strong>\u95ee\u9898<\/li>\n<\/ul>\n<h2>\ud83d\udcda \u4e0b\u4e00\u8bfe<\/h2>\n<p>\u5b66\u4f1a\u4e86Backtrader\uff0c\u6211\u4eec\u6765\u5b66<strong>\u53c2\u6570\u4f18\u5316<\/strong>\u2014\u2014\u627e\u5230\u6700\u597d\u7684\u5747\u7ebf\u53c2\u6570\uff01<\/p>","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcca \u4ec0\u4e48\u662f Backtrader\uff1f Backtrader\u662fPython\u91cc\u6700\u6d41\u884c\u7684\u91cf\u5316\u56de\u6d4b\u6846\u67b6\uff0c\u53ef\u4ee5\uff1a \ud83d\udcc8 \u5386\u53f2 &#8230; <a title=\"Backtrader\u5165\u95e8\uff1a\u4e13\u4e1a\u7684\u91cf\u5316\u56de\u6d4b\u6846\u67b6\" class=\"read-more\" href=\"http:\/\/xuebuwan.com\/wp\/?p=3589\" aria-label=\"\u9605\u8bfb Backtrader\u5165\u95e8\uff1a\u4e13\u4e1a\u7684\u91cf\u5316\u56de\u6d4b\u6846\u67b6\">\u9605\u8bfb\u66f4\u591a<\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-3589","post","type-post","status-publish","format-standard","hentry","category-live-trading"],"_links":{"self":[{"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/3589","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3589"}],"version-history":[{"count":1,"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/3589\/revisions"}],"predecessor-version":[{"id":3595,"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/3589\/revisions\/3595"}],"wp:attachment":[{"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3589"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3589"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/xuebuwan.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3589"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}