AIとファイナンス

AIとファイナンスの架け橋、それがこのブログの目指すところです。兼業投資家向けに、Pythonを駆使して株やFXの分析を「自分で」行えるようになるための情報を提供します。ニューラルネットワークを活用した市場予測から、実証済みの金融理論まで、全てのコードを公開し、誰もが活用できるように!是非色々なコードで遊んでみてください!

【米国ETF】2024/2/28 保有残高【NISA】

今週の運用状況も公開していこうと思います。現在Side Fireを目指して活動中です。


週間サマリー:今週の大きな動きとして約$1500分米国ETFを買い増しています。買い増しに際しては自家製のリバランスプログラムを使いました。もちろん無料でコードを公開していますので皆さんも使ってくださいね!

今日のS&P 500指数は微減で推移しており、0.04%の下落を記録しています。具体的には、5,076.27ポイントから1.91ポイント下がり、5,076.13ポイントとなりました​​。近期のパフォーマンスを見ると、過去5日間で約0.87%の下落がありますが、その一方で過去6ヶ月で23.46%の上昇を見せています。年初来では、約8.21%の上昇を記録しています​​。

DailyFXの分析によると、S&P 500指数は、米国の大手上場企業500社のパフォーマンスを追跡することで、米国株式市場の強さの実況指標として機能しています。今日の取引でのピボットポイントは5065.3ポイントで、抵抗レベルとサポートレベルがそれぞれ設定されています​​。

取引履歴: 今週の取引は以下の通りです。

 米国ETF

AGG 1株
VEA 11株
VOO 1株
VTI 1株
VWO 4株
合計$1,521.69

2024/2/28 取引残高

米国ETF $53,100.02 (¥8,005,146.44 @150.76)

投資信託 ¥2,128,096

現金 ¥0

今回入金をしたことで瞬間ではありますが、資産1000万円を突破しました!引き続き頑張って積み立てていきます!

2024/2/28 米国ETF

2024/2/28 投資信託円建て

2024/2/28 資産推移

 

【ChatGPT】GPTが書いてくれたPinescrtiptは動くのか?【Trading View】

前回の記事ではトレーディング戦略を口語で説明するとPinescrtiptでStrategyを書いてくれるChatGPTを作ってみました。今回はそれが果たして本当に使えるのかを調べてみましょう!ちなみにこのGPTへのリンクはこちらです。

さて、こちらがスタートした時の画面になります。ここに口語でどんどん作戦の内容を入れていきます。

Trading Strategy Pinescripter 入力画面

このようにどんなものがあるかを聞けば具体例を列挙してくれます。今回はFXの作戦でよくあるMACDを使ったトレーディング戦略をやってみましょう!

トリガーの種類

このようにGPTに指示を出すと以下のように戦略をまとめてくれたうえでPinescrtiptを出力してくれます。今回出力されたScriptは最下部に丸々載せているので「GPTはちょっと」、という方もTrading Viewにコピーして使ってみてください!

戦略のまとめ

 

バックテスト結果

バックテスト結果は、、、あれ、意外と悪くない?
今回この結果に至るまでにかかった時間はわずか10分。そう考えるとこれは悪くないですよね。

皆さまも是非使ってみてください。

 

 

ーーーーーーーーーーーここからコードーーーーーーーーーーーーー

//@version=5
strategy("My Strategy", overlay=true, margin_long=25, margin_short=25)

// Define strategy settings
atr = ta.atr(14)
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
prev_close = request.security(syminfo.tickerid, "D", close[2])

// Calculate strategy values
longCondition = ta.crossover(macdLine, signalLine) and close > prev_close
shortCondition = ta.crossunder(macdLine, signalLine) and close < prev_close

// Output strategy data
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")

// Determine long trading conditions
if (longCondition)
    strategy.entry("Long", strategy.long)

// Code short trading conditions
if (shortCondition)
    strategy.entry("Short", strategy.short)

// Submit entry orders
// Note: The position size is dynamically calculated based on account balance and leverage, which is handled internally by TradingView.

// Submit exit orders
strategy.exit("Exit Long", "Long", trail_points=atr*3, trail_offset=atr*3)
strategy.exit("Exit Short", "Short", trail_points=atr*3, trail_offset=atr*3)

【ChatGPT】Pinescriptを書いてくれる専用のGPTを作ってみよう【Trading View】

はじめに:Pinescriptとは何か?
投資の世界では、トレーディング戦略を定量化し、バックテストなどで市場の動きと自身のトレーディング戦略を解析することが成功の鍵です。この定量化」という部分が重要でこれができると再現性が生まれ、EAを作って自動取引を行えるようになります。

