月曜日, 12月 22, 2025
No menu items!
ホーム ブログ ページ 4611

「FP&Aの30年変化と未来展望」

0

FP&Aの進化:過去30年間の変化について

FP&A(財務計画と分析)は、過去30年間にどのように進化してきたのでしょうか。今回の「FP&A Unboxed」では、ホストのテジャス・パリクが特別ゲストのポール・バーンハースト氏と共に、このテーマについて議論を深めました。バーンハースト氏は、FP&Aの専門家集団「The FP&A Guy」の創設者であり、金融モデリングのポッドキャスト『Financial Modeler’s Corner』や『FP&A Tomorrow』のホスト、さらには『Future Finance』の共同ホストです。

FP&Aの本質

優れたFP&A部門は常に戦略的であり、商業的な洞察とオペレーションの調整をうまく組み合わせてきました。しかし今、ビジネス界はFP&Aの重要性を理解し始めています。FP&Aは単なる報告機能ではなく、意思決定における真のパートナーとして認識されつつあります。このシフトは、期待値だけでなく要求も引き上げているのです。

これは、テクノロジーの必然性も高めています。優れたFP&Aを定義するためのテクノロジーではなく、それを実現するための手段としての位置づけが重要です。

技術の進化

データの重要性が増し、テクノロジーの導入が欠かせなくなりました。特に、Excelに依存しない新しいデータ分析ツールの使用が推奨されています。このようなツールを活用することで、財務分析のスキルを向上させることができます。具体的には、Power BIのようなツールが役立ちます。

背景と豆知識

FP&Aは、企業の意思決定において重要な役割を果たします。過去には、財務データの分析に時間がかかり、手動での集計が主流でした。しかし、テクノロジーの進化により、リアルタイムでのデータ分析が可能になり、迅速な意思決定が実現しています。このような変化は、特に競争が激しいビジネス環境において無視できないものです。

参考リンク

FP&Aの進化は、単純な役割の変化に留まらず、企業全体の戦略的アプローチを変革しています。皆さんもこの魅力的なフィールドに目を向けて、自身のスキルを磨いていきましょう。

  • キーワード: 戦略的財務分析 (FP&A)

Power BI をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0

「『スターデューバレー』の喫茶店、テネシーに登場!」

2025年6月23日、アメリカ・テネシー州に、人気ゲーム『スターデューバレー』のメニューを再現した喫茶店がオープンしました。このニュースは、ゲームファンや食に興味がある人々の間で大きな話題を呼んでいます。

『スターデューバレー』は、農業やコミュニティ生活をテーマにしたインディーゲームで、プレイヤーは農場を運営し、町の人々と交流しながら成長していくことが楽しめます。その独特な世界観やキャラクターたちは多くのプレイヤーに魅了されており、喫茶店のオープンは、そうしたファンの期待に応える形となっています。

今回の喫茶店では、ゲーム内に登場する食べ物や飲み物をリアルに再現したメニューが特徴です。例えば、フルーツタルトや野菜のスープなど、プレイヤーが実際に作ってきた料理が楽しめます。店内のデザインもゲームの雰囲気に合わせたものとなっており、まるでゲームの世界に入り込んだような体験ができます。

この喫茶店のオープンには、地域のコミュニティにもポジティブな影響が期待されており、観光名所としても注目を集めています。ファン同士の交流の場となることも予想されており、さらなる盛り上がりが期待されています。

このように、ゲームと現実の境界を越えた新しい試みが、今後どのように広がっていくのか、多くの人が注目しています。ファンにとってはたまらないスポットとなること間違いなしです。

🧠 編集部より:

『スターデューバレー』は、農場経営や冒険を楽しむ人気のインディーゲームです。プレイヤーは、自分の農場を発展させたり、町の人々との交流を深めたりしながら、のんびりしたスローライフを楽しむことができます。このゲームの独特な魅力は、かわいらしいグラフィックやゆったりとした音楽、そして多彩なゲームプレイ要素にあります。

テネシー州の喫茶店について

最近、アメリカ・テネシー州にある喫茶店が、『スターデューバレー』のゲーム内メニューをリアルに再現したカフェとして話題になりました。ここでは、ゲームの中に登場する食事や飲み物が楽しめるだけでなく、店内の雰囲気もゲームを忠実に再現しているとのこと。このような喫茶店は、ファンにとっての聖地のような存在になっています。

豆知識

  • 開発者の背景: 『スターデューバレー』は、個人開発者エリック・バーン氏によって作られました。彼は、ゲーム業界の大手企業で働いた後、独立してこのゲームを開発しました。
  • マルチプレイヤー機能: ゲームにはソロプレイだけでなく、最大4人で楽しむことができるマルチプレイモードもあります。
  • イベント: 季節ごとに行われるイベントや祭りも、ゲームの大きな魅力のひとつです。これらはプレイヤーに新たな体験を提供し、飽きさせない工夫がされています。

関連リンク

このように、『スターデューバレー』の世界をリアルに体験できる場所があるのは、ファンに楽しいひとときを提供してくれますね。テネシー州へ訪れる際には、ぜひチェックしてみてください!

  • 「スターデューバレー」

スターデューバレー をAmazonで探す
喫茶店 をAmazonで探す
ゲームのメニュー をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 1

