尝试して株式データを取得して調査してみましたが、検索と比較の結果、akshare というライブラリを使用することに決めました。このライブラリは常に更新されており、ドキュメントも中国語で詳細に記載されています。
akshare ドキュメントのリンク:https://www.akshare.xyz/
株式のさまざまなデータ取得方法
akshare ライブラリのインポート
1import akshare as ak
2import pandas as pd
1. 株式の基本情報データ#
1ak.stock_individual_info_em(symbol="000651")
2. リアルタイムデータ、当日の取引データ#
一度にすべての上場企業のリアルタイム市場データを取得します
3. 過去のデータ、過去の取引データ#
ak.stock_zh_a_hist(symbol="000651",
period="daily",
start_date="20230701",
end_date='20230725',
adjust=""
) #不复权
4. 資金の流れのデータ#
制限:指定した市場と株式の過去 100 日間の資金流れデータを一度に取得します
1ak.stock_individual_fund_flow(stock="000651", market="sz")
5. 市場の価格、買い注文と売り注文の 5 桁#
ak.stock_bid_ask_em(symbol="000651")
サンプル#
from datetime import datetime
import backtrader as bt # 最新バージョンにアップグレード
import matplotlib.pyplot as plt # Backtraderの問題により、pip install matplotlib==3.2.2が必要です
import akshare as ak # 最新バージョンにアップグレード
import pandas as pd
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# AKShareを使用して株式の調整後データを取得し、最初の6列のみ取得します
stock_hfq_df = ak.stock_zh_a_hist(symbol="000001", adjust="hfq").iloc[:, :6]
# フィールド名を処理して、Backtraderの要件に合うようにします
stock_hfq_df.columns = [
'date',
'open',
'close',
'high',
'low',
'volume',
]
# 日付をインデックスに設定して、Backtraderの要件に合うようにします
stock_hfq_df.index = pd.to_datetime(stock_hfq_df['date'])
class MyStrategy(bt.Strategy):
"""
メインストラテジープログラム
"""
params = (("maperiod", 20),) # トレードストラテジーのパラメータをグローバルに設定
def __init__(self):
"""
初期化関数
"""
self.data_close = self.datas[0].close # 価格系列を指定
# トレード指示、買い注文価格、手数料を初期化
self.order = None
self.buy_price = None
self.buy_comm = None
# 移動平均線インジケータを追加
self.sma = bt.indicators.SimpleMovingAverage(
self.datas[0], period=self.params.maperiod
)
def next(self):
"""
ロジックを実行
"""
if self.order: # 実行待ちの指示があるかどうかを確認
return
# ポジションを持っているかどうかを確認
if not self.position: # ポジションを持っていない場合
if self.data_close[0] > self.sma[0]: # 買い条件を判断:終値が20日移動平均線を上抜け
self.order = self.buy(size=100) # 買い注文を実行
else:
if self.data_close[0] < self.sma[0]: # 売り条件を判断:終値が20日移動平均線を下抜け
self.order = self.sell(size=100) # 売り注文を実行
cerebro = bt.Cerebro() # バックテストシステムを初期化
start_date = datetime(1991, 4, 3) # バックテスト開始日
end_date = datetime(2020, 6, 16) # バックテスト終了日
data = bt.feeds.PandasData(dataname=stock_hfq_df, fromdate=start_date, todate=end_date) # データをロード
cerebro.adddata(data) # データをバックテストシステムに追加
cerebro.addstrategy(MyStrategy) # トレードストラテジーをバックテストシステムに追加
start_cash = 1000000
cerebro.broker.setcash(start_cash) # 初期キャッシュを100000に設定
cerebro.broker.setcommission(commission=0.002) # 取引手数料を0.2%に設定
cerebro.run() # バックテストシステムを実行
port_value = cerebro.broker.getvalue() # バックテスト終了後の総資産を取得
pnl = port_value - start_cash # 損益統計
print(f"初期キャッシュ: {start_cash}\nバックテスト期間:{start_date.strftime('%Y%m%d')}:{end_date.strftime('%Y%m%d')}")
print(f"総資産: {round(port_value, 2)}")
print(f"純利益: {round(pnl, 2)}")
cerebro.plot(style='candlestick') # グラフを描画