祇(くにつがみ):Path of the Goddessの実績をコンプしたぞ!

初めに 最近発売された祇というゲームの実績をコンプしました! 公式サイトはこちら。Steamのストアページはこちら。 こちらのゲームは**タワーディフェンス(以下TD)**のゲームになります。主人公である宗を操作し、世代を守りながら村を救っていきます。 また、宗以外に村人が存在し、ジョブを与えることで攻撃法を得ることができます。操作はできず場所を設定するだけですが… ゲームについて 前提として敵の名前を畏哭、ジョブの変更やステージ進行のアイテムを結晶とします。 攻略の流れ ステージ攻略流れとしては 穢れを払い結晶を得る 結晶を使って霊道を引く 大工に仕掛けを頼む 村人を救う 結晶を使ってジョブを与える 夜は畏哭を倒し、結晶を拾う という感じになります。ボス戦はジョブを与えて倒すだけです。 攻略について ステージを攻略する際は先に霊道を引くことをおすすめします。私の性格もありますが早めにクリアしたいので、ある程度引いてから穢れ払いや村人救いをするとよいです。 他に仕掛けがあり、ステージ攻略が有利になるトラップがあります。味方のバフ、敵の速度ダウン、遠距離の攻撃範囲拡大等があります。結晶の消費はないですが仕掛けを作るのに時間がかかります。早めに頼んだ方が多く作れるので意識すると良いです。 ステージ攻略では物盗りがいると楽になります。お宝を見つけると食料や結晶がもらます。また、最大まで強化していれば落ちている結晶を集めてくれます。途中から複数個所から敵が沸くのでその時に活躍します。 ステージによっては霊道を引かない、主人公が使えない、船の上(刀をあまり振らない)ということがあります。それに適した鍔や魔像を選ぶとサクサク進めます。 強化について 強化をする際は仮面か主人公のどちらかを選ぶことができます。初期に戻せる上に素材も帰ってくるので気軽に強化できます。 主人公の弓や結ノ舞(ダウン攻撃)、溜め攻撃がおすすめです。また、後々のことを考えて後の先(カウンター)を使えるようになっておくと良いです。余裕があれば魔像や鍔も欲しいです。 仮面は初期の斧や弓、その後はタンクや回復(可能なら5段階まで)、最後は銃や大砲(可能なら6段階)がおすすめです。強化素材は気軽に戻せるので使わなければ初期に戻すのもありです。 基本主人公がタゲをとり後ろから村人が遠距離攻撃が楽だと思います。火縄は火力が高いですがダウンは取れないので良し悪しは分かれそうです。 ミッションについて それからミッションが各ステージに存在します。1度目の攻略ではわかりませんが2度目以上からはみえるようになります。ステージ内ではカウント系も可視化されます(例: 50体倒せなら現在30 / 50) ミッションをクリアすれば鍔や魔像、産霊(むすび)が手に入ります。鍔は必殺技、魔像はパッシブ付与、産霊はジョブや主人公強化素材という感じです。 2週目では新たなミッションが追加されます。全部回収できれば主人公と仮面の両方が最大まで強化できます。 復興について 村を救うと拠点として使え、復興をすることになります。復興は村人に指示した後、ステージをクリアすると復興が完了します。復興が完了すると産霊や絵馬がもらえます。絵馬は畏哭や仮面、動物のバックグラウンドが読めます。絵馬は面白いのでおすすめです。 また、村の復興が完了すると結晶や食料の所持量が増えます。所持量が増えるとステージ攻略が楽になるので積極的に行うと良いです。 装備について 攻撃の型が2種類あるのですが、初期の型が使いやすいですね。出が早くボタン入力後のストレスが感じにくいです。別の型は納刀しないと攻撃しないのでテンポが悪く感じました。 鍔(必殺技)は大体レジストゲージ(ダウンを取れる)を削るものを選んでました。ただ、初期のころは勝手がわかってなかったので村人の防御強化を使ってました。 魔像は基本主人公攻撃上昇で問題ないと思います。ただ、ステージ攻略では結晶の消費減や村人強化も使ってました。 個人的に好きなのは溜め攻撃の時間短縮や弓攻撃速度アップですね。主人公がダメージを受けない系のミッションでは弓が大活躍したのでおすすめです。 感想 個人的に良かった点と改善してほしい点がいくつか書いてみようと思います。 良かった点 無双系に似た範囲攻撃の爽快感 主人公を一切操作せず、攻略できた時の楽しさ 装備や強化の幅が広がった時のワクワク 大神アレンジが入った音楽 畏哭や村人のバックグラウンド 細部まで装飾があり綺麗 弱→弱→弱→強を良く使っていたのですが、この操作感は好きです。その他は使う機会が少なかったですが… TDなので主人公を一切操作せず、ステージクリアした時は気持ちよさがあります。結晶集めを物盗りに任せれば放置も可能ですね。 特定のボスを討伐するとジョブの解放と主人公の強化ができます。攻略の幅やクリアできなかったミッションも進められるようになって楽しいです。 大神の実績コンプまで出来てないのですが、クリアまでやったことはあります。少し懐かしく感じ2週目で試してみました。 畏哭には畏哭となった経緯、村人は村での関係性が書かれています。設定が細かく、ついつい確認しちゃうんですよね。 世代の見た目や仮面等細部まできれいに装飾が施されて見るだけで楽しいです。各ステージや畏哭などの3Dモデルも見てみると良いです。 改善してほしい点 村人のジョブ変更の手間 お祓い後のスキップタイミング 拠点の移動 ボスラッシュ 装備の付け替え 結晶を使ってジョブを変更できますが、最大12人も変更する必要があるので大変です。しかも近づかないと変更ができないのでかなり面倒です。 お祓いが終わった後のスキップが少し遅いですね。ムービーが始まったらすぐスキップできると周回時楽になります。 拠点では復興という作業があります。特定の場所で村人を数人指定して復興できるのですが、移動が手間ですね。復興の場所までワープかその場で指示できれば楽ですね。 ステージではボスラッシュが存在するのですが、ボスのたびにジョブの付け替えが必要になります。そこが大変だったのでもう少し良いやり方がなかったかなと。 装備の付け替えが拠点の天幕に移動しないとできないので、拠点またはステージ選択でも出来たら楽だなとは思いました。 終わりに プレイ時間は攻略を見ずに41時間ぐらい。ミッション等事前に見てればもう少し早く終わらせることができると思います。 ...