「東京サバイバル!『リバープロジェクト』体験版配信」

デベロッパーのネストピは、2025年6月23日にサバイバルサスペンスアドベンチャーゲーム『Re:VER PROJECT -TOKYO-(リバープロジェクト・トーキョー)』の体験版をリリースしました。このゲームは、PC(Steam)向けに対応しています。

ゲームの概要

『Re:VER PROJECT -TOKYO-』は、現代の東京を舞台に無実の罪を着せられた主人公が真犯人を探し出すストーリーです。この作品はアニメ制作会社の東映アニメーションと共同で開発されています。

主人公である弥音ユキノリは、アイドルの六実ひなぎと共に逃亡生活を送っています。両者は社会的な異端者として迫害される中で、食料や水を探しながらサバイバルをしていきます。この東京では、一度異端者として扱われると、社会から排除される厳しい現実がありますが、彼らはそこを打破しようと奮闘します。

プレイスタイルと特徴

プレイヤーは弥音ユキノリとなり、東京の街を探索して資源を集め、真犯人を追い詰めていきます。六実ひなぎは有名人であるため、外に出ると危険が伴い、彼女の生死がプレイヤーの手に委ねられています。

ゲーム内では、キャラクターごとにカロリー、水分、健康度といったステータスが存在し、食料や医薬品を探索する必要があります。市場での買い物は不可能なため、ゴミ箱や廃屋を探すことが求められます。衛生状態の悪い食料は一時的にステータスを回復するものの、別のステータスが低下することがあり、リソースの管理が鍵となります。

また、警察の巡回があり、不審な行動をすることでゲームが進行し、逮捕されれば終了となってしまいます。そのため、緻密な計画と判断が必要です。

クラフトとアイテム

拠点の廃墟では、クラフト台が用意されており、街で集めた素材を使ってアイテムを制作できます。たとえば持ち運べるアイテム数を増やす「拡張カバン」や、都民に怪しまれにくくなる「いかついサングラス」なども作成可能です。

体験版は、過去のイベントで出展されたバージョンを基にしており、具体的には六実ひなぎが高熱で倒れ、医療品を集めるミッションを体験できる内容です。

発売予定

『Re:VER PROJECT -TOKYO-』は2025年冬に正式リリースを予定しており、体験版は現在配信中です。興味のある方は、Steamでのダウンロードをお勧めします。

Re:VER PROJECT -TOKYO- イメージ1

Re:VER PROJECT -TOKYO- イメージ2

Re:VER PROJECT -TOKYO- イメージ3

ゲームの詳細や体験版のダウンロードはこちらからご確認ください。

🧠 編集部より:

『Re:VER PROJECT -TOKYO-(リバープロジェクト・トーキョー)』についての補足説明

デベロッパーのネストピが手掛けるこのゲームは、プレイヤーがサバイバルを通じて社会の厳しさやテーマ性を体験できる作品です。主人公の弥音ユキノリとアイドルの六実ひなぎは、無実の罪で追われる立場にあり、リアルな東京を舞台に逃亡を続けます。

ゲームの基本メカニクス

本作では、キャラクターの健康状態や資源管理が重要です。カロリーや水分を意識しながら、制限された環境で探索を行い、物資を確保する必要があります。特に、衛生的にリスクのある食事は、ステータスに影響を与えるため、選択がゲームプレイの鍵になります。

監視社会の描写

東京の街は、NPCがプレイヤーの行動を見ており、注意深く行動しなければならない点が特徴的です。例えば、ゴミ箱を漁っている姿を見られると、警察の注目を浴び、逮捕されるリスクが高まります。この設定は、現代社会の監視社会的な側面を巧みに反映しています。

クラフティングとアイテム管理

プレイヤーは拠点となる廃墟でクラフトを行い、アイテムを作ることができます。この要素がサバイバル感を増し、どのアイテムを優先的に作成するかが、戦略的なプレイを導きます。たとえば、「拡張カバン」を作れば inventory の管理が容易になり、「いかついサングラス」を使えば NPC から目立たずに行動できるようになります。

背景と豆知識

現代の東京を舞台としたゲームは、多くのフィクションで人気。しかし、実際の東京の街は、多様な文化が交差する場所であり、ゲーム内のプレイヤーキャラクターの行動や物語を通じてそのリアリティを感じることができます。また、実際の東京でも「異端者」となることのリスクや社会的な排除のテーマが、深く描かれています。

体験版の配信と今後の展望

現在、体験版が配信中で、プレイヤーは特定のミッションに挑むことができます。ゲームの正式リリースは2025年冬を予定しており、さらなる詳細や新しいコンテンツが期待されています。

Steamでの『Re:VER PROJECT -TOKYO-』のページはこちら

興味のある方は、ぜひ体験版をプレイしてみてください!

  • キーワード: サバイバルサスペンス

Re:VER PROJECT -TOKYO- をAmazonで探す

拡張カバン をAmazonで探す

いかついサングラス をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0

「FF IX 25周年、東京・大阪でポップアップストア!」

本日、2025年6月23日、人気ゲーム『ファイナルファンタジーIX』の特別なポップアップストアがオープンすることが発表されました。このストアでは、Tシャツやクリアファイルなど、ゲームに関連する多彩なグッズが販売されます。