この定量化を行う一つの方法として、トレーディングプラットフォーム「TradingView」で使用されているPinescript」というプログラミング言語を使う方法があります。この言語は、トレーダーがカスタムインジケータや戦略を作成し、市場分析を自動化するための強力なツールです。ただしプログラミング言語なので自分で書いてみる必要があります。

Trading Viewの画面:自分でスクリプトを書く必要がある

GPTとカスタムバージョンの可能性
次に、GPTとは何か、そしてなぜカスタムバージョンが注目を集めているのかについて触れましょう。GPT(Generative Pre-trained Transformer)は、あらゆるテキストベースのタスクに対応可能な、非常に柔軟なAIです。最近では、特定の用途に特化したカスタムGPTの開発が可能になり、特にファイナンス分野においてその価値が見直されています。そうなんです、これがあれば今まで自力で書いていたプログラムをGPTが自動で書いてくれるようになります!

 

GPTをカスタマイズする方法
このGPTをカスタマイズする、ということ自体はそんなに難しくはありません。まず基本となるGPTモデルから始めます。次に、Pinescriptのような特定の分野に関するデータでモデルをファインチューニングし、その分野における言語モデルの専門性を高めます。このファインチューニングもOpenAIだとテキストベースで行えます。

テキストベースでどのようなGPTを作りたいかを指示する

 

 

実践例:Pinescript専用GPTの構築
最後に、私たちが実際に構築したPinescript専用GPTの例を紹介します。このカスタムGPTは、Pinescriptのコード生成に特化しており、トレーダーが市場データを基にした戦略を考案する際に、コーディングの労力を大幅に削減します。実際に今回はPinescrtiptを書いてくれる専用GPT を作成しました。その名も「Trading Strategy Pinescripter」!!あまりにも安直な名前ですが名は体を表すということでご勘弁ください。

Trading Strategy Pinescripter

こちらについては以下のURLからアクセスできるのでOpenAIのアカウントを持っている方は是非お試しください!

chat.openai.com

次回はこのPinescrtipterの実力を見るためにいろいろな戦略を試してみようと思います!いつもお読みいただきありがとうございます。

 

参考サイト

Welcome to Pine Script™ v5 — Pine Script™ v5 User Manual documentation (tradingview.com)

TradingView — Track All Markets

 

【米国株】IPO企業の株価変動分析。テンバガー銘柄を探せ!その2【Python】

またまた前回の記事に引き続き、米国IPO株の過去分析を行っていきたいと思います。前提として前回の記事で作成した「ipo_df」の中にはティッカー事に上場日から一年間の株価をダウンロードしてあります。前回はただ単純に視覚化しただけでしたらが今回は各銘柄が最大どのくらい上昇したのか、まったく上昇しなかった銘柄はどのくらいあるのか?を数えることで何かインサイトが得られないか試してみます!

今回は同じデータセットを使って上場後に最大Xパーセントまで上昇した会社が何社あるかというのを視覚化してみたいと思います。これをするとテンバガー(株価が10倍上昇すること)がどれくらい大変なのか、じゃあファイブバガー(5倍)なら少しは起こりやすいのか、というのが見えてきます。

# 10%から1000%まで10%区切りで増加した銘柄の数をカウント
percent_increases = range(10, 1010, 10)  # 10%から1000%まで
percent_counts = {}

for percent_increase in percent_increases:
    multiplier = 1 + (percent_increase / 100)  # 増加率を倍率に変換
    count = (ipo_df.loc[:, 'Normalized Close 1':'Normalized Close 253'] > multiplier).any(axis=1).sum()
    percent_counts[f'{percent_increase}%'] = count

# 結果をDataFrameとして表示
percent_increase_counts_df = pd.DataFrame(list(percent_counts.items()), columns=['Percent Increase', 'Count'])

percent_increase_counts_df

# CSVファイルとして保存
percent_increase_counts_df.to_csv('ipo_data_increace_counts.csv', index=False)

結果

今回のデータセットは2024年2月24日時点で2098社IPOデータです。そのうち株価データが無いもの(上場廃止、または名称を変更したもの)がなんと882社もありました。

#上場初日の株価がNoneになっているものを集計
delisted_likely_count = ipo_df['Normalized Close 1'].isna().sum()

その上で残りの1216社(=2098-882)のうち、一度でも10%以上上昇した銘柄はわずか693社、全体の33%、データが残っているものの内でも55%しかないということがわかります。残りの銘柄は上場日の終値から一度たりとも10%増もつけることなく1倍以下をさまようことになります。先ほどのコードからcsvデータを出力し、確認しましたが5倍を超えた会社はわずか19社でした。いかに成功するIPO銘柄を見つけるのが難しいかがわかりますね。

タイトルのわりに、少し辛気臭い終わり方になってしまいましたが今回は一度ここまでにしてみます。突破口が何かないか少し考えてみます!

 

 