2024年7月28日

短期売買と分析力が向上しそうな株価予測をだらだらとやる part9

前回のあらすじ 確率的勾配降下法を使って予測をしてみました。 うまくいかなかったので、別の方法を試すことにしました。 LSTM 時系列分析の代表モデルと言えばLSTMだと思います。 というわけで前回とはプログラムを分けて実装しました。 import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LSTM, Input import matplotlib.pyplot as plt import glob dm_fol = './datamart/' stock_list = glob.glob(dm_fol + "*.parquet") # データの読み込みと前処理 def preprocess_data(df, time_step=60): df['Close'] = df['Close'].astype(float) data = df[['Close']].values # データのスケーリング scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(data) # LSTM用のデータセット作成 X, Y = [], [] for i in range(time_step, len(scaled_data)): X.append(scaled_data[i-time_step:i, 0]) Y.append(scaled_data[i, 0]) X, Y = np.array(X), np.array(Y) X = X.reshape(X.shape[0], X.shape[1], 1) return X, Y, scaler # LSTMモデルの構築 def create_lstm_model(input_shape): model = Sequential() model.add(Input(shape=input_shape)) # Inputオブジェクトを使用して入力形状を指定 model.add(LSTM(50, return_sequences=True)) # model.add(LSTM(50, return_sequences=True, input_shape=input_shape)) model.add(LSTM(50, return_sequences=False)) model.add(Dense(25)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mean_squared_error') return model # モデルの評価とプロット def evaluate_model(df, model, scaler, X_train, y_train, X_test, y_test, time_step, sticker_name): y_train_pred = model.predict(X_train) y_test_pred = model.predict(X_test) y_train_pred = scaler.inverse_transform(y_train_pred) y_test_pred = scaler.inverse_transform(y_test_pred) y_train = scaler.inverse_transform([y_train]) y_test = scaler.inverse_transform([y_test]) train_mse = np.mean((y_train_pred - y_train[0]) ** 2) test_mse = np.mean((y_test_pred - y_test[0]) ** 2) print(f"Train Mean Squared Error: {train_mse}") print(f"Test Mean Squared Error: {test_mse}") # プロット df.set_index('Date', inplace=True) train_dates = df.iloc[time_step:len(y_train[0])+time_step].index test_dates = df.iloc[len(y_train[0])+time_step-1:-1].index plt.figure(figsize=(14, 7)) # plt.plot(train_dates, y_train[0], label='Train Actual', color='black') plt.plot(test_dates, y_test[0], label='Test Actual', color='red') plt.plot(test_dates, y_test_pred, label='Test Predicted', color='blue') plt.title(sticker_name+': Actual vs Predicted Stock Prices') plt.xlabel('Date') plt.ylabel('Close') plt.legend() plt.show() # 次の日の予測 def predict_next_day(model, scaler, df, time_step=60): data = df[['Close']].values last_data = data[-time_step:] last_data_scaled = scaler.transform(last_data) X_input = last_data_scaled.reshape(1, time_step, 1) next_day_prediction = model.predict(X_input) next_day_prediction = scaler.inverse_transform(next_day_prediction) print(f"Next Day Prediction: {next_day_prediction[0][0]}") # データの読み込み for count, stock_data in enumerate(stock_list): df = pd.read_parquet(stock_data) sticker_name = stock_data.split('\\')[1].replace('.parquet', '') # データの前処理 time_step = 60 X, Y, scaler = preprocess_data(df, time_step) # データの分割 train_size = int(len(X) * 0.8) X_train, X_test = X[:train_size], X[train_size:] y_train, y_test = Y[:train_size], Y[train_size:] # モデルの構築と訓練 model = create_lstm_model((X_train.shape[1], 1)) model.fit(X_train, y_train, batch_size=1, epochs=1) # モデルの評価 evaluate_model(df, model, scaler, X_train, y_train, X_test, y_test, time_step, sticker_name) # 次の日の予測 predict_next_day(model, scaler, df, time_step) コード確認 # LSTM用のデータセット作成 X, Y = [], [] for i in range(time_step, len(scaled_data)): X.append(scaled_data[i-time_step:i, 0]) Y.append(scaled_data[i, 0]) X, Y = np.array(X), np.array(Y) X = X.reshape(X.shape[0], X.shape[1], 1) LSTM用のデータセットは60日分のデータを学習として使い、次の日を出力として使用するという特徴があります。 ...