ファイナルファンタジーIX ポップアップストア

このポップアップストアは、限定商品やファン必見のアイテムで賑わうことが予想されています。『ファイナルファンタジーIX』は、1999年に発売されたゲームで、その深いストーリーと魅力的なキャラクターで多くのファンに愛されてきました。この機会にショッピングを楽しみながら、再びこの名作の世界に浸ることができるでしょう。

ストアの詳細情報や商品ラインアップについては、公式サイトをチェックしてください。ファンにとって、このイベントは特別な体験になること間違いありません。

🧠 編集部より:

『ファイナルファンタジーIX』のポップアップストアがオープンするとのことで、ファンにとって嬉しいニュースですね!このストアでは、Tシャツやクリアファイルなどのグッズが販売されます。『ファイナルファンタジーIX』は1999年に発売され、特にそのストーリーやキャラクターの魅力が高く評価されています。グッズの販売は、ゲームの人気の高まりを反映しています。

背景や豆知識

  • キャラクターの魅力: 『ファイナルファンタジーIX』は、ヴィジュアルスタイルやキャラクターのデザインに特に力が入れられており、主人公のジタンや、戦士のガーネットなどが非常に愛されています。
  • リメイクの噂: 最近、リメイクやリマスターの噂もあり、ファンの間で期待が高まっています。
  • 音楽: 作曲家の植松伸夫さんが手掛けた音楽もファンからの支持が厚く、多くの名曲が収められています。

関連リンク

ぜひポップアップストアを訪れて、素敵なグッズを手に入れてはいかがでしょうか!そして、ファイナルファンタジーの世界に浸りながら楽しい時間を過ごしましょう。

  • キーワード: ポップアップストア

ファイナルファンタジーIX グッズ をAmazonで探す

ポップアップストア をAmazonで探す

クリアファイル をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 0

「Dr.STONE×でんきの科学館」コラボ決定!行くしかない!

「Dr.STONE×でんきの科学館」コラボ決定!

本日、2025年6月23日、人気アニメ「Dr.STONE」と中部電力の「でんきの科学館」がコラボすることが発表されました。このコラボイベントでは、石神千空、コハク、あさぎりゲンなどのお馴染みのキャラクターたちが登場します。

コラボの内容

イベントでは、スタンプラリーやクイズに加え、キャラクターたちの展示解説も行われる予定です。また、館内には「ミニPOP UP STORE」が設置され、ここでしか手に入らないコラボ限定グッズも販売されるとのこと。

SNS上では、「スイカちゃんは成長後ビジュ……?」「衣装かわいい」「行きたすぎる」といったファンからの期待の声が多数寄せられています。

開催概要

  • イベント名: Dr.STONE×でんきの科学館コラボイベント
  • 開催期間: 7月29日(火)~8月31日(日)
  • 開催場所: 中部電力でんきの科学館

詳細や最新情報は、公式Xでご確認ください。

🧠 編集部より:

「Dr.STONE×でんきの科学館」

「Dr.STONE×でんきの科学館」コラボ決定!

この度公開されたキービジュアルでは、石神千空・コハク・あさぎりゲンら5名が登場します。『Dr.STONE』は、科学をテーマにした人気の漫画で、主人公たちが石化した世界を他の原始的な技術で再建していく物語です。

コラボイベントではスタンプラリーやクイズのほか、キャラクターたちの展示解説も予定されています。観客はキャラクターたちとのインタラクションを楽しむことができ、学びながらエンターテインメントも体験できる内容です。

さらに館内の「ミニPOP UP STORE」では、コラボ限定グッズの販売も計画されており、多くのファンにとって見逃せない企画となっています。X(旧Twitter)では「スイカちゃんは成長後ビジュ……?」「衣装かわいい」「行きたすぎる」といった声が多く見られ、ファンの熱気が感じられます。

開催概要

イベント名:Dr.STONE×でんきの科学館コラボイベント
開催期間:7月29日(火)~8月31日(日)
開催場所:中部電力でんきの科学館

詳細や続報は公式Xを確認してください。

ちょっとした豆知識として、でんきの科学館は、電気やエネルギーに関する教育を目的とした場所であり、体験型の展示が特徴です。科学に興味を持つきっかけになるような楽しいイベントがたくさん用意されています。

関係するページへのリンクとしては、公式ウェブサイトや、イベント情報が掲載されているページもぜひチェックしてみてください。

  • キーワード: コラボイベント

Dr.STONE をAmazonで探す

でんきの科学館 をAmazonで探す

コラボ限定グッズ をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 1

「半導体技術輸出権取り消し検討」

記事概要:半導体製造技術の輸出権取り消しの検討

発表日:2025年06月23日 15時30分

アメリカ商務省が、韓国のSamsungSK Hynix、台湾のTSMCが中国で使用する半導体製造技術の輸出権の取り消しを検討していることが報じられました。この措置は、アメリカの重要な技術が中国に流出することを防ぐためのものであり、トランプ政権からの継承の一環とされています。

半導体製造技術の輸出権取り消しの検討

現状の背景

Samsung、SK Hynix、TSMCは、アメリカの半導体製造用機械や技術を中国の工場に輸出するために、包括的な免除措置を享受しています。この免除により、各企業はライセンス申請を行う必要がなくなっていました。しかし、商務省の輸出管理部門責任者であるジェフリー・ケスラー氏は、免除を取り消す意向を示しています。

