メモ

週足

# ここでループの開始点と終了点を指定(例えば、最初の5つのファイル)
start_index = 0
end_index = 10
# フォルダ内すべてを行う場合、これを有効かする
end_index = len(csv_files)
# 全ての結果を格納するためのデータフレーム
final_Data = pd.DataFrame()

# ファイル処理ループ
# ファイル処理ループ
for i, filename in enumerate(csv_files[start_index:end_index], start=start_index):
    file_path = os.path.join(stock_file_path, filename)
    print(f"{i}: {filename}")
    
    # データの読み込み
    try:
        base_data = pd.read_csv(file_path, encoding='cp932')
    except UnicodeDecodeError:
        base_data = pd.read_csv(file_path, encoding='utf-8')
    
    # データの読み込み
    base_data['日付'] = pd.to_datetime(base_data['日付'], format='%Y/%m/%d')
    base_data = base_data.sort_values('日付', ascending=True)
    
    for column in ['始値', '高値', '安値', '終値', '出来高']:
        base_data[column] = base_data[column].astype(str).str.replace(',', '').replace('--', np.nan).astype(float)
    
    columns_order = ['日付', '始値', '高値', '安値', '終値', '出来高']
    base_data = base_data[columns_order]


    # 日付をdatetime形式に変換
    base_data['日付'] = pd.to_datetime(base_data['日付'], format='%Y/%m/%d')

    # 日付でソート
    base_data = base_data.sort_values(by='日付').reset_index(drop=True)

    # 曜日を数値で表すカラムを追加 (0: 月曜日, 1: 火曜日, ..., 4: 金曜日)
    base_data['曜日'] = base_data['日付'].dt.weekday

    # 日付差分を計算
    base_data['日付差分'] = base_data['日付'].diff().dt.days.fillna(0)

    # 新しいグループを作成(5日以上離れていたら新しいグループ)
    base_data['グループ'] = ((base_data['曜日'] == 0) | (base_data['日付差分'] >= 5)).cumsum()

    # W_始値を計算(各グループの日付フラグが最も小さい日の始値)
    base_data['W_始値'] = base_data.groupby('グループ')['始値'].transform('first')

    # W_終値を計算(各日の終値)
    base_data['W_終値'] = base_data['終値']

    # W_高値とW_安値を計算(グループ内での累積の最高値と最安値)
    base_data['W_高値'] = base_data.groupby('グループ')['高値'].transform(lambda x: x.cummax())
    base_data['W_安値'] = base_data.groupby('グループ')['安値'].transform(lambda x: x.cummin())


    # 週次データを取得
    weekly_data = base_data.groupby('グループ').agg({
        '日付': 'last',
        'W_始値': 'first',
        'W_高値': 'max',
        'W_安値': 'min',
        'W_終値': 'last',
        '出来高': 'sum'
    }).reset_index(drop=True)

    weekly_data.columns = ['日付', '始値', '高値', '安値', '終値', '出来高']
    
    code=filename.replace(".csv","")
    weekly_data['コード'] = code


FXDL

# 必要なライブラリをインポートします
import pandas as pd
import yfinance as yf
import os
from datetime import datetime

# フォルダのパスを定義します
folder_path = 'FXファイル'
os.makedirs(folder_path, exist_ok=True)

# 通貨ペアのリストを定義します
currencies = ['USD', 'JPY', 'EUR', 'GBP', 'CHF', 'CAD', 'AUD', 'NZD']

# 今日の日付を取得します
end_date = datetime.today().strftime('%Y-%m-%d')

# 通貨ペアを生成し、データをダウンロードして保存する関数を定義します
def download_and_save_data():
    for base_currency in currencies:
        for quote_currency in currencies:
            if base_currency != quote_currency:
                pair = f"{base_currency}{quote_currency}=X"
                data = yf.download(pair, start='2020-01-01', end=end_date)

                if not data.empty:
                    # 前日比を計算します
                    data['Close_pct_change'] = data['Close'].pct_change() * 100
                    data['Close_pct_change'] = data['Close_pct_change'].apply(lambda x: int(x * 100) / 100 if pd.notnull(x) else x)

                    file_name = f"{base_currency}{quote_currency}_2023_07_06.csv"
                    file_path = os.path.join(folder_path, file_name)
                    data.to_csv(file_path, encoding='cp932')
                    print(f"Data for {pair} saved to {file_path}")

# データをダウンロードして保存します
download_and_save_data()

FX強弱

# 必要なライブラリをインポートします。
import pandas as pd
import os
import numpy as np

# FXファイルが保存されているフォルダのパス
folder_path = 'FXファイル'

# JPYを含むファイル名を抽出します。
jpy_files = [f for f in os.listdir(folder_path) if f[3:6].upper() == 'JPY']

# 各ファイルの前日比(変動率)を計算します。
changes = {}

for file in jpy_files:
    file_path = os.path.join(folder_path, file)
    df = pd.read_csv(file_path, encoding='cp932')
    
    # 終値(Close)を取得し、前日比(変動率)を計算します。
    df['変動率'] = df['Close'].pct_change() * 100
    
    # 通貨ペア名をキーとして変動率を保存します。
    currency_pair = file[:6]
    changes[currency_pair] = df['変動率'].dropna().tolist()

# 強弱を計算する関数を定義します。
def calculate_strength(changes):
    strength = {currency: np.mean(change) for currency, change in changes.items()}
    sorted_strength = sorted(strength.items(), key=lambda x: x[1], reverse=True)
    return sorted_strength