2024年7月24日

投資信託を売却しようとしたら数日かかるのを知らなかった話

投資信託の売却と資金不足 パスポートを取得した話をしましたが、海外に行こうと思って70万近くの口数を売却しようとしました。 後日詳しく話しますが、ビザを取って語学学校に行ってみよう!と考えていたので銀行口座の貯金だけでは足らなかったのです。 100株単位ですが日米株を売買したこともあったので、当日に何とかなるかなと思ってました。 数営業日必要なのを知らなかったので資金が用意出来ず、入学申請を1週間見送ることになりました。 入学予定のタイミングや価格は変わらないので特に問題ないです。為替分の価格は変動しますが…。 私の場合は入学許可証がないとビザの申請ができないので、それも1週間先送りですね。 海外での投資について 現在SBI証券を使って投資を行っていますが、海外に居住する際は全て売却しなければなりません。 ここはちょっと痛いところですね。数十年単位で投資する予定だったので…。 一応海外でも投資できるサイトはありますので、現地で使えればそちらを活用していく予定です。 IB証券というところで、SBI証券が米国株の取引の際に取次ぎを行う会社らしいです。 相も変わらず投資信託を買う予定です。ただ数%ぐらいは色んな国を見て株を買ってみようと思います。 それから暗号資産も買ってみようかと思います。 日本の税率は雑所得扱いで累進課税が採用されています。住民税10%を含めると最大55%になります。海外はそこまで高くないので触るくらいはしてみようと思います。 自身の投資実績 最後にどうせ売却するので私のクソ雑魚資産をお見せしようと思います。 コロナで株価が全体的に下がったタイミングで始めました。そこからコツコツと投資信託(オルカンやS&P500)に入れてたので緩やかに増加しましたね。 米国株が急落したら一気に下がるのでリスクヘッジが全くできてませんが… X(旧Twitter)などのSNSを見ると凄い人もいます。ですがパンピーはこんなもんなのでまったりやっていきましょう。ではでは。

2024年7月21日

新しいプラグインをいくつか導入してみた!