商務省は「新たな取り締まり制度は、アメリカが平等かつ相互のプロセスを保証するもの」と説明しています。これに対し、業界関係者は、取り消しが直ちに工場の閉鎖を招くことはないものの、効率運営に影響を及ぼす可能性があると指摘しています。

米国の半導体規制の影響を示す図

政府の立場と懸念

ただし、この取り消しの検討はまだ初期段階であり、国防総省を含む他の省庁は懸念を示しています。反対意見では、「この措置が中国企業を支援し、工場を中国が支配するリスクがある」との声が上がっています。

最近の例として、NVIDIAAMDが中国向け製品に新たなライセンス要件が課せられることになり、それに伴う追加経費が株価に影響を及ぼしています。

まとめ

半導体技術の輸出管理は、国際的な技術競争において重要なテーマとなっています。アメリカがこの技術の流出を防ぐためどのような措置を取るのか、そしてその影響がどのように業界に波及するのか、今後の動きに注目が集まります。

🧠 編集部より:

この記事の補足説明と背景

この記事は、アメリカがSamsung、SK Hynix、TSMCなどの半導体メーカーに対し、中国への半導体製造技術の輸出権を取り消す検討をしていることを報じています。この動きは、米中間の技術競争や安全保障上の懸念から発生しており、特にアメリカが中国に対する技術移転を厳しく制限しようとしている一環です。

背景情報

  • アメリカの輸出管理: トランプ政権時代から続く中国への技術輸出規制は、先端テクノロジーが軍事利用される恐れから来ています。最近ではNVIDIAやAMDが新たなライセンス要件に直面していることでも、アメリカのスタンスが表れています。
  • 半導体業界の影響: 半導体製造は巨大な市場であり、技術者や投資が集まるため、規制は事業運営に直接影響を及ぼします。業界では、効率的な製造が難しくなる可能性や、他の国の技術に依存する動きが強まると考えられています。

豆知識

  • 半導体産業の地図: 2020年代に入って、半導体の重要性はさらに増しており、多くの国が自国の半導体供給を強化しようとしています。例えば、アメリカが中国の企業に対抗する形で、自国の半導体生産を増やすための法案を策定しています。

関連するページ

これらの情報を元に、半導体業界の動向や米中関係の変化に注目することが重要です。


  • キーワード: 半導体

半導体製造技術 をAmazonで探す NVIDIA AIチップ をAmazonで探す AMD AIチップ をAmazonで探す

※以下、出典元 ▶ 元記事を読む

Views: 0

モバイルでプレイできる10の最高のコンソールとPCゲーム



専用のホームコンソールと PCゲーム ゲームは、画面上に数ピクセルを移動することから長い道のりを歩んできました。これで、幻想的な新しい世界、信じられないほどの物語、そしてほぼフォトリズムの高解像度で素晴らしい場所を体験できるようになりました。現在、コンソールは、たとえそれが彼らのリビングルームを離れることを意味していても、ゲーマーがどこにいても行くことに向けて動きを進んでいます。


続きを見る


🧠 編集部の感想:
モバイルでプレイできるコンソールやPCゲームの進化には驚かされます。技術の発展で、高画質な体験がいつでもどこでも可能になったのは素晴らしいです。これにより、ゲーマーの楽しみ方が広がり、アクセスのしやすさが一層増しています。

Views: 0

「Amazon Music、ファミリープラン2カ月無料!最大6人で楽しめる」

Amazon Music Unlimited、ファミリープラン2か月無料キャンペーンを実施

2025年6月23日、Amazonは、サブスクリプション型音楽配信サービス「Amazon Music Unlimited」において、最大6人まで音楽が聴き放題になる「ファミリープラン」へのアップグレードが2か月間無料となるキャンペーンを発表しました。このキャンペーンは7月15日(火)までの期間限定で提供されています。

キャンペーンの詳細

「ファミリープラン」は、家族や友人と一緒に音楽を楽しむことができる非常に便利なプランです。最大6人まで参加可能で、それぞれが独自のアカウントで音楽を楽しむことができます。通常の個人プランに比べて、大人数での利用ができるため、コストパフォーマンスが良好です。

なぜファミリープランが注目されるのか

音楽配信サービスが増える中、ファミリープランは家族単位や小グループでの利用に最適です。特に、異なる音楽の好みを持つメンバーがいる場合でも、それぞれが自分のプレイリストを楽しむことができるため、サービスの利用満足度が高まります。

このキャンペーンは、音楽を愛する方々にとって魅力的な機会となるでしょう。家族や友人と一緒に、さまざまなジャンルの音楽を楽しみながら、特別な体験を共有するチャンスです。この機会をお見逃しなく、ぜひご利用ください。

🧠 編集部より:

Amazonの「Amazon Music Unlimited」では、サブスクリプション型の音楽配信サービスが提供されています。このサービスには、個人プランに加えて「ファミリープラン」があり、最大6人まで同時に音楽を楽しめます。ファミリープランへのアップグレードが2か月間無料になるキャンペーンが、2023年7月15日(火)まで実施中です。

背景と豆知識