【米国株】FOMC議事録要旨 2024年1月【投資】

1. 会議の要旨

  • 経済活動: 経済活動は堅調な成長を示しており、実質GDPは2023年第4四半期に堅調なペースで成長したが、第3四半期の強力なペースからは減速した。労働市場条件は引き続き厳しく、しかし、さらなる緩和の兆しも見られた。
  • 雇用: 平均月間の非農業部門雇用の増加ペースは第4四半期に第3四半期より遅くなった。失業率は12月に3.7%で変わらず、第3四半期の平均と同じだった。
  • インフレ: 消費者物価インフレは年末に向けて顕著に減速した。個人消費支出(PCE)価格指数は12月末の12ヶ月間で2.6%増加し、コアPCE価格インフレは同期間で2.9%だった。どちらも前年同期比で大幅に低下した。

2. 政策金利の決定

  • 政策金利: FOMCは、連邦資金利率の目標範囲を5.25%から5.50%に維持することを決定した。

3. 政策金利以外の操作

  • オープンマーケット操作: 議事録では具体的な新しいオープンマーケット操作についての言及はなかったが、バランスシートの縮小プロセスを継続するとの言及があった。

4. 投票結果

  • 投票結果: この政策決定は全会一致で行われました。

5. 論調の変化

  • 前回の会議(2023年12月12日から13日)と比較して、経済活動の強さとインフレの減速に対する自信が強まっています。しかし、インフレが目標に持続的に近づくまで政策金利を引き下げることは適切ではないという姿勢は変わっていません。

特に注目すべき変化としては、インフレの減速が顕著になっている点です。これは、FOMCの政策が経済活動に影響を与え、インフレ圧力を抑制し始めていることを示しています。しかし、労働市場の状況が依然として厳しく、経済活動の継続的な監視が必要であることも強調されています。

参照先のリンク: The Fed - Meeting calendars and information (federalreserve.gov)

【米国ETF】2024/2/21 保有残高【NISA】

今週の運用状況も公開していこうと思います。現在Side Fireを目指して活動中です。


週間サマリー:今週はこの後FOMC議事録要旨の公開や大注目銘柄のNVIDIAの決算発表があったり、一波乱が起きそうなので基本的に静観しております。

事実昨日の米国市場のサマリーは、ダウ・ジョーンズ工業平均は0.10%下落して38,526.43に、S&P 500は0.09%の小幅な下落で4,970.97に終わり、ナスダック総合指数も0.42%下がって15,564.42になりました。これらの動きは、投資家達の慎重な姿勢を反映していると考えられますよね! 

取引履歴: 今週の取引はありませんでした。

 

2024/2/21 取引残高

米国ETF $50,553.03 (¥7,596,755.22 @150.27)

投資信託円建て ¥2,091,166

現金 ¥2,844

2/21 米国ETF

2/21 投資信託円建て

2/21 資産推移

参考サイト

U.S. Stock Market Headlines | Breaking Stock Market News | Reuters

【米国株】IPO企業の株価変動分析。テンバガー銘柄を探せ!【Python】

こんにちは、前回の記事ではここ米国市場でこの5年間でIPOした企業のリストをダウンロードすることに成功しました。今回はこのリストを元に株価をダウンロードして何か有益な情報を得られないか見てみましょう!前提として前回の記事で作成した「ipo_df」の中に入っているティッカーの株価をダウンロードしていきます。最下段に前回のものを含めたコードを書いておきますので皆さまも是非試してみてください!

データの準備

yfinanceを使用して、各ティッカーの株価データをダウンロードします。

import pandas as pd
import yfinance as yf

# 各ティッカーの株価データをダウンロードし、正規化してDataFrameに追加
for index, row in ipo_df.iterrows():
    ticker = row['ticker']
    ipo_date = row['ipo_date']
    stock = yf.Ticker(ticker)
    # IPO日から1年後までのデータを取得
    hist = stock.history(start=ipo_date, end=pd.to_datetime(ipo_date) + pd.DateOffset(years=1))
 

正規化

上場日の終値を基準にして、1年間の終値を正規化します。

    # 上場日の終値を基準に正規化
    if not hist.empty and 'Close' in hist:
        base_price = hist.iloc[0]['Close']
        normalized_close = hist['Close'] / base_price

DataFrameへの追加

正規化した終値ipo_dfに新しい列として追加します。

        # 正規化した終値ipo_dfに追加
        for i, value in enumerate(normalized_close):
            column_name = f'Normalized Close {i}'
            if column_name not in ipo_df:
                ipo_df[column_name] = None  # 新しい列をNoneで初期化
            ipo_df.at[index, column_name] = value

結果

データの視覚化