私はサイト運営に対してそこまで興味がないです。 ただ、快適に見てもらうに越したことはないし、SEO対策もいつか役に立つかと思っていくつかプラグインを入れてみました! MathJax-LaTeXまたはSimple MathJax 数式を表すのに必須と言えます。 数学の世界でも良く使われるものになります。例えば平均二乗誤差を数式で表すと MSE = 1 / n ∑(yi - y)^2 (yiは予測値、yは正解値) ←この書き方が↓のようになります。 $$MSE = \frac{1}{n}\sum_{i=1}^{n}(\hat{y_{i}}-y_{i})^2$$ 実際にコードに書き起こすとこんな感じ いつ使うかわかりませんが、数式を使う機会がある人は覚えておくと良いかと思います。 最悪Chat-GPTなどの生成AIに頼る方法もありますので。 WP ULike いいねボタンやグッドボタン的なやつです。記事の下部やコメントした時に表示されると思います。 特に誰がやったか全くわからないので雑に付けられると思います。 X(旧Twitter)のようにいいねした記事が見れるようにしてみたい気持ちはあります。 Yoast SEO SEO対策のプラグインになります。有料限定の機能もあるみたいですが、そこまでではないので無料でやってます。 昔の記事に比べて見出しを付けるようになりましたが、このプラグインによるものです。 後はメタディスクリプションを入れています。こんな感じでリンクの下に出ているやつです。 ちなみにメタディスクリプションは全体の文字をコピーして生成AIに70字で作ってもらってます。 自分で考えるのも面倒ですし… 終わりに 同じものずっとやり続けるのではなく、気が向いたら良くしてみよう!だとか新しいものを取り入れてみるといい変化があると思います。 すぐに役に立つかはわかりませんがちょっとした話もできるかもしれないですし。 それから少しコメントをしやすくしてみました。 認証も文字列を入れるのは面倒ですが、名前もメールアドレスも不要にしました。こんな感じになると思います。 サイトが重くならない程度に面白いプラグインや設定が会ったら試してみます!ではでは。

2024年7月18日

短期売買と分析力が向上しそうな株価予測をだらだらとやる part8

前回のあらすじ 株価予測を行うコードをいったん書いてみました。 課題はまだ残ったままですが、今回はそこを解決しつつモデルを追加で学習するというやり方を試してみました。 確率的勾配降下法 def predict_next_day(model, scaler, df): last_row = df.drop(columns=['Close']).iloc[-1].values.reshape(1, -1) # last_row = df.iloc[-1, :-1].values.reshape(1, -1) df.drop(columns=['Close']).iloc[-1].to_csv("test.csv") last_row_scaled = scaler.transform(last_row) next_day_prediction = model.predict(last_row_scaled) print(f"Previous Day Prediction: {df.iloc[-1]['Close']}") print(f"Next Day Prediction: {next_day_prediction[0]}") 前回の予測部分ですが予測するカラムが異なっていたので変な値が出ていました。 修正したことによってだいぶまともな値に修正ができました。 ただ、うまくいくときはきれいな形になっていますがそうでないことも多いです。 波があるところはうまくできている方ですが、直線気味だとうまくいかないですね。 毎回初期化しているのですが、ダメですね。使ってるモデルが確率的勾配降下法も要因としてあるかもしれないです。 というわけで追加学習する形に変更しようと試してみました。 def update_model(model, scaler, new_df): target = new_df['Close'].shift(-1).dropna() features = new_df.drop(columns=['Close']) features = features[:-1] # データのスケーリング X = scaler.transform(features.values) y = target.values model.partial_fit(X, y) # 新しいデータに対する予測と評価 # X_new = scaler.transform(new_df.drop(columns=['Close']).values) X_new = scaler.transform(new_df.drop(columns=['Close']).iloc[:-1].values) y_new = new_df['Close'].shift(-1).dropna().values y_new_pred = model.predict(X_new) mse_new = mean_squared_error(y_new, y_new_pred) print(f"New Data MSE: {mse_new}") for count, stock_data in enumerate(stock_list): ・ ・ ・ if count == 0: model, scaler, X_train, X_test, y_train, y_test = train_model(df) # モデルの評価 y_pred = evaluate_model(model, X_test, y_test) else: update_model(model, scaler, df) ...

2024年7月15日

最近やったゲームをつらつらと