Amazon Music Unlimitedは、数百万曲の音楽、プレイリスト、ラジオステーションにアクセスでき、オフライン再生も可能です。ファミリープランは、家族全員で音楽を楽しみたい人にとってお得なプランです。

サブスクリプション型サービスは近年急成長しており、SpotifyやApple Musicなどと競争しています。実際、マルチユーザーのプランは特に人気が高く、個人料金よりもお得に感じる家庭が増えています。

参考リンク

この機会に家族みんなで音楽を楽しんでみてはいかがでしょうか!

  • キーワード: ファミリープラン

Amazon Music Unlimited をAmazonで探す
ファミリープラン をAmazonで探す
サブスクリプション型音楽配信サービス をAmazonで探す



※以下、出典元
▶ 元記事を読む

Views: 1

Python×株式投資:従来の100倍!銘柄選抜のバックテストを高速化した話 #初心者 – Qiita



Python×株式投資:従来の100倍!銘柄選抜のバックテストを高速化した話 #初心者 - Qiita

# -----------------------------
# 2nd screening V3
# -----------------------------
import time 

global_start_time = time.time()

from google.colab import drive
drive.mount('/content/drive')

import pandas as pd
import numpy as np
import os
from tqdm.notebook import tqdm 
import yfinance as yf
from curl_cffi import requests
session = requests.Session(impersonate="safari15_5")

# --------------------------------------------------
# ヘルパー関数定義セクション 
# --------------------------------------------------

def calculate_market_sentiment_score(ticker_symbol: str, start_date: str, end_date: str, session) -> pd.DataFrame:
    """
    指定されたティッカーシンボル(TOPIX連動ETFなど)のデータに基づき、地合いスコアを計算する。
    """
    print(f"🌀 地合いスコア計算のため、{ticker_symbol} のデータをダウンロード中...")
    start_str = pd.Timestamp(start_date).strftime('%Y-%m-%d')
    end_str = pd.Timestamp(end_date).strftime('%Y-%m-%d')
    market_data = yf.download(ticker_symbol, start=start_str, end=end_str, interval="1d", session=session)

    if market_data.empty:
        print(f"⚠️ {ticker_symbol} のデータが見つかりません。地合いスコア計算をスキップします。")
        return pd.DataFrame()

    if isinstance(market_data.columns, pd.MultiIndex):
        market_data.columns = market_data.columns.get_level_values(0)

    market_data["LogReturn"] = np.log(market_data["Close"] / market_data["Close"].shift(1))
    market_data["MA25"] = market_data["Close"].rolling(25).mean()
    market_data["MA25_diff"] = (market_data["Close"] - market_data["MA25"]) / market_data["MA25"]

    delta = market_data["Close"].diff()
    gain = np.where(delta > 0, delta, 0)
    loss = np.where(delta  0, -delta, 0)
    avg_gain = pd.Series(gain, index=market_data.index).rolling(14).mean()
    avg_loss = pd.Series(loss, index=market_data.index).rolling(14).mean()
    rs = avg_gain / (avg_loss + 1e-10)
    market_data["RSI_14"] = 100 - (100 / (1 + rs))

    market_data["score_today"] = 0
    market_data["score_today"] += (market_data["LogReturn"].rolling(5).sum() > 0.01).astype(int)
    market_data["score_today"] += (market_data["MA25_diff"] > 0).astype(int)
    market_data["score_today"] += (market_data["RSI_14"] > 55).astype(int)
    market_data["score_today"] -= (market_data["RSI_14"]  45).astype(int)
    market_data["score_today"] -= (market_data["LogReturn"].rolling(5).sum()  -0.01).astype(int)
    market_data["score_today"] -= (market_data["MA25_diff"]  0).astype(int)

    market_data["score_mean"] = market_data["score_today"].rolling(10).mean()
    market_data["score_std"] = market_data["score_today"].rolling(10).std()
    market_data["score_trend"] = market_data["score_today"].diff().rolling(10).mean()

    ema12 = market_data["Close"].ewm(span=12, adjust=False).mean()
    ema26 = market_data["Close"].ewm(span=26, adjust=False).mean()
    market_data["MACD"] = ema12 - ema26
    market_data["Signal"] = market_data["MACD"].ewm(span=9, adjust=False).mean()
    market_data["MACD_Hist"] = market_data["MACD"] - market_data["Signal"]

    market_data.index.name = 'Date'
    market_df = market_data.dropna().copy()
    print(f"✅ 地合いスコア計算完了 ({ticker_symbol})。")
    return market_df

def calculate_technical_indicators(df_group):
    """
    個別銘柄のデータフレームを受け取り、テクニカル指標を計算して返す。
    """
    if df_group.empty or len(df_group)  75:
        return df_group

    df_group["MA_5"] = df_group["Close"].rolling(window=5).mean()
    df_group["MA_25"] = df_group["Close"].rolling(window=25).mean()
    df_group["MA_75"] = df_group["Close"].rolling(window=75).mean()

    delta = df_group["Close"].diff()
    gain = np.where(delta > 0, delta, 0)
    loss = np.where(delta  0, -delta, 0)
    avg_gain = pd.Series(gain, index=df_group.index).rolling(14).mean()
    avg_loss = pd.Series(loss, index=df_group.index).rolling(14).mean()
    rs = avg_gain / (avg_loss + 1e-10)
    df_group["RSI"] = 100 - (100 / (1 + rs))

    df_group["MA_5_slope"] = df_group["MA_5"].diff(5) / 5

    return df_group