さて、上の表のようにデータを集めることができました!そうしたら次はもちろん視覚化ですよね!今回のデータの中には100倍超になったものもありましたがかなりレアなケースなので今回は0から15倍までを視覚化してみます。

# 正規化した株価が0-15までの範囲を全て重ね合わせてプロット
plt.figure(figsize=(14, 8))

# 日数ごとの正規化された終値をプロット
for index, row in ipo_df.iterrows():
    normalized_prices = row[4:].values  # 'ticker', 'ipo_date', 'name', 'ipo_price'を除いた正規化された株価を取得
    days_since_ipo = range(len(normalized_prices))
    plt.plot(days_since_ipo, normalized_prices, label=row['ticker'])

# 株価1倍の線を濃い緑色の太めの線で表示
plt.axhline(y=1, color='darkgreen', linestyle='-', linewidth=2, label='Stock Price 1x')

plt.title('Normalized Stock Prices After IPO (0-15 Range)')
plt.xlabel('Days Since IPO')
plt.ylabel('Normalized Stock Price')
plt.ylim(0, 15)  # Y軸の範囲を0から15に設定
#plt.legend()
plt.show()

結果

結果はご覧の通り!これだけではパット見ると上場一年以内に一度でもテンバガーしているのがわずかに三社しかないというのが視覚的にも分かりますね!見たところ倒産したり低迷しているものはたくさんありますが倍以上になっているものもかなりありそうです。次回はこれらをもう少し深く分析していきましょう!

是非クリックお願いします!

 

import requests
import pandas as pd
from bs4 import BeautifulSoup
import re
from datetime import datetime
import yfinance as yf
import matplotlib.pyplot as plt

current_year = datetime.now().year  # 現在の年を取得
data = []  # スクレイピングしたデータを保存するリスト

while True:
    url = f'https://stockanalysis.com/ipos/{current_year}/'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # ページが存在しない場合、ループを終了
    if response.status_code != 200:
        break
   
    # 'const data'が含まれているスクリプトタグを探す
    # DeprecationWarningを避けるために'string'を使用
    script = soup.find('script', string=lambda t: t and 'const data' in t)

    # スクリプトタグからデータ部分を抽出
    data_str = script.string.split('const data = ')[1].split(';')[0]

    # 正規表現を使用して、必要なデータを抽出
    pattern = r'\{s:"(?P<ticker>[^"]+)",ipoDate:"(?P<ipo_date>[^"]+)",n:"(?P<name>[^"]+)",ipoPrice:(?P<ipo_price>\d+\.?\d*)'
    matches = re.finditer(pattern, data_str)

    # 抽出したデータをリストに格納
    for match in matches:
      data.append(match.groupdict())
   
    current_year -= 1  # 次のループで前年のデータをチェック

# 最後に、全てのデータをDataFrameに変換し、CSVファイルとして保存
ipo_df = pd.DataFrame(data)
ipo_df.to_csv('ipo_data.csv', index=False)

# 各ティッカーの株価データをダウンロードし、正規化してDataFrameに追加
for index, row in ipo_df.iterrows():
    ticker = row['ticker']
    ipo_date = row['ipo_date']
    stock = yf.Ticker(ticker)
    # IPO日から1年後までのデータを取得
    hist = stock.history(start=ipo_date, end=pd.to_datetime(ipo_date) + pd.DateOffset(years=1))
   
    # 上場日の終値を基準に正規化
    if not hist.empty and 'Close' in hist:
        base_price = hist.iloc[0]['Close']
        normalized_close = hist['Close'] / base_price
       
        # 正規化した終値ipo_dfに追加
        for i, value in enumerate(normalized_close):
            column_name = f'Normalized Close {i}'
            if column_name not in ipo_df:
                ipo_df[column_name] = None  # 新しい列をNoneで初期化
            ipo_df.at[index, column_name] = value
 
# 正規化した株価が0-15までの範囲を全て重ね合わせてプロット
plt.figure(figsize=(14, 8))

# 日数ごとの正規化された終値をプロット
for index, row in ipo_df.iterrows():
    normalized_prices = row[4:].values  # 'ticker', 'ipo_date', 'name', 'ipo_price'を除いた正規化された株価を取得
    days_since_ipo = range(len(normalized_prices))
    plt.plot(days_since_ipo, normalized_prices, label=row['ticker'])

# 株価1倍の線を濃い緑色の太めの線で表示
plt.axhline(y=1, color='darkgreen', linestyle='-', linewidth=2, label='Stock Price 1x')

plt.title('Normalized Stock Prices After IPO (0-15 Range)')
plt.xlabel('Days Since IPO')
plt.ylabel('Normalized Stock Price')
plt.ylim(0, 15)  # Y軸の範囲を0から15に設定
#plt.legend()
plt.show()