掲題の通り最近やったゲームを少し上げてみようと思います。 風のクロノア 1 & 2 アンコール 前から少しずつ進めていたゲームを全クリしてきました! 幼いころ少しだけ遊んだ記憶があって楽しかったので、購入してプレイしてました。 アクションゲームなので人によっては苦手だと思います。 実績として収集要素がありますが、基本見やすい場所にあるので達成しやすいと思います。 ストーリー中喋ってくれるのですが、独自の言葉を喋るので字幕を見ることにはなるんですよね。とは言え結構癖になる話し方をするので聞いちゃうのですが… 溶鉄のマルフーシャ こちらタワーディフェンス系のゲームになります。 機械兵が来るので銃器を使って撃破し、壁を守るゲームになります。 銃器は使用日数があるので交換しつつ、仲間を迎えて80日間生き残ることを目指します。 銃器は初期から変えた方がいいですが、仲間はいたほうが楽になると思います。 また、ゲームオーバーになってもある程度資金を持った状態で同じ日からスタートするので、苦手でも安心して進めることができます。 慣れれば実績も達成しやすく、そこまで時間もかからないのでおすすめしやすいです。 今年、続編が出ますのでそちらも楽しみに待っています。 なつもん! 20世紀の夏休み まだエンディングを迎えてもいないですが、現在プレイしているゲームになります。 こちらはダンガンロンパやシュタインズゲートでおなじみのスパイクチュンソフト様から出たゲームになります。 内容としてはオープンワールドの"ぼくなつ"というイメージですね。私は"ぼくなつ"をやったことはないですが… やることは昆虫採集や魚釣り、化石の発掘、人との交流、サーカスを盛り上げるなどがあります。 一部引き継いで2週目もできるみたいなのでまったりとやりたいことを進めればいいと思います。 ある程度進めると"ラブちゃん"という方が登場して、占いをしてくれます。 占いでは絵日記にかける内容の話や珍しい昆虫や魚の場所等いろいろと教えてくれます。1日を過ごすうえで指標になるので、是非活用することをおすすめします。 それからステッカー(スタミナ)という概念が存在します。これは走ったり泳いだり登ったりするときに必要になります。 集める方法としては大きな冒険と探偵ノートをクリアすることなので、積極的に進めていくのが良いです! 早くエンディングを進めてDLCも遊びたいですね。 終わりに 他にもいろいろと遊んでいるものもありますが、今はこんな感じです。 勉強も必要ですがストレス解消も必要なので、無理しない程度に頑張りましょう!ではでは。

2024年7月12日

最近あった出来事をだらだらと

個人的にいろいろあったので残すために書いておきます。 MRI検査 前回も少し話しましたが、6/29(金)にMRI検査を受けてきました。 いただいた検査結果の内容を見てみると 所見: 左内頸動脈の栄上部に若干の狭小化が疑われますが、equivocal(判断が難しい)な所見です。その他、頭蓋内の動脈に広狭不整や動脈瘤は指摘できません。左内頸動脈は全体的に hypoplastic(発育不全)ですが、右内頸動脈から前交通動脈を介して両側大脳動脈が描出されているためと思います。両側椎骨動脈に解離を疑わせる所見はなく、脳底動脈の血流は良好です。 聴神経や内耳に異常なく、聴神経腫瘍は指摘できません。両側乳突蜂巣の含気も良好です。新鮮な梗塞やラクナ梗塞、皮質梗塞は指摘できません。基底核や白質の intensity(信号強度)も良好で、加齢に伴う Nonspecific findings(非特異的所見)は認められますが、年齢相応です。出血の既住もありません。側脳室の大きさや形も正常です。水頭症や病的な萎縮は指摘できません。 ということで特に何もないので経過観察となりました。 パスポート申請 今後のことを考えてパスポートの申請に行きました。外務省のページに記載されていますが、最低限必要なものは 申請書 戸籍謄本 写真 になります。 申請書は事前に記載してダウンロードすると楽になります。写真もスマホで撮ったものをコンビニで印刷する方法があります。計660円必要ですが、こちらから印刷できます。 戸籍謄本に関しては場所によってはコンビニで印刷できると思います。私の場合は戸籍と居住地が違うので市役所まで行く必要があったので、この準備が大変でした。 私は東京の池袋で申請しましたが人がかなり多かったです。大体6時過ぎくらいに向かいましたが、受付に20分、申請に70分くらいかかりました。 やはり平日の空いてるタイミングを狙った方がスムーズですね。あるいは申請のタイミングで食事に行くのもおすすめです。 ただし、呼ばれたタイミングでいたほうがいいので事前に食べる場所を決めておくと良いです。 支払いは受け取るときなのでお金は準備しなくても問題ありません。 英語力チェック こちらのPROGOSというサイトでSpeakingのテストを受けてみました。 結果は全然ですね… なかなかアドリブではうまいこと喋れないですね。今後の頑張りが必要です。ちなみに検査の見方はこちらから確認できます。 総合評価と各評価、フィードバックとアドバイスがもらえます。 最近あったこととしてはこんな感じです。ゲームの話はまたいずれやります。ではでは。