# --------------------------------------------------
# 設定・定義セクション 
# --------------------------------------------------

# --- パス設定 ---
input_base_dir = "/content/drive/MyDrive/stock_prediction/ver.1/results/Qiita/1st/J-Quants/Prime/selected_ajt_type2"
output_base_dir = "/content/drive/MyDrive/stock_prediction/ver.1/results/Qiita/2nd/Speed _test/mydataset/morerapid"
os.makedirs(output_base_dir, exist_ok=True)

# --- データソース設定 ---
PARQUET_PATH_FOR_PREDICTION = "/content/drive/MyDrive/stock_prediction/ver.1/Database/OHLCV/プライム/total_with_date/batch_size/ticker_combined_append_batch_PER.parquet"
MARKET_INDEX_TICKER = '1306.T'  # 地合い計算に使うTOPIX連動ETFなど

# --- 日付リスト ---
date_list = [
    '2022-01-13', '2022-01-24', '2022-01-28', '2022-02-01', '2022-04-20',
    '2022-05-17', '2022-05-27', '2022-06-21', '2022-07-21', '2022-09-05',
    '2022-09-09', '2022-11-28', '2022-12-01', '2022-12-21', '2023-02-17',
    '2023-03-28', '2023-04-24', '2023-07-14', '2023-08-04', '2023-09-21',
    '2023-10-05', '2023-11-09', '2023-11-29', '2023-12-04', '2023-12-21',
    '2023-12-22', '2024-03-05', '2024-03-13', '2024-03-26', '2024-04-11',
    '2024-06-06', '2024-06-07', '2024-07-22', '2024-07-26', '2024-09-12'
    
]

# --- スクリーニング条件定義 ---
screening_conditions = [
    {"name": "pattern1", "rsi_range": (25, 50), "ma_eps": 0.02, "slope_period": 5, "slope_thresh": 0.04},
    {"name": "pattern2", "rsi_range": (25, 50), "ma_eps": 0.04, "slope_period": 5, "slope_thresh": 0.04},
    {"name": "pattern3", "rsi_range": (25, 50), "ma_eps": 0.06, "slope_period": 5, "slope_thresh": 0.04},
    {"name": "pattern4", "rsi_range": (25, 50), "ma_eps": 0.08, "slope_period": 5, "slope_thresh": 0.04},

    {"name": "pattern5", "rsi_range": (30, 60), "ma_eps": 0.02, "slope_period": 5, "slope_thresh": 0.04},
    {"name": "pattern6", "rsi_range": (30, 60), "ma_eps": 0.04, "slope_period": 5, "slope_thresh": 0.04},
    {"name": "pattern7", "rsi_range": (30, 60), "ma_eps": 0.06, "slope_period": 5, "slope_thresh": 0.04},
    {"name": "pattern8", "rsi_range": (30, 60), "ma_eps": 0.08, "slope_period": 5, "slope_thresh": 0.04}
]


# ------------------------------------------------------------------------------
# メイン処理 
# ------------------------------------------------------------------------------

# -----------------------------
# 1. データ準備(一括読み込みと事前計算)
# -----------------------------
print("\n--- 全データセットの読み込みとテクニカル指標の事前計算を開始します ---")
global_data_load_start_time = time.time()

# 分析期間を決定
earliest_screening_date = pd.Timestamp(date_list[0])
latest_screening_date = pd.Timestamp(date_list[-1])
max_lookback_days = 250
max_lookahead_days = 90
global_data_start_date = earliest_screening_date - pd.Timedelta(days=max_lookback_days)
global_data_end_date = latest_screening_date + pd.Timedelta(days=max_lookahead_days)
print(f"分析対象期間: {global_data_start_date.strftime('%Y-%m-%d')} から {global_data_end_date.strftime('%Y-%m-%d')}")

# 地合いスコアを動的に計算
try:
    df_market_sentiment = calculate_market_sentiment_score(
        ticker_symbol=MARKET_INDEX_TICKER,
        start_date=global_data_start_date,
        end_date=global_data_end_date,
        session=session
    )
    sentiment_cols = ['score_today', 'score_mean', 'score_std', 'score_trend']
    df_market_sentiment_to_merge = df_market_sentiment[sentiment_cols].copy()
except Exception as e:
    print(f"致命的エラー: 地合いスコアの計算に失敗しました: {e}")
    df_market_sentiment = pd.DataFrame() # ループ内で参照するため空で定義
    df_market_sentiment_to_merge = pd.DataFrame(columns=['score_today', 'score_mean', 'score_std', 'score_trend'])

# ParquetファイルからOHLCVデータを読み込む
try:
    df_all_data = pd.read_parquet(
        PARQUET_PATH_FOR_PREDICTION,
        columns=['Date', 'Ticker', 'Open', 'High', 'Low', 'Close', 'Volume'],
        filters=[('Date', '>=', pd.Timestamp(global_data_start_date)), ('Date', '', pd.Timestamp(global_data_end_date))]
    )
    df_all_data["Date"] = pd.to_datetime(df_all_data["Date"])
    df_all_data["Ticker"] = df_all_data["Ticker"].str.replace(".T", "", regex=False)