# 各通貨ペアの強弱を計算します。
currency_strength = calculate_strength(changes)

# 結果を表示します。
for currency, strength in currency_strength:
    print(f'{currency}: {strength:.2f}%')

# 結果を保存するためにCSVファイルに出力します。
result_df = pd.DataFrame(currency_strength, columns=['Currency Pair', 'Strength'])
result_df.to_csv('currency_strength_2024_07_06.csv', index=False, encoding='cp932')

●日経一泊二日トレード

import pandas as pd
import numpy as np
import os
import math
from math import isinf
from math import floor
import pandas as pd
import numpy as np
import math

### コード1

file_path = "K_nky_jpy (1).csv"
base_data = pd.read_csv(file_path, encoding='cp932')

# 数値データのカラムをfloat型に変換
for column in ['始値', '高値', '安値', '終値']:
    base_data[column] = base_data[column].astype(str).str.replace(',', '').astype(float)

# 4日平均の変動率を計算
base_data['高-始(%)'] = (base_data['高値'] - base_data['始値']) / base_data['始値'] * 100
base_data['始-安(%)'] = (base_data['始値'] - base_data['安値']) / base_data['始値'] * 100

# 20日の平均を計算
base_data['20MA_高-始(%)'] = base_data['高-始(%)'].rolling(window=20).mean()
base_data['20MA_始-安(%)'] = base_data['始-安(%)'].rolling(window=20).mean()

# 翌日の高値と安値をカラムに追加
base_data['翌日_高値'] = base_data['高値'].shift(-1)
base_data['翌日_安値'] = base_data['安値'].shift(-1)
base_data['翌日_終値'] = base_data['終値'].shift(-1)

# 翌日の変動率を計算
base_data['翌日_高-始(%)'] = (base_data['翌日_高値'] - base_data['始値']) / base_data['始値'] * 100
base_data['翌日_始-安(%)'] = (base_data['始値'] - base_data['翌日_安値']) / base_data['始値'] * 100

# 翌日の20日平均の変動率を計算
base_data['翌日_20MA_高-始(%)'] = base_data['翌日_高-始(%)'].rolling(window=20).mean()
base_data['翌日_20MA_始-安(%)'] = base_data['翌日_始-安(%)'].rolling(window=20).mean()

# 翌日の高値と安値の差を計算 (%)
base_data['翌日_高-安(%)'] = (base_data['翌日_高値'] - base_data['翌日_安値']) / base_data['始値'] * 100

# 翌日の高値と安値の差の20日移動平均を計算
base_data['20MA_翌日_高-安(%)'] = base_data['翌日_高-安(%)'].rolling(window=20).mean()

# 期間内最安値の計算(安値と翌営業日の安値の低い方)
base_data['期間内最安値'] = base_data[['安値', '翌日_安値']].min(axis=1)

# 全ての数値型のカラムに小数点第3位以下を切り捨てる関数の適用
for col in base_data.columns:
    if np.issubdtype(base_data[col].dtype, np.number):
        # Replace infinities with NaN
        base_data[col].replace([np.inf, -np.inf], np.nan, inplace=True)
        # Apply the rounding
        base_data[col] = base_data[col].apply(lambda x: math.floor(x * 1000) / 1000 if not pd.isna(x) else x)

# すべてが2以上のものだけを抽出
filtered_data = base_data[
    (base_data['翌日_20MA_高-始(%)'] >= 2) &
    (base_data['翌日_20MA_始-安(%)'] >= 2) &
    (base_data['20MA_翌日_高-安(%)'] >= 2)
].copy()

### コード2
# 購入価格、売却価格、ロスカットラインの計算式に必要なパラメータの設定
BuyRate = 0.01  # 日経でざっくり資産
SaleRate = 0.03
Loscut = 0.1 

# 購入実績のデータフレームを作成
purchase_data = base_data.copy()

# 購入価格の計算
purchase_data.loc[:, '購入価格'] = purchase_data['始値'] * (1 - purchase_data['20MA_始-安(%)'] / 100) * (1 - BuyRate)

# 売却価格の計算
purchase_data.loc[:, '売却価格'] = purchase_data['始値'] * (1 + purchase_data['20MA_翌日_高-安(%)'] / 100) * (1 + SaleRate)

# ロスカットラインの計算
purchase_data.loc[:, 'ロスカットライン'] = purchase_data['購入価格'] * (1 - Loscut)

# 購入フラグの設定(翌週高値が購入価格より上の場合に設定)
purchase_data.loc[:, '購入フラグ'] = np.where(purchase_data['購入価格'] > purchase_data['期間内最安値'], '●', '')

# 損切りフラグの設定
purchase_data.loc[:, 'ロスカットフラグ'] = np.where(purchase_data['安値'] < purchase_data['ロスカットライン'], 1, 0)

# 売却フラグの設定
purchase_data.loc[:, '売却フラグ'] = np.where(purchase_data['翌日_高値'] > purchase_data['売却価格'], 1, 0)

# 最終売却価格の計算
purchase_data.loc[:, '最終売却価格'] = np.where(
    purchase_data['ロスカットフラグ'] == 1, purchase_data['ロスカットライン'],
    np.where(purchase_data['売却フラグ'] == 1, purchase_data['売却価格'], purchase_data['翌日_終値'])
)

# 利益率の計算
purchase_data.loc[:, '利益率'] = (purchase_data['最終売却価格'] - purchase_data['購入価格']) / purchase_data['購入価格'] * 100



purchase_data

この記事が気に入ったらサポートをしてみませんか?