2024年7月8日

短期売買と分析力が向上しそうな株価予測をだらだらとやる part7

前回のあらすじ オシレーター系指標の説明変数を追加するコードを書きました。 株価予測_コード 今回やることは株価の予測になります。 今回は1ファイルずつ読み込んで実行しています。ティッカーリストがあればティッカーごとにダウンロードしてきて加工する方法もあったのでいずれやります。 import pandas as pd import numpy as np import yfinance as yf from sklearn.linear_model import SGDRegressor from sklearn.metrics import mean_squared_error from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt dm_fol = './datamart/' import glob stock_list = glob.glob(dm_fol + "*.parquet") def preprocess_data(df): df.sort_values('Date', inplace=True) # 日付を特徴量に変換 df['Year'] = df['Date'].dt.year df['Month'] = df['Date'].dt.month df['Day'] = df['Date'].dt.day df['Weekday'] = df['Date'].dt.weekday df['Quarter'] = df['Date'].dt.quarter # 周期成分のエンコーディング df['Month_sin'] = np.sin(2 * np.pi * df['Month'] / 12) df['Month_cos'] = np.cos(2 * np.pi * df['Month'] / 12) df['Day_sin'] = np.sin(2 * np.pi * df['Day'] / 31) df['Day_cos'] = np.cos(2 * np.pi * df['Day'] / 31) df['Weekday_sin'] = np.sin(2 * np.pi * df['Weekday'] / 7) df['Weekday_cos'] = np.cos(2 * np.pi * df['Weekday'] / 7) # 日付を削除 df.drop(columns=['symbol','Date'], inplace=True) # "symbol"以外のobject型カラムをワンホットエンコーディング df = pd.get_dummies(df, columns=[col for col in df.select_dtypes(include=['object']).columns]) # 全ての値が欠損している列を削除 df.dropna(axis=1, how='all', inplace=True) # 値が欠損している行を削除 df.dropna(axis=0, how='any', inplace=True) return df def train_model(df): target = df['Close'].shift(-1).dropna() features = df.drop(columns=['Close']) features = features[:-1] # データのスケーリング scaler = StandardScaler() X = scaler.fit_transform(features.values) y = target.values # データを7:3に分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, shuffle=False) model = SGDRegressor(max_iter=1000, tol=1e-3) model.fit(X_train, y_train) return model, scaler, X_test, y_test def evaluate_model(model, scaler, X_test, y_test): y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) print(f"Mean Squared Error: {mse}") plt.figure(figsize=(14, 7)) plt.plot(y_test, label='Actual', color='black') plt.plot(y_pred, label='Predicted', color='blue') plt.title('Actual vs Predicted Stock Prices') plt.xlabel('Sample') plt.ylabel('Price') plt.legend() plt.show() def predict_next_day(model, scaler, df): last_row = df.iloc[-1, :-1].values.reshape(1, -1) df.iloc[-1, :-1].to_csv("test.csv") last_row_scaled = scaler.transform(last_row) next_day_prediction = model.predict(last_row_scaled) print(f"Next Day Prediction: {next_day_prediction[0]}") # 初回データロードとモデル学習 # start_date = '1990-04-01' # end_date = '2024-07-03' # symbols = ['AAPL', 'MSFT', 'GOOGL'] for stock_data in stock_list: df = pd.read_parquet(stock_data) df = preprocess_data(df) model, scaler, X_test, y_test = train_model(df) # モデルの評価 evaluate_model(model, scaler, X_test, y_test) # 次の日の予測 predict_next_day(model, scaler, df) コードの内容 やったこととしては日付を特徴量に変換しました。 ...

2024年7月6日

短期売買と分析力が向上しそうな株価予測をだらだらとやる part6