except Exception as e:
    print(f"致命的エラー: 全データセットの読み込みに失敗しました: {e}")
    exit()

# 銘柄データに地合いスコアを日付キーでマージ
if not df_market_sentiment_to_merge.empty:
    print("🌀 銘柄データに地合いスコアを結合中...")
    df_all_data_processed = pd.merge(df_all_data, df_market_sentiment_to_merge.reset_index(), on='Date', how='left')
    df_all_data_processed = df_all_data_processed.set_index(["Date", "Ticker"]).sort_index()
else:
    print("⚠️ 地合いスコアが利用できないため、スコア関連の列はNaNになります。")
    df_all_data_processed = df_all_data.set_index(["Date", "Ticker"]).sort_index()
    for col in ['score_today', 'score_mean', 'score_std', 'score_trend']:
        df_all_data_processed[col] = np.nan

# 全銘柄のテクニカル指標を計算 (★ここで、冒頭で定義した関数を呼び出す)
print("🌀 全銘柄のテクニカル指標を計算中...")
tickers_to_process = df_all_data_processed.index.get_level_values('Ticker').unique()
processed_data_parts = []
for ticker_val in tqdm(tickers_to_process, desc="↳ 各銘柄のテクニカル指標計算"):
    ticker_df_part = df_all_data_processed.loc[(slice(None), ticker_val), :].reset_index(level='Ticker', drop=True).copy()
    processed_df_part = calculate_technical_indicators(ticker_df_part)
    processed_df_part['Ticker'] = ticker_val
    processed_df_part = processed_df_part.set_index('Ticker', append=True).swaplevel(0,1)
    processed_data_parts.append(processed_df_part)

df_all_data_processed = pd.concat(processed_data_parts).sort_index()

global_data_load_end_time = time.time()
print(f"✅ 全データセットの読み込みとテクニカル指標の事前計算が完了しました。所要時間: {global_data_load_end_time - global_data_load_start_time:.2f}")


# -----------------------------
# 2. 日付ごとのバックテスト実行
# -----------------------------
for today_str in tqdm(date_list, desc="全体進捗 (日付別)"):
    today_process_start_time = time.time()
    today = pd.Timestamp(today_str)

    # 1stスクリーニング結果を読む
    input_csv_path = os.path.join(input_base_dir, f'1st_filtered_{today_str}.csv')
    try:
        df_list = pd.read_csv(input_csv_path)
    except FileNotFoundError:
        print(f"エラー: 1stスクリーニング結果ファイルが見つかりません: {input_csv_path}")
        continue

    # 出力先を作成
    output_dir = os.path.join(output_base_dir, f'2nd_16pts_slope5_{today_str}')
    os.makedirs(output_dir, exist_ok=True)

    # 地合いスコアの取得
    score_today_val, score_mean, score_std, score_trend = np.nan, np.nan, np.nan, np.nan
    try:
        if not df_market_sentiment.empty:
            if today in df_market_sentiment.index:
                score_row = df_market_sentiment.loc[today]
            else:
                temp_idx = df_market_sentiment.index.get_indexer([today], method="nearest")[0]
                temp_date = df_market_sentiment.index[temp_idx]
                score_date = temp_date if temp_date  today else (df_market_sentiment.index[temp_idx - 1] if temp_idx > 0 else None)
                score_row = df_market_sentiment.loc[score_date] if score_date else None

            if score_row is not None:
                score_today_val, score_mean, score_std, score_trend = score_row['score_today'], score_row['score_mean'], score_row['score_std'], score_row['score_trend']
    except Exception as e:
        print(f"地合いスコア取得中にエラー: {e}")

    # 条件別比較&バックテスト
    summary = []
    for cond in tqdm(screening_conditions, desc=f"  ↳ 日付 {today_str} のパターン処理", leave=False):
        result = []
        for _, row in df_list.iterrows():
            ticker = str(row["LocalCode"])[0:4]
            try:
                df = df_all_data_processed.loc[(ticker,slice(None)), :].reset_index(level='Ticker', drop=True).copy()
                if df.empty: continue

                screening_date = today
                if screening_date not in df.index:
                    temp_idx = df.index.get_indexer([screening_date], method="nearest")[0]
                    temp_date = df.index[temp_idx]
                    screening_date = temp_date if temp_date  screening_date else (df.index[temp_idx - 1] if temp_idx > 0 else None)
                if not screening_date: continue

                last_row = df.loc[screening_date]
                ma5_last, ma25_last, ma75_last = last_row["MA_5"], last_row["MA_25"], last_row["MA_75"]
                slope_last, rsi_last, close_last = last_row["MA_5_slope"], last_row["RSI"], last_row["Close"]

                epsilon = close_last * cond["ma_eps"]
                trend_flag = (abs(ma5_last - ma25_last)  epsilon and abs(ma25_last - ma75_last)  epsilon and slope_last > cond["slope_thresh"])
                rsi_flag = (cond["rsi_range"][0]  rsi_last  cond["rsi_range"][1])

                if trend_flag and rsi_flag:
                    df_trading_days = df.dropna(subset=['Close'])
                    if screening_date not in df_trading_days.index: continue
                    screening_idx_pos = df_trading_days.index.get_loc(screening_date)
                    returns = {}
                    for days in [14, 30, 60, 90]:
                        future_idx_pos = screening_idx_pos + days
                        returns[f"Return({days}d)%"] = ((df_trading_days["Close"].iloc[future_idx_pos] - close_last) / close_last * 100) if future_idx_pos  len(df_trading_days) else np.nan
                    result.append({"Ticker": ticker, "Name": row.get("Name", "NoName"), **returns})
            except (KeyError, IndexError, TypeError):
                continue

        df_result = pd.DataFrame(result)
        df_result.to_csv(f"{output_dir}/result_{cond['name']}_{today_str}.csv", index=False)

        # summary への追加
        mean_return14, win_rate14 = (df_result["Return(14d)%"].mean(), (df_result["Return(14d)%"] > 0).mean() * 100) if not df_result.empty else (np.nan, np.nan)
        mean_return30, win_rate30 = (df_result["Return(30d)%"].mean(), (df_result["Return(30d)%"] > 0).mean() * 100) if not df_result.empty else (np.nan, np.nan)
        mean_return60, win_rate60 = (df_result["Return(60d)%"].mean(), (df_result["Return(60d)%"] > 0).mean() * 100) if not df_result.empty else (np.nan, np.nan)
        mean_return90, win_rate90 = (df_result["Return(90d)%"].mean(), (df_result["Return(90d)%"] > 0).mean() * 100) if not df_result.empty else (np.nan, np.nan)

        summary.append({
            "Pattern": cond["name"], "銘柄数": len(df_result),
            "平均リターン(2週間)%": round(mean_return14, 2), "勝率(2週間後にプラス)%": round(win_rate14, 2),
            "平均リターン(30日)%": round(mean_return30, 2), "勝率(30日後にプラス)%": round(win_rate30, 2),
            "平均リターン(60日)%": round(mean_return60, 2), "勝率(60日後にプラス)%": round(win_rate60, 2),
            "平均リターン(90日)%": round(mean_return90, 2), "勝率(90日後にプラス)%": round(win_rate90, 2),
            "地合いスコア(当日)": int(score_today_val) if pd.notna(score_today_val) else np.nan,
            "地合いスコア平均": round(score_mean, 2), "地合いスコア標準偏差": round(score_std, 2), "地合いスコア傾向": round(score_trend, 3)
        })

    # summaryの保存
    df_summary = pd.DataFrame(summary)
    today_process_end_time = time.time()
    elapsed_time_today = today_process_end_time - today_process_start_time
    df_summary["この日の処理時間(秒)"] = elapsed_time_today
    df_summary.to_csv(f"{output_dir}/summary_16pts_slope5_{today_str}.csv", index=False)