前回のあらすじ トレンド系指標の説明変数を追加したところで終わりました。 オシレーター系指標 今回作成したのは RSI RCI 移動平均線乖離率 スローストキャスティクス モメンタムとROC MFI CCI ギャップ ヒストリカル・ボラティリティ def rsi(df): # RSIの計算 window = 14 # 終値の変化 df['Change'] = df['Adj Close'].diff() # 上昇幅と下落幅の計算 df['Gain'] = np.where(df['Change'] > 0, df['Change'], 0) df['Loss'] = np.where(df['Change'] < 0, -df['Change'], 0) # 平均上昇幅と平均下落幅の計算 df['Avg_Gain'] = df['Gain'].rolling(window=window).mean() df['Avg_Loss'] = df['Loss'].rolling(window=window).mean() # 相対力(RS)の計算 df['RS'] = df['Avg_Gain'] / df['Avg_Loss'] # RSIの計算 df['RSI'] = 100 - (100 / (1 + df['RS'])) # シグナルの判定 df['rsi_Signal'] = np.where(df['RSI'] > 70, 'Sell', np.where(df['RSI'] < 30, 'Buy', np.nan)) def calculate_rci(series): n = len(series) date_rank = np.arange(1, n + 1) price_rank = series.rank().values ssd = np.sum((date_rank - price_rank) ** 2) rci = 1 - (6 * ssd) / (n * (n ** 2 - 1)) return rci def rci(df): # RCIの計算 window = 14 df['RCI'] = df['Adj Close'].rolling(window=window).apply(calculate_rci, raw=False) # シグナルの判定(RSIと同様に70以上で売りシグナル、30以下で買いシグナル) df['rci_Signal'] = np.where(df['RCI'] > 70, 'Sell', np.where(df['RCI'] < 30, 'Buy', np.nan)) def madp(df): # 乖離率の計算 df['madp'] = (df['Adj Close'] - df['SMA']) / df['SMA'] * 100 # シグナルの判定 df['madp_Signal'] = np.nan threshold = 5 # 閾値の設定 for i in range(1, len(df)): if df['madp'].iloc[i-1] < -threshold and df['madp'].iloc[i] > df['madp'].iloc[i-1]: df.at[df.index[i], 'madp_Signal'] = 'Buy' elif df['madp'].iloc[i-1] > threshold and df['madp'].iloc[i] < df['madp'].iloc[i-1]: df.at[df.index[i], 'madp_Signal'] = 'Sell' def stochastic(df): # %Kの計算 window = 14 df['14-High'] = df['High'].rolling(window=window).max() df['14-Low'] = df['Low'].rolling(window=window).min() df['%K'] = (df['Adj Close'] - df['14-Low']) / (df['14-High'] - df['14-Low']) * 100 # スロー%Dの計算 df['slow%D'] = df['%K'].rolling(window=3).mean() # シグナルの判定 df['sto_Signal'] = np.nan for i in range(1, len(df)): if df['slow%D'].iloc[i-1] < 20 and df['slow%D'].iloc[i] > df['slow%D'].iloc[i-1]: df.at[df.index[i], 'sto_Signal'] = 'Buy' elif df['slow%D'].iloc[i-1] > 80 and df['slow%D'].iloc[i] < df['slow%D'].iloc[i-1]: df.at[df.index[i], 'sto_Signal'] = 'Sell' def momentum_roc(df): # モメンタムとROCの計算 window = 14 df['Momentum'] = df['Adj Close'] - df['Adj Close'].shift(window) df['ROC'] = ((df['Adj Close'] - df['Adj Close'].shift(window)) / df['Adj Close'].shift(window)) * 100 # トレンドの判定 df['Momentum_Trend'] = np.where(df['Momentum'] > 0, 'Uptrend', np.where(df['Momentum'] < 0, 'Downtrend', 'Neutral')) df['ROC_Trend'] = np.where(df['ROC'] > 0, 'Uptrend', np.where(df['ROC'] < 0, 'Downtrend', 'Neutral')) def mfi(df): # 典型価格(TP)の計算 df['TP'] = (df['High'] + df['Low'] + df['Adj Close']) / 3 # マネーフロー(Raw Money Flow)の計算 df['Raw Money Flow'] = df['TP'] * df['Volume'] # ポジティブマネーフローとネガティブマネーフローの計算 df['Positive Money Flow'] = np.where(df['TP'] > df['TP'].shift(1), df['Raw Money Flow'], 0) df['Negative Money Flow'] = np.where(df['TP'] < df['TP'].shift(1), df['Raw Money Flow'], 0) # 14期間の合計 window = 14 df['Positive Money Flow Sum'] = df['Positive Money Flow'].rolling(window=window).sum() df['Negative Money Flow Sum'] = df['Negative Money Flow'].rolling(window=window).sum() # MFIの計算 df['Money Flow Ratio'] = df['Positive Money Flow Sum'] / df['Negative Money Flow Sum'] df['MFI'] = 100 - (100 / (1 + df['Money Flow Ratio'])) # シグナルの判定 df['mfi_Signal'] = np.nan for i in range(1, len(df)): if df['MFI'].iloc[i-1] < 20 and df['MFI'].iloc[i] > df['MFI'].iloc[i-1]: df.at[df.index[i], 'mfi_Signal'] = 'Buy' elif df['MFI'].iloc[i-1] > 80 and df['MFI'].iloc[i] < df['MFI'].iloc[i-1]: df.at[df.index[i], 'mfi_Signal'] = 'Sell' def cci(df): # 典型価格(TP)の計算 df['TP'] = (df['High'] + df['Low'] + df['Adj Close']) / 3 # 単純移動平均(SMA)の計算 window = 20 df['cci_SMA'] = df['TP'].rolling(window=window).mean() # 偏差(Mean Deviation)の計算 df['Mean Deviation'] = df['TP'].rolling(window=window).apply(lambda x: np.mean(np.abs(x - x.mean())), raw=True) # CCIの計算 df['CCI'] = (df['TP'] - df['cci_SMA']) / (0.015 * df['Mean Deviation']) # シグナルの判定 df['cci_Signal'] = np.nan for i in range(1, len(df)): if df['CCI'].iloc[i-1] < -100 and df['CCI'].iloc[i] > df['CCI'].iloc[i-1]: df.at[df.index[i], 'cci_Signal'] = 'Buy' elif df['CCI'].iloc[i-1] > 100 and df['CCI'].iloc[i] < df['CCI'].iloc[i-1]: df.at[df.index[i], 'cci_Signal'] = 'Sell' def gap(df): # ギャップアップとギャップダウンの計算 df['Previous Close'] = df['Adj Close'].shift(1) df['Gap'] = df['Open'] - df['Previous Close'] df['Gap Type'] = np.where(df['Gap'] > 0, 'Gap Up', np.where(df['Gap'] < 0, 'Gap Down', 'No Gap')) def hv(df): # ヒストリカル・ボラティリティの計算 window = 20 # リターンの計算 df['Return'] = np.log(df['Adj Close'] / df['Adj Close'].shift(1)) # 標準偏差の計算 df['HV'] = df['Return'].rolling(window=window).std() * np.sqrt(252) # df['RCI'] = df['Adj Close'].rolling(window=window).apply(calculate_rci, raw=False) # シグナルの判定 df['hv_Signal'] = np.nan for i in range(1, len(df)): if df['RCI'].iloc[i-1] < -80 and df['RCI'].iloc[i] > df['RCI'].iloc[i-1]: df.at[df.index[i], 'hv_Signal'] = 'Buy' elif df['RCI'].iloc[i-1] > 80 and df['RCI'].iloc[i] < df['RCI'].iloc[i-1]: df.at[df.index[i], 'hv_Signal'] = 'Sell' 次回は予測をしていこうと思います。 ...