global_end_time = time.time()
total_elapsed_time = global_end_time - global_start_time
print(f"\n全日付 完了!! 合計処理時間: {total_elapsed_time:.2f}")





Source link

Views: 2

Claude Code 逆引きコマンド事典


https://dev.classmethod.jp/articles/get-started-claude-code-1/

https://dev.classmethod.jp/articles/get-started-claude-code-2nd/

それでは以下にコマンド集をまとめていきます。

https://zenn.dev/y_megane/articles/20250601-install-claudecode-extension

/permissionsの設定をしてもコマンドの提案はしてくる。Claudeが実行しようとした時にブロックされるので、その結果を見て別の行動をとってくれる。

https://x.com/commte/status/1936313902645887036

※1: 公式ドキュメントにはClaude Codeウィンドウにドラッグアンドドロップでも出来ると書いてあるが、CursorやVS Codeだと画像が表示されちゃうことが多い気がするので僕はあまり使ってない。

※2: Claude Code関係ないがMacだと画面スクショは以下のコマンド
Cmd+Shift+Ctrl+4: 範囲を指定してクリップボードにスクショ
Cmd+Shift+Ctrl+3: 画面全体を (以下同文)

冒頭で紹介したClassmethodさんの記事に詳しいですが、本記事でも少しだけ触れておきます。)

  • .mcp.json を設定しましょう。以下はPlaywright MCPを設定する例です。(.mcp.jsonを設定する以外にも色々方法はあります / 公式やクラメソさん記事を見てね)
{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": [
        "@playwright/mcp@latest"
      ]
    }
  }
}
  • .mcp.json が設定されているプロジェクトで Claude Code を起動すると、MCPを実行していいかどうかを聞かれます。

  • Tool useの確認が出てくればうまくMCPを使えている証拠です

  • 言うまでもないが思考の深さと待ち時間にはトレードオフがある
    • “think”から段階的に試すことが推奨されている
    • が、実務的には「あー、こりゃ全然ダメだわ」と思った段階で “ultrathink” を指示するので良いと思う。
    1. Claude Code: Best practices for agentic coding
    2. Mastering Claude Code in 30 minutes
    3. Set up Claude Code
    4. Claude: CLI reference
    5. Claude: Interactive mode
    6. Claude: Common workflows
    7. Claude: Manage Claude’s memory
    8. Claude: Settings
    9. Claude: Model Context Protocol (MCP)
    10. Claude Code完全攻略Wiki



    Source link

    Views: 0