2024年7月2日

MRI検査を初見で受けてきたよ

掲題の通り本日初めてMRIを受けてきました~ 受けた経緯 2週間前の6/15(土)に頭がくらくらする 翌日にはましになるが1週間たっても完治せず 先週脳神経内科に行って検査を受け、MRIを勧められる 本日MRI検査を受け、何事もなく帰宅 ということで検査結果は"異状なし"ということでした。 深刻または緊急性があるような病気でないことはよかったです。 ただ、歩くとふらふらすることがあるので少し危ないんですよね… 検査の感想 私が受けたMRIは20分くらい検査にかかるものでした。 MRIを受けるときは金属なし(ベルト、マスクも含む)の服装で受けます。 仰向けになってヘッドホンを付けた上に、体を少し縛った状態で機械の中に勝手に入っていきます。 びっくりしたのはスキャンの音がかなり大きいんですよね。 イメージとして工事の音が近くでするような感じですね。数分刻みで異なる大音量が聞こえてきます。そのうえ、不安になるような音だったりします。 ヘッドホン付けてても結構聞こえるので寝るのも難しいですね。 さらにMRIの中は狭いので閉所恐怖症の人じゃなくても怖さを感じますね。目をつむってればだいぶ気にはならなくなりますが… 料金は7,500円くらいでした。3割負担でこれくらいなので本来は約25,000円ですね。 とりあえず何もなくてよかったですが、まだふらつきがあるので心配です。 もしかしたら精神的な問題もあるかもしれないですね。実は以前も似たようなことがあったのですが、その時は数日で治ったので不安です。 年内に仕事をやめて他にやりたいことがあるので早めに治るといいんですけどね。ではでは。

2024年6月29日